tornado + Django + nginx + MySQL搭建网站
一、系统环境
tornado版本:4.5.1
Django版本:2.0
nignx版本:1.12.2
python版本:3.6.1
MySQL版本:5.7
二、使用Django创建工程
注意:我的项目名用helloword代替,APP名用helloWeb代替,通过访问MySQL数据库实现一个登陆的功能
1、新建一个Django项目
- django-admin.py startproject project_name
django-admin.py startproject project_name在Windows上执行这句代码可能会报错,如果报错,执行下面这句代码就OK了
- django-admin startproject project_name
django-admin startproject project_name执行完之后,在相应的目录下会出现一个project_name的文件夹,里面有一些配置文件。
2、新建一个APP,因为在Django中的APP有点类似一个独立的项目
用cmd进入到项目目录中(cd project_name),项目中会有一个manage.py的文件,执行下面的代码
- python manage.py startapp app_name
python manage.py startapp app_name3、建立模型(将数据库中的表与python中的类对应)
打开app_name目录,找到models.py打开,添加下面的代码
- from django.db import models
- # Create your models here.
- class User(models.Model):
- #设置主键,如果不设置主键,Django会给你设置一个
- #AutoField会自动增加,primary_key为ture表示为主键
- user_id = models.AutoField(max_length=9,primary_key=True)
- #设置用户名
- #unique为True表示唯一,blank为False表示不为空
- user_name = models.CharField(max_length=12,unique=True,blank=False)
- #设置密码
- user_password = models.CharField(max_length=20,blank=False)
- def __unicode__(self):
- return self.user_id
from django.db import models
# Create your models here.
class User(models.Model):
#设置主键,如果不设置主键,Django会给你设置一个
#AutoField会自动增加,primary_key为ture表示为主键
user_id = models.AutoField(max_length=9,primary_key=True)
#设置用户名
#unique为True表示唯一,blank为False表示不为空
user_name = models.CharField(max_length=12,unique=True,blank=False)
#设置密码
user_password = models.CharField(max_length=20,blank=False)
def __unicode__(self):
return self.user_id
4、更改helloword下面的settings.py文件,找到里面的database,改成下面一样
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.mysql',
- 'NAME': "test",
- 'USER': 'root',
- 'PASSWORD': 'root',
- 'HOST': '127.0.0.1',
- 'PORT': '3306',
- }
- }
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "test",
'USER': 'root',
'PASSWORD': 'root',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
找到installed_apps,添加你的app名称,如下
- INSTALLED_APPS = [
- 'django.contrib.admin',
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.messages',
- 'django.contrib.staticfiles',
- 'helloWeb',
- ]
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'helloWeb',
]
5、在数据库中创建表,通过下面的命令实现自动创建
注意:在执行下面的命令之前需要先在数据库中建好,test数据库,不然会报错,如下图
a、输入以下命令创建更改的文件
- python manage.py makemigrations
python manage.py makemigrations如果报错,did you install mysqlclient?如下图
输入下面的命令来解决这个问题
- pip install mysqlclient
pip install mysqlclientb、将生成的py文件应用到数据库中
- python manage.py migrate
python manage.py migrate执行完成之后,如果你看到下面的界面就是说明表创建成功了
4、在数据库中添加用户名和密码(这里是明文的就不加密了),我添加了一个用户名为123密码为456的用户,方便后面登录使用
三、将tornado与Django整合
1、在settings.py的同级目录下新建一个server.py,内容如下
- import sys
- import os
- from tornado.options import options, define, parse_command_line
- from multiprocessing import Pool
- import tornado.httpserver
- import tornado.ioloop
- import tornado.web
- import tornado.wsgi
- from django.core.wsgi import get_wsgi_application
- define('port', type=int, default=8000)
- class HelloHandler(tornado.web.RequestHandler):
- def get(self):
- self.write('Hello from tornado:%s'%os.getpid())
- def run(port):
- os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
- parse_command_line()
- wsgi_app = get_wsgi_application()
- container = tornado.wsgi.WSGIContainer(wsgi_app)
- tornado_app = tornado.web.Application(
- [
- ('/', HelloHandler),
- ('.*', tornado.web.FallbackHandler, dict(fallback=container)),
- ])
- server = tornado.httpserver.HTTPServer(tornado_app)
- server.listen(port)
- tornado.ioloop.IOLoop.instance().start()
- if __name__ == '__main__':
- pool = Pool(4)
- pool.map(run,[8000,8001,8002,8003])
import sys
import os
from tornado.options import options, define, parse_command_line
from multiprocessing import Pool
import tornado.httpserver
import tornado.ioloop
import tornado.web
import tornado.wsgi
from django.core.wsgi import get_wsgi_application
define('port', type=int, default=8000)
class HelloHandler(tornado.web.RequestHandler):
def get(self):
self.write('Hello from tornado:%s'%os.getpid())
def run(port):
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
parse_command_line()
wsgi_app = get_wsgi_application()
container = tornado.wsgi.WSGIContainer(wsgi_app)
tornado_app = tornado.web.Application(
[
('/', HelloHandler),
('.*', tornado.web.FallbackHandler, dict(fallback=container)),
])
server = tornado.httpserver.HTTPServer(tornado_app)
server.listen(port)
tornado.ioloop.IOLoop.instance().start()
if __name__ == '__main__':
pool = Pool(4)
pool.map(run,[8000,8001,8002,8003])
2、修改nginx.conf文件,注意root的路径,根据你的APP目录进行修改,路径不能有空格,最好全为英文,不然可能无法启动nginx,修改好之后,点击nignx.exe运行即可,因为文件过大我就不贴了,下一篇文章中,我会将git的地址和一些问题进行详细描述。3、在urls.py中定义你的路由路径,在views.py中定义你的数据库操作。
- <span style="font-size:18px;">#urls.py
- from django.contrib import admin
- from django.urls import path
- from django.conf.urls import url
- from helloWeb import views
- urlpatterns = [
- path('admin/', admin.site.urls),
- url(r'^login/',views.login),
- url(r'^main/',views.login),
- ]</span>
#urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from helloWeb import views
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^login/',views.login),
url(r'^main/',views.login),
]
views.py
- import json
- from django.shortcuts import render
- from helloWeb.models import User
- from django.http import HttpResponse
- # Create your views here.
- #跳转到登录界面
- def index(request):
- return render(request,'login.html')
- #验证用户的用户名和密码是否正确
- def login(request):
- #判断是属于什么请求
- if request.method == "POST":
- username = request.POST['username']
- password = request.POST['password']
- result = {}
- try:
- #判断用户名和密码是否正确
- user = User.objects.get(username=username)
- if password == user.user_password:
- result = 1
- else:
- result = 0
- except:
- # 用户不存在
- result = -1
- result = json.dumps(result)
- #返回信息给页面
- return HttpResponse(result)
import json
from django.shortcuts import render
from helloWeb.models import User
from django.http import HttpResponse
# Create your views here.
#跳转到登录界面
def index(request):
return render(request,'login.html')
#验证用户的用户名和密码是否正确
def login(request):
#判断是属于什么请求
if request.method == "POST":
username = request.POST['username']
password = request.POST['password']
result = {}
try:
#判断用户名和密码是否正确
user = User.objects.get(username=username)
if password == user.user_password:
result = 1
else:
result = 0
except:
# 用户不存在
result = -1
result = json.dumps(result)
#返回信息给页面
return HttpResponse(result)
4、最后,我使用了一个bootstrap的模板,然后在app目录下的static和templates中添加HTML文件以及css和js文件,如果没有这两个目录自己新建一个就好了。在引用css和js文件的时候需要注意,不是通过绝对路径引用,而是通过先加载static,然后再加载路径,如下是一个HTML文件。
- {% load static %}
{% load static %}
- <link rel="stylesheet" href="{%static 'css/style.default.css'%}" type="text/css" />
<link rel="stylesheet" href="{%static 'css/style.default.css'%}" type="text/css" />
四、验证结果
1、运行nignx.exe
2、运行server.py
3、打开浏览器,输入127.0.0.1,多次刷新可以看到不同的PID表示nginx已经生效了。
4、然后通过访问127.0.0.1/login/可以跳转到登录界面
5、用户和密码输入正确之后就可以跳转到主界面了(PS:这里我没有做验证登录的状态,直接输入127.0.0.1/main/也可以访问主界面,真实项目如果输入127.0.0.1/main/如果没有登录应该跳转到登录界面)
五、效果展示
1、登录界面
2、主界面

浙公网安备 33010602011771号