plication的调用。Nginx上一般是用proxy的方式,用Nginx的协议将请求封装好,发送给应用服务器,比如uWSGI,uWSGI会实现WSGI的服务端、进程管理以及对application的调用。
uWSGI与Gunicorn的比较,由链接可知:
WSGI除了server和application两个角色外,还有middleware中间件,middleware运行在server和application中间,同时具备server和application的角色,对于server来说,它是一个application,对于application来说,它是一个server:
可以看出,Latinator调用foo_app充当server角色,然后实例被run_with_cgi调用充当application角色。
- uwsgi:与WSGI一样是一种通信协议,是uWSGI服务器的独占协议,据说该协议是fastcgi协议的10倍快。
- uWSGI:是一个web server,实现了WSGI协议、uwsgi协议、http协议等。
每个Django项目中都有个wsgi.py文件,作为application是这样实现的:
源码:
WSGIHandler:
application是一个定义了__call__方法的WSGIHandler类实例,首先加载中间件,然后根据environ生成请求request,根据请求生成响应response,status和response_headers由start_response处理,然后返回响应body。
Django也自带了WSGI server,当然性能不够好,一般用于测试用途,运行runserver命令时,Django可以起一个本地WSGI server,django/core/servers/basehttp.py文件:
实现的WSGIServer,继承自wsgiref: