Django请求的生命周期是怎样的?
简单地说,通过URL对应关系匹配 ->找到对应的函数(或者类)->返回字符串(或者读取Html之后返回渲染的字符串)
解剖起来如下:
1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端,请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post,体现在url之中.
2. url经过Django中的wsgi,再经过Django的中间件,最后url到过路由映射表,在路由中一条一条进行匹配,,一旦其中一条匹配成功就执行对应的视图函数,后面的路由就不再继续匹配了.
3. 视图函数根据客户端的请求查询相应的数据.返回给Django,然后Django把客户端想要的数据做为一个字符串返回给客户端.
4. 客户端浏览器接收到返回的数据,经过渲染后显示给用户.


1. 路由系统
因为它是纯粹的Python 代码,它可以动态构造。
URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表;以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码
urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] 参数说明: 一个正则表达式字符串 一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串 可选的要传递给视图函数的默认参数(字典形式) 一个可选的name参数 from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003),#1、单一路由对应 url(r'^articles/([0-9]{4})/$', views.year_archive),#2、基于正则的路由 url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}),#3、添加额外的参数 url(r'^index/(\d*)', views.index, name='h2'),#4、为路由映射设置名称
设置名称之后,可以在不同的地方调用,如:
from django.conf.urls import url from . import views urlpatterns = [ #... url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'), #... ]
模板中使用生成URL
<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a> <ul> {% for yearvar in year_list %} <li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li> {% endfor %} </ul>
函数中使用生成URL
from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect def redirect_to_year(request): # ... year = 2006 # ... return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))
Model中使用获取URL 自定义get_absolute_url() 方法
2. views函数
http请求中产生两个核心对象:
http请求:HttpRequest对象
http响应:HttpResponse对象
2.1 HttpRequest对象的属性和方法:
path:个字符串,表示请求的页面的完整路径,不包含域名。
例如:"/music/bands/the_beatles/"
HttpRequest.path_info
在某些Web 服务器配置下,主机名后的URL 部分被分成脚本前缀部分和路径信息部分。path_info 属性将始终包含路径信息部分,不论使用的Web 服务器是什么。使用它代替path 可以让代码在测试和开发环境中更容易地切换。
例如,如果应用的WSGIScriptAlias 设置为"/minfo",那么当path 是"/minfo/music/bands/the_beatles/" 时path_info 将是"/music/bands/the_beatles/"。
method:请求中使用的HTTP方法的字符串表示。全大写表示。
GET:包含所有HTTPGET参数的类字典对象
POST:包含所有HTTPPOST参数的类字典对象
例如
ifreq.method=="GET":
do_something()
elseif req.method=="POST":
do_something_else()
服务器收到空的POST请求的情况也是可能发生的,也就是说,表单form通过HTTPPOST方法提交请求,但是表单中可能没有数据,因此不能使用ifreq.POST来判断是否使用了HTTPPOST方法;应该使用ifreq.method=="POST"
COOKIES:包含所有cookies的标准Python字典对象;keys和values都是字符串。
FILES:包含所有上传文件的类字典对象;FILES中的每一个Key都是<inputtype="file"name=""/>标签中
name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:
filename:上传文件名,用字符串表示
content_type:上传文件的ContentType
content:上传文件的原始内容
user:是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前
没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你
可以通过user的is_authenticated()方法来辨别用户是否登陆:
ifreq.user.is_authenticated();只有激活Django中的AuthenticationMiddleware
时该属性才可用
session:唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。
HttpRequest.META
1 HttpRequest.META 2 一个标准的Python 字典,包含所有的HTTP 头部。具体的头部信息取决于客户端和服务器,下面是一些示例: 3 4 CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。 5 CONTENT_TYPE —— 请求的正文的MIME 类型。 6 HTTP_ACCEPT —— 响应可接收的Content-Type。 7 HTTP_ACCEPT_ENCODING —— 响应可接收的编码。 8 HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。 9 HTTP_HOST —— 客服端发送的HTTP Host 头部。 10 HTTP_REFERER —— Referring 页面。 11 HTTP_USER_AGENT —— 客户端的user-agent 字符串。 12 QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。 13 REMOTE_ADDR —— 客户端的IP 地址。 14 REMOTE_HOST —— 客户端的主机名。 15 REMOTE_USER —— 服务器认证后的用户。 16 REQUEST_METHOD —— 一个字符串,例如"GET" 或"POST"。 17 SERVER_NAME —— 服务器的主机名。 18 SERVER_PORT —— 服务器的端口(是一个字符串)。