几个概念
WSGI: 只是一种通信协议,WSGI协议主要包括server和application两部分,WSGI server负责从客户端接收请求,将request转发给application,将application返回的response返回给客户端;WSGI application接收由server转发的request,处理请求,并将处理结果返回给server。
要实现WSGI协议,必须同时实现web server和web application,当前实现了WSGI application协议的web框架有Django,Flask。虽然Django,Flask框架都有自己实现的简单的WSGI server,生产环境下建议用其他WSGI server。比如 uWSGI和 Gunicorn都是实现了WSGI server协议的服务器。
uswgi: 与WSGI一样是一种通信协议,是uWSGI服务器的独占协议。与WSGI协议是两种东西。
uWSGI:是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等。
ASGI:WSGI是基于HTTP协议模式,不支持WebSocket,而ASGI的出现是为了解决Python常用的WSGI不支持当前Web开发中的一些新的协议标准。ASGI是对WSGI原有模式的支持和WebSocket的扩展,即ASGI为WSGI的超集,ASGI是兼容WSGI。
WebSocket:WebSocket是一种在单个TCP连接上进行全双工通讯的协议。WebSocket允许服务端主动向客户端推送数据。在WebSocket协议中,客户端浏览器和服务器只需要完成一次握手就可以创建持久性的连接,并在浏览器和服务器之间进行双向的数据传输。
Channels:Django本身不支持WebSocket,但可以通过集成Channels框架来实现WebSocket,Channels是Django团队研发的一个给Django提供websocket支持的框架,它同时支持http和websocket多种协议。使用channels可以让Django应用拥有实时通讯和给用户主动推送信息的功能。
安装虚拟环境
mkvirtualenv -p /usr/local/bin/python3 website
安装channel
workon website
pip install Django==2.2 -i https://pypi.douban.com/simple/
pip install channels==3.0.4 -i https://pypi.douban.com/simple/
pip install channels-redis==2.4.2 -i https://pypi.douban.com/simple/
新建Django项目
(website) backend % django-admin startproject website
新建应用
(website) website % python manage.py startapp catlog
打开项目并设置虚拟环境
编辑 website/settings.py文件
# Application definition
INSTALLED_APPS = [
...
# 注册应用
'catlog.apps.CatlogConfig',
'channels',
]
# 在文件尾部新增如下配置
# 指定ASGI的路由地址
ASGI_APPLICATION = 'website.routing.application'
# 配置django-channels配置
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
REDIS_PASSWORD = 'password'
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
"hosts": ["redis://:%s@%s:%d/0" % (REDIS_PASSWORD, REDIS_HOST, REDIS_PORT)],
"symmetric_encryption_keys": [SECRET_KEY],
}