django源代码解析
一、wsgi: webserver与app之间的交互标准
1、输入env,
2、callback(status header),
3、返回数组形式的body
def app(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
yield "Hello world!\n"
二、主流程的处理
1、所有的Application统一是 django/core/handlers/wsgi.py WSGIHandler
2、WSGIHandler内部会将整个的处理分为几个阶段
1》load_middleware(初始化时进行一次)
request_middleware
self._view_middleware = []
# 后3个是从后往前
self._template_response_middleware = []
self._response_middleware = []
self._exception_middleware = []
2》触发回调 signals.request_started.send(sender=self.__class__, environ=environ)
实际只有db部分会断开后再连接
3》构造WSGIRequest
4》get_response ----- 主流程
1、依次回调process_request,有返回值就中断,否则执行下一个
2、根据url找到view
3、依次调用process_view
4、具体回调, -----必须要返回response
5、如果有render,则应用 process_template_response(使用模板前,可以修改模板相关逻辑)
6、使用process_response ---- 生成response后
7、在这个过程中有异常时,触发process_exception
简单说:process_request parseUrl process_view callback process_template_response render process_response
3、db connection怎么保活? 直接不保活
django.db.backends.base.base.py BaseDatabaseWrapper get_new_connection
django.db.models.sql.compiler.py execute_sql
默认是每个request新开一个数据库connection,之后close(无状态)。如果要维护的话,注意设置connection的状态和数量限制
三、典型app的目录结构
manager.py -- 指定setting文件
project
settings
urls
wsgi
tests
app
models
views
urls
apps
admin
static
template