Django 使用Request对象和Response对象在系统间传递状态
当请求一个页面时,Django会建立一个包含请求元数据的HttpRequest对象。当Django加载对应的视图时,HttpRequest对象将作为视图函数的第一个参事。每个视图会返回一个HttpResponse对象。
HttpRequest对象
除了会话(session)属性,其他所有的属性都是只读的
1、HttpRequest.scheme
一个字符串,表示请求的方案(通常是http或https)
2、HttpRequest.body
一个字节字符串,表示原始HTTP请求的正文。它对于处理非HTML形式的数据非常有用:二进制图像、XML等。如果要处理常规的表单数据,应该使用HttpRequest.POST.
可以使用“类文件”形式的借口从HttpRequest中读取数据,如HttpRequest.read()
3、HttpRequest.path
一个字符串,表示请求的页面的完整路径,不包含域名
4、HttpRequest.method
一个字符串,表示请求使用的HTTP方法。必须使用大写。例如:
if request.method == 'GET':
do_something()
elif request.method == 'POST':
do_something_else()
5、HttpRequest.encoding
一个字符串,表示提交的数据的编码方式
6、HttpRequest.GET
一个类似于字典的对象,包含HTTPGET的所有参数。
7、HttpRequest.POST
一个类似于字典的对象,包含HTTPPOST的所有参数。
POST 请求可以带有空的POST 字典 —— 如果通过HTTP POST 方法请求一个表单但是没有包含表单数据的话。因此,不应该使用if request.POST 来检查使用的是否是POST 方法;应该使用if request.method == “POST”
8、HttpRequest.COOKIES
一个标准的Python字典,包含所有的cookies。键和值都为字符串
9、HttpRequest.META
一个标准的Python字典,包含所有的HTTP头部。具体的头部信息取决于客户端和服务端,下面是一些示例:
● CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。
● CONTENT_TYPE —— 请求的正文的MIME 类型。
● HTTP_ACCEPT —— 响应可接收的Content-Type。
● HTTP_ACCEPT_ENCODING —— 响应可接收的编码。
● HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。
● HTTP_HOST —— 客服端发送的HTTP Host 头部。
● HTTP_REFERER —— Referring 页面。
● HTTP_USER_AGENT —— 客户端的user-agent 字符串。
● QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。
● REMOTE_ADDR —— 客户端的IP 地址。
● REMOTE_HOST —— 客户端的主机名。
● REMOTE_USER —— 服务器认证后的用户。
● REQUEST_METHOD —— 一个字符串,例如”GET” 或”POST”。
● SERVER_NAME —— 服务器的主机名。
● SERVER_PORT —— 服务器的端口(是一个字符串)。
从上面可以看到,除CONTENT_LENGTH 和CONTENT_TYPE 之外,请求中的任何HTTP 头部转换为META 的键时,都会将所有字母大写并将连接符替换为下划线最后加上HTTP_ 前缀。所以,一个叫做X-Bender 的头部将转换成META 中的HTTP_X_BENDER 键。
10、HttpRequest.session
一个既可读又可写的类似于字典的对象,表示当前的会话。
HttpResponse对象
相对于Django自动创建的HttpRequest对象,HttpResponse对象由程序员创建,每个视图负责初始化实例,填充并返回一个HttpResponse.
属性:
1、HttpResponse.content
一个用来代替content的字节字符串。
2、HttpResponse.charset
一个字符串,用来表示response将会被编码的字符集。
3、HttpResponse.status_code
响应(response)的HTTP响应状态码
方法:
1、HttpResponse.set_cookie(key,value=”,max_age=None,expire=None,)
● max_age以秒为单位
● expires 应该是一个 UTC “Wdy, DD-Mon-YY HH:MM:SS GMT” 格式的字符串,或者一个datetime.datetime 对象。如果expires 是一个datetime 对象,则max_age 会通过计算得到。
2、HttpResponse.delete_cookie(key,…)
删除指定key的Cookie
HttpResponse的子类
● class HttpResponseRedirect
构造函数的第一个参数是必要的 — 用来重定向的地址。这些能够是完全特定的URL地址(比如,’http://www.yahoo.com/search/‘),或者是一个不包含域名的绝对路径地址(例如, ‘/search/’)。关于构造函数的其他参数,可以参见 HttpResponse。注意!这个响应会返回一个302的HTTP状态码。
● class HttpResponsePermanentRedirect
与HttpResponseRedirect一样,但是它会返回一个永久的重定向(HTTP状态码301)而不是一个“found”重定向(状态码302)。
● class HttpResponseNotModified
构造函数不会有任何的参数,并且不应该向这个响应(response)中加入内容(content)。使用此选项可指定自用户上次请求(状态代码304)以来尚未修改页面。
● class HttpResponseBadRequest
与HttpResponse的行为类似,但是使用了一个400的状态码。
● class HttpResponseNotFound
与HttpResponse的行为类似,但是使用的404状态码。
● class HttpResponseForbidden
与HttpResponse类似,但使用403状态代码。
● class HttpResponseNotAllowed
与HttpResponse类似,但使用405状态码。构造函数的第一个参数是必须的:一个允许使用的方法构成的列表(例如,[‘GET’, ‘POST’])。
● class HttpResponseGone
与HttpResponse类似,但使用410状态码。
● class HttpResponseServerError
与HttpResponse类似,但使用500状态代码。
注意
如果HttpResponse的自定义子类实现了render方法,Django会将其视为模拟SimpleTemplateResponse,且render方法必须自己返回一个有效的响应对象。