Django HttpRequest对象

Django HttpRequest对象,当网页被请求时,Django会自动创建一个HttpRequest对象,这个对象包含了所有请求中的必要数据。每一个Django视图都会在第一个参数位置接收HttpRequest对象。

属性

除非特殊说明,所有的HttpRequest对象属性都是只读的,下面是全部HttpRequest对象属性。

  1. HttpRequest.scheme
    表示请求所用网络协议,通常是http或者https。

  2. HttpRequest.body
    HTTP请求的body部分。

  3. HttpRequest.path

请求资源的全路径,例如“/music/bands/the_beatles/”

  1. 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/。

  2. HttpRequest.method
    HTTP请求所使用的方法,属性值必须是大写,如GET、POST。

  3. HttpRequest.encoding
    用于处理表单提交数据的编码类型。HttpRequest.encoding是可编辑属性,当请求所提交的数据与DEFAULT_CHARSET不一致时,可以通过修改属性值的方式保证能够正确取得请求数据。

  4. HttpRequest.content_type
    表示MIME类型的字符串。

  5. HttpRequest.content_params
    表示CONTENT_TYPE头的值,格式为字典。
    例如:<meta http-equiv="content-type" content="text/html;charset=utf-8">

  6. HttpRequest.GET
    类似字典类型的对象,包含所有HTTP GET参数。

  7. HttpRequest.POST
    类似字典类型的对象,包含所有HTTP POST参数,通常是表单数据。

注意POST不包含文件上传信息。

  1. HttpRequest.COOKIES
    字典对象,用于保存所有cookie,字典的Key和Value都是字符串。

  2. HttpRequest.FILES
    字典对象,用于保存所有被上传的文件。字典的Key是HTML元素<input type="file" name="" />的name,字典的值是UploadedFile对象。

  3. 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属性,如以下几种。

  1. HttpRequest.session
    SessionMiddleware提供的用于存储当前session信息的属性,属性值是一个类似字典的对象,属性值可以被修改。

  2. HttpRequest.site
    CurrentSiteMiddleware提供的用于存储当前网站信息的属性。属性值是get_current_site()方法返回的Site或者RequestSite对象。

  3. HttpRequest.user
    AuthenticationMiddleware提供的用于存储当前用户的属性。属性值是AUTH_USER_ MODEL的实例对象。如果当前没有用户登录的话,属性值是AnonymousUser对象。

在代码中可以使用is_authenticated判断用户是否登录:

if request.user.is_authenticated:
        ...
    else:
        ...

方法

  1. HttpRequest.get_host()
    取得HTTP_X_FORWARDED_HOST和HTTP_HOST的值。如果这两个Header都没有值的话,get_host()方法返回SERVER_NAME + SERVER_PORT。如127.0.0.1:8000

  2. HttpRequest.get_port()
    返回网站端口号。

  3. HttpRequest.get_full_path()
    返回URL主机名后面的全部信息,例如/music/bands/the_beatles/?print=true

  4. 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/

  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')
  1. HttpRequest.is_secure()
    如果网站启用了HTTPS协议,is_secure()方法返回True,否则返回False。

  2. 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']}
  1. QueryDict.getitem(key)
    返回指定Key的值,如果Key包含多个值则返回最后一个值。如果Key不存在的话,抛出django.utils.datastructures.MultiValueDictKeyError异常。

  2. QueryDict.setitem(key, value)

为Key赋值,新值为[value](包含一个元素的列表)。

  1. QueryDict.contains(key)
    对于判断Key是否存在,由于这个方法的存在使得判断Key更加简单,例如:
if "foo" in request.GET:
    ...

酷客教程相关文章:

赞(0)

评论 抢沙发

评论前必须登录!