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 | |
邮箱 | |
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
2021年第八期《python接口web自动化+测试开发》7.17号开学(课程全面升级!) 加量不加价(新增postman, 赠送selenium和python基础2个课)
本期上课时间:7月17号-10月16号,每周六、周日晚上20:30-22:30