• python测试开发django-98.views视图函数中request参数详解


    前言

    django 在 views 视图函数中会传一个request参数,request 是 HttpRequest 的实例对象。
    当请求一个页面时,Django 创建一个HttpRequest对象,其中包含有关请求的元数据。然后 Django 加载适当的视图,将传递HttpRequest给视图函数的第一个参数。
    每个视图负责返回一个HttpResponse对象。

    HttpRequest 属性

    HttpRequest 的一些属性和作用

    属性 说明
    HttpRequest.scheme 请求的协议,一般为http或者https
    HttpRequest.body 作为字节字符串的原始 HTTP 请求正文
    HttpRequest.path 表示请求页面的完整路径的字符串,不包括方案或域。例子: "/music/bands/the_beatles/"
    HttpRequest.path_info 获取具有 URL 扩展名的资源的附加路径信息。相对于HttpRequest.path,使用该方法便于移植。
    HttpRequest.method 获取该请求的方法GET/POST/PUT...,比如:if request.method == 'GET'
    HttpRequest.encoding 获取请求中表单提交数据的编码。
    HttpRequest.content_type 获取请求的MIME类型(从CONTENT_TYPE头部中获取),django1.10的新特性。
    HttpRequest.content_params 获取CONTENT_TYPE中的键值对参数,并以字典的方式表示,django1.10的新特性。
    HttpRequest.GET 返回一个 querydict 对象(类似于字典,本文最后有querydict的介绍),该对象包含了所有的HTTP GET参数
    HttpRequest.POST 返回一个 querydict ,该对象包含了所有的HTTP POST参数,通过表单上传的所有 字符 都会保存在该属性中。
    HttpRequest.COOKIES 返回一个包含了所有cookies的字典。键和值是字符串。
    HttpRequest.FILES 返回一个包含了所有的上传文件的 querydict 对象。通过表单所上传的所有 文件 都会保存在该属性中。 key的值是input标签中name属性的值,value的值是一个UploadedFile对象
    HttpRequest.META 返回一个包含了所有http头部信息的字典
    HttpRequest.resolver_match ResolverMatch表示已解析 URL的实例。此属性仅在 URL 解析发生后设置,这意味着它在所有视图中可用,但在 URL 解析发生之前执行的中间件中不可用(process_view()尽管您可以使用它 )
    HttpRequest.current_app 该url模板标签将使用它的值作为current_app 参数reverse()。
    HttpRequest.urlconf 这将用作当前请求的根 URLconf,覆盖ROOT_URLCONF设置
    HttpRequest.session 中间件属性 来自SessionMiddleware:一个可读可写的类似字典的对象,表示当前会话。
    HttpRequest.site 中间件属性 来自CurrentSiteMiddleware: 代表当前站点的实例Site或 RequestSite作为返回 的实例get_current_site()。
    HttpRequest.user 中间件属性,表示当前登录的用户。 来自AuthenticationMiddleware:AUTH_USER_MODEL代表当前登录用户的实例。

    request.user

    来自AuthenticationMiddleware:AUTH_USER_MODEL代表当前登录用户的实例。如果用户当前未登录,user则将设置为 的实例AnonymousUser。
    你可以用 区分它们 is_authenticated,像这样:

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

    HttpRequest.user实际上是由一个定义在django.contrib.auth.models 中的 user model 类 所创建的对象。
    该类有许多字段,属性和方法,常用字段:

    字段 说明
    username 用户名
    first_name
    last_name
    email 邮箱
    password 密码
    groups
    user_permissions
    is_staff 布尔值,标明用户是否可以访问admin页面
    is_superuser 是否超级管理员admin用户
    last_login 上一次登陆时间
    date_joined 用户创建时间

    属性:

    is_authenticated 布尔值,标志着用户是否已认证。在django1.10之前,没有该属性,但有与该属性同名的方法。
    方法:

    方法 说明 作用
    HttpRequest.user.get_username() 注意:方法的圆括号在templates标签中必需省略!!获取username。尽量使用该方法来代替使用username字段
    HttpRequest.user.get_full_name() 注意:方法的圆括号在templates标签中必需省略!!获取first_name和last_name
    HttpRequest.user.short_name() 注意:方法的圆括号在templates标签中必需省略!!获取first_name
    HttpRequest.user.set_password(raw_password) 注意:该方法无法在template标签中使用!!设置密码
    HttpRequest.user.check_password(raw_password) 注意:该方法无法在template标签中使用!!如果raw_password与用户密码相等,则返回True

    HttpRequest.META

    包含所有可用 HTTP 标头的字典。可用的标头取决于客户端和服务器,但这里有一些示例:

    属性 说明
    CONTENT_LENGTH 请求正文的长度(作为字符串)。
    CONTENT_TYPE 请求正文的 MIME 类型。
    HTTP_ACCEPT 可接受的响应内容类型。
    HTTP_ACCEPT_ENCODING 可接受的响应编码。
    HTTP_ACCEPT_LANGUAGE 可接受的响应语言。
    HTTP_HOST 客户端发送的 HTTP Host 头。
    HTTP_REFERER 引用页面,如果有的话。
    HTTP_USER_AGENT 客户端的用户代理字符串。
    QUERY_STRING 查询字符串,作为单个(未解析的)字符串。
    REMOTE_ADDR 客户端的IP地址。
    REMOTE_HOST 客户端的主机名。
    REMOTE_USER Web 服务器验证的用户(如果有)。
    REQUEST_METHOD 一个字符串,例如"GET"or "POST"。
    SERVER_NAME 服务器的主机名。
    SERVER_PORT 服务器的端口(作为字符串)。

    除了上面给出的CONTENT_LENGTHandCONTENT_TYPE之外,META通过将所有字符转换为大写,将所有连字符替换为下划线并HTTP_在名称中添加前缀,请求中的任何 HTTP 标头都会转换为键。因此,例如,调用的标头X-Bender将映射到METAkey HTTP_X_BENDER。

    请注意,runserver删除名称中带有下划线的所有标题,因此您不会在META. 这可以防止基于下划线和破折号之间的歧义的标题欺骗,两者都被规范化为 WSGI 环境变量中的下划线。它与 Nginx 和 Apache 2.4+ 等 Web 服务器的行为相匹配。

    HttpRequest 方法

    HttpRequest.get_host() :使用来自HTTP_X_FORWARDED_HOST(如果USE_X_FORWARDED_HOST已启用)和HTTP_HOST标头中的信息以该顺序返回请求的原始主机
    HttpRequest.get_port() :使用来自HTTP_X_FORWARDED_PORT(如果USE_X_FORWARDED_PORT已启用)和SERVER_PORT META变量的信息,按该顺序返回请求的起始端口 。
    HttpRequest.get_full_path(): 返回path,加上附加的查询字符串(如果适用)。例子: "/music/bands/the_beatles/?print=true"
    HttpRequest.get_full_path_info(): Django 2.1 中的新功能。喜欢get_full_path(),但使用path_info代替 path。例子: "/minfo/music/bands/the_beatles/?print=true"
    HttpRequest.build_absolute_uri( location=None ) 返回 的绝对 URI 形式location。如果未提供位置,则位置将设置为request.get_full_path()。
    如果位置已经是绝对 URI,则不会更改。否则,绝对 URI 将使用此请求中可用的服务器变量构建。例如:

    >>> request.build_absolute_uri()
    'https://example.com/music/bands/the_beatles/?print=true'
    >>> request.build_absolute_uri('/bands/')
    'https://example.com/bands/'
    >>> request.build_absolute_uri('https://example2.com/bands/')
    'https://example2.com/bands/'
    

    HttpRequest.get_signed_cookie( key , default=RAISE_ERROR , salt='' , max_age=None ): 返回签名 cookie 的 cookie 值,或者django.core.signing.BadSignature如果签名不再有效则引发 异常。如果您提供default参数,则异常将被抑制,而将返回默认值。
    可选salt参数可用于提供额外保护,防止对您的密钥进行暴力破解。如果提供,max_age将根据附加到 cookie 值的签名时间戳检查该参数, 以确保 cookie 不超过 max_age秒。
    例如:

    >>> 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('nonexistent-cookie')
    ...
    KeyError: 'nonexistent-cookie'
    >>> request.get_signed_cookie('nonexistent-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
    

    HttpRequest.is_secure() : True如果请求是安全的,则返回;也就是说,如果它是用 HTTPS 制作的。
    HttpRequest.is_ajax():通过检查字符串的标头,返回True请求是否是通过 an 发出的 。大多数现代 JavaScript 库都会发送此标头。如果您编写自己的调用(在浏览器端),则必须手动设置此标头才能工作。
    HttpRequest.read( size=None )
    HttpRequest.readline()
    HttpRequest.readlines()
    HttpRequest.__iter__()
    实现用于从HttpRequest实例读取的类文件接口的方法 。这使得以流方式使用传入请求成为可能。一个常见的用例是使用迭代解析器处理大型 XML 负载,而无需在内存中构建整个 XML 树。
    给定这个标准接口,一个HttpRequest实例可以直接传递给一个 XML 解析器,例如 ElementTree:

    import xml.etree.ElementTree as ET
    for element in ET.iterparse(request):
        process(element)
    

    HttpRequest官方文档地址https://docs.djangoproject.com/zh-hans/2.1/ref/request-response/#django.http.HttpRequest

  • 相关阅读:
    Paper Pal:一个中英文论文及其代码大数据搜索平台
    45天闭门刷题,精通这份Java高级架构面试文档,入职阿里涨薪20K
    三面阿里云计算,出门我就哭了!(Java研发岗,还原真实“被虐”场景)
    “TensorFlow 开发者出道计划”全攻略,玩转社区看这里!
    什么是可串行化MVCC
    2021最新Spring全家桶集合:SpringBoot+SpringCloud+Spring源码
    2015到2021的阿里JAVA架构技术演进,Alibaba架构师到底有多牛逼?
    大厂面试果然名不虚传,蚂蚁三面凉经,真的是“太难了”
    三面阿里云计算,出门我就哭了!(Java研发岗,还原真实“被虐”场景)
    Dubbo 一些你不一定知道但是很好用的功能
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/14966763.html
Copyright © 2020-2023  润新知