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项目

 

  1. django-admin.py startproject project_name  
django-admin.py startproject project_name
在Windows上执行这句代码可能会报错,如果报错,执行下面这句代码就OK了
  1. django-admin startproject project_name  
django-admin startproject project_name
执行完之后,在相应的目录下会出现一个project_name的文件夹,里面有一些配置文件。
2、新建一个APP,因为在Django中的APP有点类似一个独立的项目

 

用cmd进入到项目目录中(cd project_name),项目中会有一个manage.py的文件,执行下面的代码

 

  1. python manage.py startapp app_name  
python manage.py startapp app_name
3、建立模型(将数据库中的表与python中的类对应)

 

打开app_name目录,找到models.py打开,添加下面的代码

 

  1. from django.db import models  
  2.   
  3. # Create your models here.  
  4. class User(models.Model):  
  5.     #设置主键,如果不设置主键,Django会给你设置一个  
  6.     #AutoField会自动增加,primary_key为ture表示为主键  
  7.     user_id = models.AutoField(max_length=9,primary_key=True)  
  8.     #设置用户名  
  9.     #unique为True表示唯一,blank为False表示不为空  
  10.     user_name = models.CharField(max_length=12,unique=True,blank=False)  
  11.     #设置密码  
  12.     user_password = models.CharField(max_length=20,blank=False)  
  13.     def __unicode__(self):  
  14.         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,改成下面一样

 

  1. DATABASES = {  
  2.     'default': {  
  3.         'ENGINE''django.db.backends.mysql',  
  4.         'NAME'"test",  
  5.         'USER''root',  
  6.         'PASSWORD''root',  
  7.         'HOST''127.0.0.1',  
  8.         'PORT''3306',  
  9.     }  
  10. }  
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': "test",
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

 

找到installed_apps,添加你的app名称,如下

 

  1. INSTALLED_APPS = [  
  2.     'django.contrib.admin',  
  3.     'django.contrib.auth',  
  4.     'django.contrib.contenttypes',  
  5.     'django.contrib.sessions',  
  6.     'django.contrib.messages',  
  7.     'django.contrib.staticfiles',  
  8.     'helloWeb',  
  9. ]  
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'helloWeb',
]

 

5、在数据库中创建表,通过下面的命令实现自动创建

注意:在执行下面的命令之前需要先在数据库中建好,test数据库,不然会报错,如下图


a、输入以下命令创建更改的文件

 

  1. python manage.py makemigrations  
python manage.py makemigrations
如果报错,did you install mysqlclient?如下图

输入下面的命令来解决这个问题

 

 

  1. pip install mysqlclient  
pip install mysqlclient
b、将生成的py文件应用到数据库中

 

 

  1. python manage.py migrate  
python manage.py migrate
执行完成之后,如果你看到下面的界面就是说明表创建成功了

 


4、在数据库中添加用户名和密码(这里是明文的就不加密了),我添加了一个用户名为123密码为456的用户,方便后面登录使用

三、将tornado与Django整合

1、在settings.py的同级目录下新建一个server.py,内容如下

 

  1. import sys  
  2. import os  
  3. from tornado.options import options, define, parse_command_line  
  4. from multiprocessing import Pool  
  5. import tornado.httpserver  
  6. import tornado.ioloop  
  7. import tornado.web  
  8. import tornado.wsgi  
  9. from django.core.wsgi import get_wsgi_application  
  10. define('port', type=int, default=8000)  
  11. class HelloHandler(tornado.web.RequestHandler):  
  12.     def get(self):  
  13.         self.write('Hello from tornado:%s'%os.getpid())  
  14. def run(port):  
  15.     os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'  
  16.     parse_command_line()  
  17.     wsgi_app = get_wsgi_application()  
  18.     container = tornado.wsgi.WSGIContainer(wsgi_app)  
  19.   
  20.     tornado_app = tornado.web.Application(  
  21.         [  
  22.             ('/', HelloHandler),  
  23.             ('.*', tornado.web.FallbackHandler, dict(fallback=container)),  
  24.         ])  
  25.   
  26.     server = tornado.httpserver.HTTPServer(tornado_app)  
  27.     server.listen(port)  
  28.   
  29.     tornado.ioloop.IOLoop.instance().start()  
  30.   
  31. if __name__ == '__main__':  
  32.     pool = Pool(4)  
  33.     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中定义你的数据库操作。

 

 

  1. <span style="font-size:18px;">#urls.py  
  2. from django.contrib import admin  
  3. from django.urls import path  
  4. from django.conf.urls import url  
  5. from helloWeb import views  
  6.   
  7. urlpatterns = [  
  8.     path('admin/', admin.site.urls),  
  9.     url(r'^login/',views.login),  
  10.     url(r'^main/',views.login),  
  11. ]</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

 

 

  1. import json  
  2. from django.shortcuts import render  
  3. from helloWeb.models import User  
  4. from django.http import HttpResponse  
  5.   
  6.   
  7. # Create your views here.  
  8. #跳转到登录界面  
  9. def index(request):  
  10.     return render(request,'login.html')  
  11.   
  12. #验证用户的用户名和密码是否正确  
  13. def login(request):  
  14.     #判断是属于什么请求  
  15.     if request.method == "POST":  
  16.         username = request.POST['username']  
  17.         password = request.POST['password']  
  18.         result = {}  
  19.         try:  
  20.             #判断用户名和密码是否正确  
  21.             user = User.objects.get(username=username)  
  22.             if password == user.user_password:  
  23.                 result = 1  
  24.             else:  
  25.                 result = 0  
  26.   
  27.         except:  
  28.             # 用户不存在  
  29.             result = -1  
  30.         result = json.dumps(result)  
  31.         #返回信息给页面  
  32.         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文件。

 

 

  1. {% load static %}  
{% load static %}
  1. <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、主界面



posted @ 2018-01-25 19:40  北方客888  阅读(161)  评论(0)    收藏  举报