当用户在浏览器上输入URL到用户看到网页的这个时间段内,Django后台所发生的事情。
直白的来说就是当请求来的时候和请求走的阶段中,Django的执行轨迹。
一个完整的Django生命周期:
浏览器向django服务器发起请求
路由系统(url.py)
- 通过正则匹配url
- 交由视图系统(views.py),调用对应的方法处理数据
中间件
- 全局生效(所有方法均需要先由中间件处理)
视图系统(views.py)
- 是否需要根据post get请求, 区分处理方式
- 处理数据
- 返回结果
templates
- 直接返回页面
- 数据处理后返回页面
层层返回给浏览器
简单的说就是:django的生命周期是:前端请求—>nginx—>uwsgi.—>中间件—>url路由---->view视图—>orm---->拿到数据返回给view---->视图将数据渲染到模版中拿到字符串---->中间件—>uwsgi---->nginx---->前端渲染。
接着,我们将逐一对这四个阶段进行详细讲解。
当 WSGI 服务器启动 Django 应用程序时,将调用 Django 的自带 WSGI 应用程序处理器将应用程序加载到内存中,并在内存设定一些全局变量,如 settings,middleware 等。这些全局变量可以由 Django 应用程序和应用程序的中间件共同使用。
其中,settings 是 Django 应用程序中最重要的全局变量。它包含了除了 URL 路由跳转之外的所有应用程序配置信息,例如本地数据库 URL,模板引擎设置,调试开关等。middleware 则是一个提供额外功能的组件,可以对视图函数的请求和响应进行扩展。
以下是 WSGI 应用的初始化的代码段:
def get_wsgi_application():
django.setup(set_prefix=False)
return WSGIHandler()
get_wsgi_application() 函数用于实例化一个 WSGI 应用程序对象,并返回 WSGI 请求处理器对象。Django 在这里进行重要的初始化操作。
一旦 WSGI 应用程序在内存中设置好了,它将自动提供视图,即 URL 映射到相应的处理程序。在 Django 中,URLs 通过一个名为 urls.py 的文件进行定义和管理。当一个客户端请求到达 Django 时,它将映射到 urlpatterns 变量中的可调用视图函数上。
以下是一个 URL 映射器的示例:
from django.urls import path
from . import views
urlpatterns = [
path('about/', views.about),
path('contact/', views.contact),
]
在这里,URL “/about/” 和 “/contact/” 路径将使用 views.about 和 views.contact 函数来处理请求。
在匹配 URL 时,Django 会按顺序依次尝试匹配每个 URL 规则,并使用第一个匹配的 URL 规则。如果没有规则匹配请求的 URL 路径,则 Django 允许你定义一个捕获所有情况的通配符 URL 规则,即使用 path() 函数的 ‘path:’ 参数。
urlpatterns = [
path('about/', views.about),
path('contact/', views.contact),
path('/' , views.page_not_found),
]
在这个示例中,Django 将试图匹配 “/about/” 和 “/contact/”,但无论它们能否成功匹配,最终都会跳转到 views.page_not_found 函数上。
如果 Django 能够正确地将请求 URL 映射到一个视图函数上,则该视图函数将被执行。视图函数是 Django MVC 模型中的控制器,它处理请求并返回响应。
以下是一个视图函数的示例:
from django.shortcuts import render
def index(request):
return render(request, 'index.html')
在这个示例中,index 视图函数将会渲染 index.html 模板,并将结果用 HTTP 响应的形式返回给客户端。
Django 将请求对象作为视图函数的第一个参数传递,并在对象中提供了用于访问请求数据和其他属性的方法和属性。视图函数还可以访问请求参数和其他内置对象(如 settings 和 middleware)。
当视图函数处理请求,并生成响应后,Django 将响应发送回客户端(通常是浏览器)。响应的内容都可以是可选的,Django 可以生成基于文本(HTML,JSON,XML 等)的响应,或者基于非文本(例如使用文件响应)的响应。
Django 提供了一组给用户访问的响应对象,并允许定制 HTTP 响应头。默认情况下,Django 使用 HttpResponse。HttpResponse 接受以下两类参数: