• django框架学习:三十一.HttpResquest对象


    前言

    每一个用户请求发送过来,django将http数据包中的相关内容,打包成一个HttpRequest对象,并传递给每个视图函数作为第一位置参数,也就是request,供我们调用。

    HttpResquest对象包含了非常多重要信息和数据,应该熟练运用它。

    属性

    HttpRequest对象大部分属性是只读的,除非特别注明。

    1.HttpRequest.scheme

    字符串类型,表示请求的协议种类。"https"或"http"

    2.HttpRequest.body

    bytes类型,表示原始的http请求正文。他对于处理非HTML形式的数据非常有用:二进制图像,XML等。如果要处理常规的表单数据,应该使用HttpRequest.POST。

    还可以使用类似读写的方式从HttpRequest中读取数据,参见HttpRequest.read()。

    3.HttpRequest.path

    字符串类型,表示当前请求页面的完整路径,但是不包括协议名和域名。例如:"music/bands/".这个属性常被用作进行某项操作室,如果不通过,返回先前浏览的页面,非常有用。

    4.HttpRequest.path.info

    在某些web服务器配置下,主机名后的url部分被分成脚本前缀部分和路径信息部分。

    path_info属性僵尸中包含路径信息部分,不论使用哪种web服务器,使用它代理path可以让代码在测试和开发环境中更容易的切换。

    例如:应用的WSGIScriptAlias设置为/minfo,那么HttpRequest.path等于/music/bands/the_beatles/,而HttpRequest.path_info为/minfo/music/bands/the_beatles/。

    5.HttpRequest.method

    字符串类型,表示请求使用的http方法,默认为大写,通过这个请求来判断请求的方法,然后根据请求的方法不同,在视图中执行不同的代码。

    6.HttpRequest.encoding

    字符串类型,表示提交的数据编码方式(如果为None,则表示使用DEFAULT_CHARSET设置)。这个属性是可写的,可以通过修改他来改变表单数据的编码。任何随后的访问都将使用心得编码方式。

    7.HttpRequest.content_type

    表示从CONTENT_TYPE头解析的请求MIME类型。

    8.HttpRequest.content_params

    表示包含在CONTENT_TYPE标题中的键/值参数字典。

    9.HttpRequest.GET

    一个类似于字典的对象,包含GET请求中的所有参数。

    10.HttpRequest.POST

    一个包含有POST请求的参数,以及包含表单数据的字典。如果需要访问请求中的原始或非标单数据,可以使用HttpRequest.body属性。

    11.HttpRequest.COOKIES

    包含所有Cookie信息的字典。键和值都为字符串。可以类似字典类型的方式,在cookie中读写数据,但是注意cookie是不安全的,因此不要写敏感重要的信息。

    12.HttpRequest.FILES

    一个类似于字典的对象,包含所有文件的上传数据。FILES中的每个键为<input type="file" name='' " /中的name属性值。FILES中的每个值是一个UploadFile。要在django中实现文件上传,就要靠这个属性!如果请求方法是POST且请求的<form>中带有enctype="multipart/form-data"属性,那么FILES将包含上传文件的数据。否则FILES将为一个空的类似于字典的对象,属于被忽略·,无用的情形。

    13.HttpRequest.META

    包含所有HTTP头部信息的字典。 可用的头部信息取决于客户端和服务器,下面是一些示例:

    CONTENT_LENGTH —— 请求正文的长度(以字符串计)。

    CONTENT_TYPE —— 请求正文的MIME类型。

    HTTP_ACCEPT —— 可接收的响应Content-Type。

    HTTP_ACCEPT_ENCODING —— 可接收的响应编码类型。

    HTTP_ACCEPT_LANGUAGE —— 可接收的响应语言种类。

    HTTP_HOST —— 客服端发送的Host头部。

    HTTP_REFERER —— Referring页面。

    HTTP_USER_AGENT —— 客户端的user-agent字符串。

    QUERY_STRING —— 查询字符串。

    REMOTE_ADDR —— 客户端的IP地址。想要获取客户端的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键。

    14. HttpRequest.resolver_match

    代表一个已解析的URL的ResolverMatch实例。

    二、可自定义的属性

    Django不会自动设置下面这些属性,而是由你自己在应用程序中设置并使用它们。

    1. HttpRequest.current_app

    表示当前app的名字。url模板标签将使用其值作为reverse()方法的current_app参数。

    2. HttpRequest.urlconf

    设置当前请求的根URLconf,用于指定不同的url路由进入口,这将覆盖settings中的ROOT_URLCONF设置。

    将它的值修改为None,可以恢复使用ROOT_URLCONF设置。

    三、由中间件设置的属性

    Django的contrib应用中包含的一些中间件会在请求上设置属性。

    1. HttpRequest.session

    SessionMiddleware中间件:一个可读写的,类似字典的对象,表示当前会话。我们要保存用户状态,回话过程等等,靠的就是这个中间件和这个属性。

    2. HttpRequest.site

    CurrentSiteMiddleware中间件:get_current_site()方法返回的Site或RequestSite的实例,代表当前站点是哪个。

    Django是支持多站点的,如果你同时上线了几个站点,就需要为每个站点设置一个站点id。

    3. HttpRequest.user

    AuthenticationMiddleware中间件:表示当前登录的用户的AUTH_USER_MODEL的实例,这个模型是Django内置的Auth模块下的User模型。如果用户当前未登录,则user将被设置为AnonymousUser的实例。

    可以使用is_authenticated方法判断当前用户是否合法用户,如下所示:

    if request.user.is_authenticated: ... # Do something for logged-in users. else: ... # Do something for anonymous users.

    四、方法

    1. HttpRequest.get_host()[source]

    根据HTTP_X_FORWARDED_HOST和HTTP_HOST头部信息获取请求的原始主机。 如果这两个头部没有提供相应的值,则使用SERVER_NAME和SERVER_PORT。

    例如:"127.0.0.1:8000"

    注:当主机位于多个代理的后面,get_host()方法将会失败。解决办法之一是使用中间件重写代理的头部,如下面的例子:

    from django.utils.deprecation import MiddlewareMixin

    class MultipleProxyMiddleware(MiddlewareMixin):

      FORWARDED_FOR_FIELDS = [

      'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED_HOST',

      'HTTP_X_FORWARDED_SERVER',

            ]

      def process_request(self, request):

      """ Rewrites the proxy headers so that only the most recent proxy is used.

      """

      for field in self.FORWARDED_FOR_FIELDS:

        if field in request.META:

           if ',' in request.META[field]:

            parts = request.META[field].split(',')

            request.META[field] = parts[-1].strip()

    2. HttpRequest.get_port()[source]

    使用META中HTTP_X_FORWARDED_PORT和SERVER_PORT的信息返回请求的始发端口。

    3. HttpRequest.get_full_path()[source]

    返回包含完整参数列表的path。例如:/music/bands/the_beatles/?print=true

    4. HttpRequest.build_absolute_uri(location)[source]

    返回location的绝对URI形式。 如果location没有提供,则使用request.get_full_path()的值。

    例如:"https://example.com/music/bands/the_beatles/?print=true"

    注:不鼓励在同一站点混合部署HTTP和HTTPS,如果需要将用户重定向到HTTPS,最好使用Web服务器将所有HTTP流量重定向到HTTPS。

    5. HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)[source]

    从已签名的Cookie中获取值,如果签名不合法则返回django.core.signing.BadSignature。

    可选参数salt用来为密码加盐,提高安全系数。 max_age参数用于检查Cookie对应的时间戳是否超时。

    范例:

    >>> request.get_signed_cookie('name')

    'Tony'

    >>> request.get_signed_cookie('name', salt='name-salt')

    'Tony' # assuming cookie was set using the same salt

    >>> request.get_signed_cookie('non-existing-cookie')

    ... KeyError: 'non-existing-cookie'

    >>> request.get_signed_cookie('non-existing-cookie', False)

    False

    >>> request.get_signed_cookie('cookie-that-was-tampered-with')

    ...

    BadSignature: ...

    >>> request.get_signed_cookie('name', max_age=60)

    ...

    SignatureExpired: Signature age 1677.3839159 > 60 seconds

    >>> request.get_signed_cookie('name', False, max_age=60)

    False

    6. HttpRequest.is_secure()[source]

    如果使用的是Https,则返回True,表示连接是安全的。

    7. HttpRequest.is_ajax()[source]

    如果请求是通过XMLHttpRequest生成的,则返回True。

    这个方法的作用就是判断,当前请求是否通过ajax机制发送过来的。

    8. HttpRequest.read(size=None)[source]

    9. HttpRequest.readline()[source]

    10. HttpRequest.readlines()[source]

    11. HttpRequest.xreadlines()[source]

    12. HttpRequest.iter()

    上面的几个方法都是从HttpRequest实例读取文件数据的方法。

    可以将HttpRequest实例直接传递到XML解析器,例如ElementTree:

    import xml.etree.ElementTree as ET

    for element in ET.iterparse(request):

      process(element)

  • 相关阅读:
    006-STM32+BC26基本控制篇-基础应用-域名申请SSL证书
    005-STM32+BC26基本控制篇-基础应用-域名备案
    004-STM32+BC26基本控制篇-基础应用-购买域名,配置域名解析
    003-STM32+BC26基本控制篇-基础应用-安装Web服务器软件Nginx(.Windows系统)
    002-STM32+BC26基本控制篇-基础应用-测试APP扫码绑定BC26模组并实现APP和开发板之间通过MQTT进行远程通信控制
    Spark实战(六)spark SQL + hive(Python版)
    Spark实战(五)spark streaming + flume(Python版)
    Spark实战(二)Spark常用算子
    Spark面试常见问题(一)--RDD基础
    Spark实战(三)本地连接远程Spark(Python环境)
  • 原文地址:https://www.cnblogs.com/liushui0306/p/12870359.html
Copyright © 2020-2023  润新知