最近在做django 项目,重温动态语言的魅力
理解WSGI 接口
根据Python的惯例,Django不是一个完整的Web后端框架,它只负责开发WSGI应用程序 ,在生产环境中Django应用应当与一个WSGI服务器配套,由WSGI服务器负责网络通讯部分。
WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python语言定义的Web服务器和Web应用程序之间的一种简单而通用的接口。Gateway,也就是网关。网关的作用就是在协议之间进行转换。
它主要负责http协议的解析和组装,web服务器把解析好的所有数据发送给web应用(django),web应用决定返回哪个html页面发送给web服务器,web服务器组装好后在发送给客户端.
uWSGI Web服务器, 它与WSGI协议的关系
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
wsgi server (比如uWSGI) 要和 wsgi application(比如django )交互,uwsgi需要将过来的请求转给django 处理,那么uWSGI 和 django的交互和调用就需要一个统一的规范,这个规范就是WSGI WSGI(Web Server Gateway Interface)
uwsgi协议
uwsgi是服务器和服务端应用程序的通信协议,规定了怎么把请求转发给应用程序和返回
如何区分项目配置(生产、测试)
本地调试: 终端指定 settings
python3 manage.py runserver --settings=AIService.debug_settings
部署: Dockerfile中指定不同的wsgi.py文件来区分
CMD ["gunicorn", "-c", "gunicorn.conf.py", "AIService.debug_wsgi"]
CMD ["gunicorn", "-c", "gunicorn.conf.py", "AIService.wsgi"]
如何在Django中启动一个辅助线程工作?
answer: Try to call your init code from end of wsgi.py file. It will be executed once at start of server.
example: 启动一个mq消费线程工作
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'AIService.debug_settings')
application = get_wsgi_application()
from utils.mq import consumer
consumer()
https://stackoverflow.com/questions/14630467/starting-a-simple-python-thread-on-django-init
|