Django HttpRequest对象,当网页被请求时,Django会自动创建一个HttpRequest对象,这个对象包含了所有请求中的必要数据。每一个Django视图都会在第一个参数位置接收HttpRequest对象。
属性
除非特殊说明,所有的HttpRequest对象属性都是只读的,下面是全部HttpRequest对象属性。
- HttpRequest.scheme
表示请求所用网络协议,通常是http或者https。 -
HttpRequest.body
HTTP请求的body部分。 -
HttpRequest.path
请求资源的全路径,例如“/music/bands/the_beatles/”
。
- HttpRequest.path_info
URL中主机名后面的内容。
如http://127.0.0.1:8000/blog/
的path_info是/blog/;http://127.0.0.1:8000/blog/1/
的path_info是/blog/1/。 -
HttpRequest.method
HTTP请求所使用的方法,属性值必须是大写,如GET、POST。 -
HttpRequest.encoding
用于处理表单提交数据的编码类型。HttpRequest.encoding
是可编辑属性,当请求所提交的数据与DEFAULT_CHARSET不一致时,可以通过修改属性值的方式保证能够正确取得请求数据。 -
HttpRequest.content_type
表示MIME类型的字符串。 -
HttpRequest.content_params
表示CONTENT_TYPE头的值,格式为字典。
例如:<meta http-equiv="content-type" content="text/html;charset=utf-8">
-
HttpRequest.GET
类似字典类型的对象,包含所有HTTP GET参数。 -
HttpRequest.POST
类似字典类型的对象,包含所有HTTP POST参数,通常是表单数据。
注意POST不包含文件上传信息。
- HttpRequest.COOKIES
字典对象,用于保存所有cookie,字典的Key和Value都是字符串。 -
HttpRequest.FILES
字典对象,用于保存所有被上传的文件。字典的Key是HTML元素<input type="file" name="" />
的name,字典的值是UploadedFile对象。 -
HttpRequest.META
字典对象,包含所有HTTP头。下面是一些常用的Header:
- CONTENT_LENGTH——Request body的长度。
- CONTENT_TYPE——Request body MIME类型。
- HTTP_ACCEPT——HTTP response可以接收的文档类型。
- HTTP_ACCEPT_ENCODING——HTTP response可以接收的文档编码类型。
- HTTP_ACCEPT_LANGUAGE——HTTP response可以接收的文档语言。
- HTTP_HOST——客户端发送的HTTP Host header。
- HTTP_USER_AGENT——客户端的user-agent。
- QUERY_STRING——URL中的查询字符串,通常是“?”后面的部分。
中间件属性
一些Django的中间件也包含HttpRequest属性,如以下几种。
- HttpRequest.session
SessionMiddleware提供的用于存储当前session信息的属性,属性值是一个类似字典的对象,属性值可以被修改。 -
HttpRequest.site
CurrentSiteMiddleware提供的用于存储当前网站信息的属性。属性值是get_current_site()
方法返回的Site或者RequestSite对象。 -
HttpRequest.user
AuthenticationMiddleware提供的用于存储当前用户的属性。属性值是AUTH_USER_ MODEL的实例对象。如果当前没有用户登录的话,属性值是AnonymousUser对象。
在代码中可以使用is_authenticated判断用户是否登录:
if request.user.is_authenticated:
...
else:
...
方法
- HttpRequest.get_host()
取得HTTP_X_FORWARDED_HOST
和HTTP_HOST的值。如果这两个Header都没有值的话,get_host()方法返回SERVER_NAME + SERVER_PORT
。如127.0.0.1:8000
。 -
HttpRequest.get_port()
返回网站端口号。 -
HttpRequest.get_full_path()
返回URL主机名后面的全部信息,例如/music/bands/the_beatles/?print=true
。 -
HttpRequest.build_absolute_uri(location)
根据localtion返回绝对URI,如果没有给定location的话,默认会使用HttpRequest.get_ full_path()
替代location。
下面在Search视图中调用build_absolute_uri()方法:
print("build_absolute_uri: ", request.build_absolute_uri('5'))
print("build_absolute_uri: ", request.build_absolute_uri())
输出结果:
build_absolute_uri: http://localhost:8000/blog/1/5
build_absolute_uri: http://localhost:8000/blog/1/
Search视图的原始URL是:http://localhost:8000/blog/1/
。
- HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt=”, max_age=None)
返回一个已签名的cookie的值,如果签名已失效则抛出异常。
如果调用方法时指定了default的值,那么默认的异常信息将会被default值替代。
调用方法时给出了salt值,可以有效地防止网站暴力破解攻击。例如:
request.get_signed_cookie('name', salt='name-salt')
- HttpRequest.is_secure()
如果网站启用了HTTPS协议,is_secure()方法返回True,否则返回False。 -
HttpRequest.is_ajax()
如果请求是通过XMLHttpRequest对象发送的,is_ajax()方法返回True,否则返回False。
QueryDict对象
前面多次提到“类似字典的对象”,其实这就是一个QueryDict对象。QueryDict与普通字典对象最大的区别就是,QueryDict对象允许一个Key对应多个Value。
QueryDict实现了字典的所有方法,下面是QueryDict额外提供的方法。
QueryDict.__init__(query_string=None, mutable=False, encoding=None)
QueryDict的构造方法,例如:
>>> QueryDict('a=1&a=2&a=3')
<QueryDict: {'a':['1', '2'], 'c':['3']}
>>> QueryDict.fromkeys(['a', 'a', 'b'], value='val')
<QueryDict:{'a', ['val', 'val'], 'b':['val']}
- QueryDict.getitem(key)
返回指定Key的值,如果Key包含多个值则返回最后一个值。如果Key不存在的话,抛出django.utils.datastructures.MultiValueDictKeyError
异常。 -
QueryDict.setitem(key, value)
为Key赋值,新值为[value](包含一个元素的列表)。
- QueryDict.contains(key)
对于判断Key是否存在,由于这个方法的存在使得判断Key更加简单,例如:
if "foo" in request.GET:
...
酷客教程相关文章:
评论前必须登录!
注册