分享

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

 上海悠悠 2021-07-04

前言

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_matchResolverMatch表示已解析 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_USERWeb 服务器验证的用户(如果有)。
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:///music/bands/the_beatles/?print=true'
>>> request.build_absolute_uri('/bands/')
'https:///bands/'
>>> request.build_absolute_uri('https:///bands/')
'https:///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./zh-hans/2.1/ref/request-response/#django.http.HttpRequest

2021年第八期《python接口web自动化+测试开发》7.17号开学(课程全面升级!) 加量不加价(新增postman, 赠送selenium和python基础2个课)

7月17号-10月16号20:30-22:30

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多