HTTP 应用的信息是通过 请求报文 和 响应报文 传递的,在django中对应HttpRequest和HttpResponse对象请求报文 由客户端发送,其中包含和许多的信息,而 django(Handler(WSGIHandler))handlers.py 将这些信息封装成了 WSGIRequest (HttpRequest) 对象,该对象由 HttpRequest 类创建。每一个请求都会生成一个 HttpRequest 对象,django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 request 参数承接这个对象。
HttpResponse对象就必须我们自己创建。每个View方法必须返回一个HttpResponse对象。HttpResponse类在django.http.HttpResponse。
Quick overview
django使用request和response对象在系统里传输信息
当一个网页被请求时,django创建一个包含request元数据的HttpRequest对象,接着调用对应的view,并且把HttpRequest当做第一个参数传给view对应的方法。每个view方法必须返回一个HttpResponse对象
接下来详细介绍HttpRequest和HttpResponse对象,可以在django.http模块中找到
----------------------------------------------------------------------------------------------------------------------------------
HttpRequest对象
属性:通常认为所有的属性都应该是只读的,除非另有说明
1.HttpRequest.
scheme:request协议(通常是http或者https)
2.HttpRequest.
body:字节字符串,原始的请求数据,处理传统的二进制图片或者XML时非常有用,
3.
HttpRequest.
path:指向被请求页面的路径,不包含协议和域名,Example:
"/music/bands/the_beatles/"
4.HttpRequest.
path_info:在有些web服务的配置中,URL(host后面那部分)通常被分成 script prefix和path info两部分,path_info总是包含path info部分,建议使用
HttpRequest.
path,可以是代码更加清晰
5.HttpRequest.
method:表示Http方法的字符串,必须大写,如下:
if request.method == 'GET': do_something() elif request.method == 'POST': do_something_else()
6. HttpRequest.
encoding:用来对被提交数据解码的字符集(None代表使用默认字符集)
7.HttpRequest.
content_type:请求的MIME type,从header的
CONTENT_TYPE
中获取
8.
HttpRequest.
GET:字典对象,包含提交的HTTP GET参数
9.
HttpRequest.
POST:字典对象,请求包含表单对象时,包含提交的HTTP POST参数
10.
HttpRequest.
COOKIES:字典对象,key和value都是字符串
11.
HttpRequest.
FILES:字典对象,包含上传的文件。key对应<input type="file"name="" />标签中的name属性,value对应一个UploadedFile对象,
只有当method是POST并且form的包含属性
enctype="multipart/form-data"时,FILES才能正确提交数据,否则为空字典
12.
HttpRequest.
META:字典对象,包含HTTP headers,具体headers视client和sever而定,比如:
-
CONTENT_LENGTH
– The length of the request body (as a string). -
CONTENT_TYPE
– The MIME type of the request body. -
HTTP_ACCEPT
– Acceptable content types for the response. -
HTTP_ACCEPT_ENCODING
– Acceptable encodings for the response. -
HTTP_ACCEPT_LANGUAGE
– Acceptable languages for the response. -
HTTP_HOST
– The HTTP Host header sent by the client. -
HTTP_REFERER
– The referring page, if any. -
HTTP_USER_AGENT
– The client’s user-agent string. -
QUERY_STRING
– The query string, as a single (unparsed) string. -
REMOTE_ADDR
– The IP address of the client. -
REMOTE_HOST
– The hostname of the client. -
REMOTE_USER
– The user authenticated by the Web server, if any. -
REQUEST_METHOD
– A string such as"GET"
or"POST"
. -
SERVER_NAME
– The hostname of the server. -
SERVER_PORT
– The port of the server (as a string).
META key通常是大写引文字母和下划线,并且以HTTP_为前缀,
13.
HttpRequest.
resolver_match:ResolverMatch实例,表示已经处理完URL,只有当URL处理完时才此属性,表示在所有的view中都是可用的(不包括middleware,因为middleware在处理URL之前)
---
Attributes set by application code
django不用设置一下属性,但是如果应用程序设置好的话,将会使用它们
1.HttpRequest.
current_app:URL模板标签将会使用
2.
HttpRequest.
urlconf:本当做当前请求的root URLconf 使用
---
Attributes set by middleware
1.
HttpRequest.
session: 来自
SessionMiddleware,可读可写的字典对象,代表当前会话
2.HttpRequest.
site:来自
CurrentSiteMiddleware,Site或者RequestSeit实例,
get_current_site()返回的代表当前site
3.HttpRequest.
user:来自
AuthenticationMiddleware:
AUTH_USER_MODEL
实例,代表当前登录的用户,未登录的话,则是一耳光AnonymousUser实例,
if request.user.is_authenticated: ... # Do something for logged-in users. else: ... # Do something for anonymous users.
---
方法:
1.HttpRequest.
get_host
():
从header的HTTP_X_FORWARDED_HOST
和HTTP_HOST
中返回原始的host。如果这两个属性没有设置的话,则返回 SERVER_NAME
和SERVER_PORT
的组合
2.HttpRequest.
get_port
():
从META的HTTP_X_FORWARDED_PORT
和SERVER_PORT
中返回原始的port
3.HttpRequest.
get_full_path
():
返回path和参数串,Example: "/music/bands/the_beatles/?print=true"
4.
HttpRequest.
build_absolute_uri
(location):
返回绝对URI的location或者
request.get_full_path()(location没有的情况下)
5.
HttpRequest.
get_signed_cookie
(key, default=RAISE_ERROR, salt='', max_age=None):
返回signed cookie或者 (签名无效时)
django.core.signing.BadSignature
异常
参数salt:提供额外信息保护当遇到暴力破解时
参数
max_age:验证cookie中的时间戳是否过期
6.
HttpRequest.
is_secure
():
当使用HTTPS协议时,返回true
7.
HttpRequest.
is_ajax
():
当请求是由
XMLHttpRequest发送时,返回True,通过检查header
HTTP_X_REQUESTED_WITH的值是否为XMLHttpRequest
8.HttpRequest.
read
(size=None)
9.
HttpRequest.
readline
()
10.HttpRequest.
readlines
()
11.
HttpRequest.
__iter__
()
当遇到流类型请求时,可以使用这些接口,类似于读文件。常用在处理大型XML时,可以直接将HttpRequest当做参数传递给 XML parser,比如
ElementTree
import xml.etree.ElementTree as ET for element in ET.iterparse(request): process(element)