python中常用的几个web框架有django, tornado, flask等,今天来总结一下django和tornado的不同。工作中django和tornado都用过,使用django相对更多一些。个人感觉django虽然好用,有搭建项目快、自带ORM、自动生成路由、自带管理后台等优势;但若实际工作中选择,我还是会偏向于使用tornado框架,因为torndo使用更加灵活,并且支持websocket,tcp等通信协议,最重要的是tornado是异步非阻塞的web框架;而在django中要实现websocket、异步非阻塞等功能则需要引入dwebsocket、celery等第三方模块。
本文使用的环境是python3.6, django2.0, tornado5.1。
下面主要从以下几个方面介绍一下这两个框架的不同:
1.创建项目的方式
2.数据库连接
3.异步非阻塞请求
4.websocket的使用
1.项目创建方式
1)django
django主要是通过下面两个命令创建项目:
django-admin startproject Test # 创建项目,名称为Test
django-admin startpapp Test01 # 创建app,名称为Test01
执行完成后,会生成如下的目录结构:
D:.
│ manage.py
│ test.txt
│
├─.idea
│ │ misc.xml
│ │ modules.xml
│ │ Test.iml
│ │ workspace.xml
│ │
│ └─inspectionProfiles
│ profiles_settings.xml
│
├─Test
│ settings.py
│ urls.py
│ wsgi.py
│ __init__.py
│
└─Test01
│ admin.py
│ apps.py
│ models.py
│ tests.py
│ views.py
│ __init__.py
│
└─migrations
__init__.py
主要是manage.py,Test,Test01这几个文件和文件夹,
manage.py是管理项目的文件,通过它运行django的一些内置命令,如模型迁移、启动项目等;
Test/settings.py是配置文件,项目配置存放在这里
Test/urls.py是路由文件,负责分发http请求
Test01/models.py是模型文件,Test01下创建的模型就放在这里,模型负责将表结构映射到数据库中
Test01/views.py是视图文件,django中的视图在这里定义
Test01/migrations目录中存放迁移后生成的迁移文件。
django项目的基本结构就是这样。
2)tornado
tornado项目的创建比较灵活,没有什么项目名称和app的概念,全靠自己组织项目,就是创建一个个python文件和python package。可以像下面一样来组织tornado项目:
├── App
│ ├── __init__.py
│ ├── Shop
│ │ ├── __init__.py
│ │ └── views.py
│ └── User
│ ├── __init__.py
│ └── views.py
├── application.py
├── Config
│ ├── config_base.py
│ ├── config_db.conf
│ ├── config_db_get.py
│ ├── config_engine.py
│ ├── __init__.py
├── Models
│ ├── __init__.py
│ ├── Shop
│ │ └── __init__.py
│ └── User
│ ├── BaseClass.py
│ ├── __init__.py
│ └── UserModel.py
├── server.py
├── static
│ └── __init__.py
├── templates
│ └── __init__.py
├── test.py
└── Urls
├── __init__.py
├── Shop.py
└── User.py
这里有几个主要文件App, Config, Models, Urls, static, templates, application.py, server.py。
项目的app可以集中放在App目录中,与数据库对应的模型文件可以放在Models中,http路由可以放在Urls中,项目配置信息可以放在Config目录中,静态文件和模板分别放在static和templates中。application.py文件可以加载路由信息和项目配置信息,server.py文件负责启动项目。
项目的基本配置信息可以放在Config/config_base.py中,如下:
# coding=utf-8
import os
BASE_DIR = os.path.dirname(__file__)
# 参数
options = {
"port": 8001,
}
# 基本配置信息
settings = {
"debug": True,
"static_path": os.path.join(BASE_DIR, "static"),
"template_path": os.path.join(BASE_DIR, "templates")
}
路由信息可以放在Urls/User.py中,如下:
# coding=utf-8
from App.UserInfo import views
user_urls = [
(r'/user/', views.IndexHandler),
]
application.py中加载路由信息和配置信息ÿ