# 了解CGI
CGI(通用网关接口, Common Gateway Interface/CGI),定义客户端与Web服务器的交流方式的一个程序。
# 什么是WSGI
PythonWeb服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是Python应用程序或框架和Web服务器之间的一种接口,已经被广泛接受, 它已基本达成它的可移植性方面的目标。
WSGI 没有官方的实现, 因为WSGI更像一个协议. 只要遵照这些协议,WSGI应用(Application)都可以在任何服务器(Server)上运行, 反之亦然。
WSGI标准在 PEP 333中定义并被许多框架实现,django框架支持WSGI(3.0以上版本也支持)接口协议。
# 什么是ASGI
ASGI(异步网关协议接口,Asynchronous Server Gateway Interface)一个介于网络协议服务和Python应用之间的标准接口,能够处理多种通用的协议类型。
WSGI是基于HTTP协议模式的,不支持WebSocket,而ASGI的诞生则是为了解决Python常用的WSGI不支持当前Web开发中的一些新的协议标准。同时,ASGI对于WSGI原有的模式的支持和WebSocket的扩展,即ASGI是WSGI的扩展
Django3.0以后支持ASGI了, 在21年3月份我做本练习的时候,Django的版本为3.1.7. 3.2Bata版也已经发布, 安装Django的惯例,3.2版本应该就是长期支持版, 即时,在Django上编写异步代码的人也会越来越多.
# 异步视图的HelloDjangoWorld:
from django.http import HttpResponse async def index(request): return HttpResponse("Hello, async Django!")
# 我将在在windows和linux下分别尝试一下用ASGI部署生产环境,本随笔记录一下windows环境下安装和配置过程.
1. 下载nginx, 最新的stable版本是1.18.0, 链接http://nginx.org/download/nginx-1.18.0.zip
2.无需安装,绿色版,解压缩到一个文件夹下,等一下进行配置.
3. 使用Django内置开发测试服务器,项目可以启动,但实际上它不会真正异步运行,按照Django官方手册,我们需要用Uvicorn来启动项目。手册链接 https://docs.djangoproject.com/en/3.1/howto/deployment/asgi/uvicorn/
(env)$python -m pip install uvicorn gunicorn
创建一个Django项目,用uvicorn启动项目:
(env)$ django-admin.py startproject hello_async
(env)$ gunicorn hello_async.asgi:application -k uvicorn.workers.UvicornWorker #Django官方手册的方法
报错了:
Traceback (most recent call last):
File "D:PythonPython39lib
unpy.py", line 197, in _run_module_as_main
return _run_code(code, main_globals, None,
File "D:PythonPython39lib
unpy.py", line 87, in _run_code
exec(code, run_globals)
File "E:PycharmProjectsdjango-async-viewsenvScriptsgunicorn.exe\__main__.py", line 4, in <module>
File "e:pycharmprojectsdjango-async-viewsenvlibsite-packagesgunicornappwsgiapp.py", line 9, in <module>
from gunicorn.app.base import Application
File "e:pycharmprojectsdjango-async-viewsenvlibsite-packagesgunicornappase.py", line 11, in <module>
from gunicorn import util
File "e:pycharmprojectsdjango-async-viewsenvlibsite-packagesgunicornutil.py", line 9, in <module>
import fcntl
ModuleNotFoundError: No module named 'fcntl'
提示缺少模块 "fcnt1", 那尝试安装一下
python -m pip install fcntl
报错
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
ERROR: Could not find a version that satisfies the requirement fcnt1
ERROR: No matching distribution found for fcntl
尝试不使用gunicorn 管理uvicorn.
uvicorn hello_async.asgi:application
显示:
[32mINFO[0m: Started server process [[36m13780[0m] [32mINFO[0m: Waiting for application startup. [32mINFO[0m: ASGI 'lifespan' protocol appears unsupported. [32mINFO[0m: Application startup complete. [32mINFO[0m: Uvicorn running on [1mhttp://127.0.0.1:8000[0m (Press CTRL+C to quit)
成功运行,也能用浏览器访问到.
阅读uvicorn手册,链接 https://www.uvicorn.org/deployment/ ,发现这句
The following will start Gunicorn with four worker processes: gunicorn -w 4 -k uvicorn.workers.UvicornWorker The UvicornWorker implementation uses the uvloop and httptools implementations.uvicorn.
workers.UvicornWorker方法,需要调用uvloop, 我尝试安装uvloop
python -m pip install uvloop Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting uvloop Using cached https://pypi.tuna.tsinghua.edu.cn/packages/44/6e/0cb292e4e6ee1382e2ede458f90c94b4f990b261f738403ac45cb8183bc2/uvloop-0.15.2.tar.gz (2.1 MB) ERROR: Command errored out with exit status 1: command: 'E:PycharmProjectsdjango-async-viewsenvScriptspython.exe' -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\Users\imxin\AppData\Local\Temp\pip-install-oe6i3vdn\uvloop_633952133c054cf196bcdebbf2688263\setup.py'"'"'; __file__='"'"'C:\Users\imxin\AppData\Local\Temp\pip-install-oe6i3vdn\uvloop_633952133c054cf196bcdebbf2688263\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"' '"'"', '"'"' '"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base 'C:UsersimxinAppDataLocalTemppip-pip-egg-info-dxbd5o6z' cwd: C:UsersimxinAppDataLocalTemppip-install-oe6i3vdnuvloop_633952133c054cf196bcdebbf2688263 Complete output (5 lines): Traceback (most recent call last): File "<string>", line 1, in <module> File "C:UsersimxinAppDataLocalTemppip-install-oe6i3vdnuvloop_633952133c054cf196bcdebbf2688263setup.py", line 8, in <module> raise RuntimeError('uvloop does not support Windows at the moment') RuntimeError: uvloop does not support Windows at the moment # 不支持windows
:这跟找不到fcntl模块虽说完全没关系, 看来按照官方的方法, 既然workers.UvicornWorker需要调用uvloop, 但uvloop又不支持windows, 目前是不可能部署到windows server的, 我个人认为兄弟们暂时不用尝试填坑了.
心得总结:
在windows下尝试使用ASGI部署django3.1,部署失败一半,为什么说失败一半呢?因为按照官方文档, Gunicorn是在生产环境中运行和管理Uvicorn的最简单方法, 但是比如用 gunicorn -w 4 -k uvicorn.workers.UvicornWorker 以四个工作进程启动Gunicorn的时候,
UvicornWorker的
实现使用uvloop
和httptools, uvloop模块并不支持windows. 如果不用Gunicorn, 仅仅使用uvicorn是成功的,但这与生产环境的要求就不符了.