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 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)