11.3视图函数
官方文档:请求和响应对象
a.HttpRequest对象
1.request属性
HttpRequest.scheme
表示请求方案(http或https 通常)的字符串。
HttpRequest.body
原始HTTP请求主体作为字节串。这对于以不同于传统HTML表单的方式处理数据非常有用:二进制映像,XML有效负载等。对于处理传统表单数据,请使用 HttpRequest.POST。
您还可以HttpRequest使用类似文件的界面进行读取。见 HttpRequest.read()。
HttpRequest.path
表示所请求页面的完整路径的字符串,不包括方案或域。
例: "/music/bands/the_beatles/"
HttpRequest.path_info
在某些Web服务器配置下,主机名后面的URL部分被分成脚本前缀部分和路径信息部分。path_info无论使用何种Web服务器,该属性始终包含路径的路径信息部分。使用它代替path可以使您的代码更容易在测试和部署服务器之间移动。
例如,如果WSGIScriptAlias你的应用程序设置为 "/minfo",则path可能是"/minfo/music/bands/the_beatles/" 和path_info会"/music/bands/the_beatles/"。
HttpRequest.method
表示请求中使用的HTTP方法的字符串。这保证是大写的。例如:
if request.method == 'GET':
do_something()
elif request.method == 'POST':
do_something_else()
HttpRequest.encoding
表示用于解码表单提交数据的当前编码的字符串(或者None,表示使用该DEFAULT_CHARSET设置)。您可以写入此属性以更改访问表单数据时使用的编码。任何后续属性访问(例如从GET或读取POST)都将使用新encoding值。如果您知道表单数据不在DEFAULT_CHARSET 编码中,则非常有用。
HttpRequest.content_type
表示请求的MIME类型的字符串,从CONTENT_TYPE标头解析 。
HttpRequest.content_params
CONTENT_TYPE 标题中包含的键/值参数字典。
HttpRequest.GET
类似字典的对象,包含所有给定的HTTP GET参数。请参阅以下 QueryDict文档。
HttpRequest.POST
类似字典的对象,包含所有给定的HTTP POST参数,前提是请求包含表单数据。请参阅以下 QueryDict文档。如果您需要访问请求中发布的原始或非表单数据,请通过该HttpRequest.body属性访问该数据 。
请求可以通过POST使用空POST 字典进入- 例如,如果通过POST HTTP方法请求表单但不包含表单数据。因此,您不应该使用 检查POST方法的使用; 相反,使用(见)。if request.POSTif request.method == "POST"HttpRequest.method
POST它不包含文件上传信息。见FILES。
HttpRequest.COOKIES
包含所有cookie的字典。键和值是字符串。
HttpRequest.FILES
包含所有上传文件的类字典对象。每个键 FILES都name来自。每个值都是。<input type="file" name="">FILESUploadedFile
FILES如果请求方法是POST并且<form>发布到请求的方法有,则只包含数据 enctype="multipart/form-data"。否则,FILES将是一个空白的字典对象。
HttpRequest.META
包含所有可用HTTP标头的字典。可用的头文件取决于客户端和服务器,但以下是一些示例:
CONTENT_LENGTH - 请求正文的长度(作为字符串)。
CONTENT_TYPE - 请求正文的MIME类型。
HTTP_ACCEPT - 响应的可接受内容类型。
HTTP_ACCEPT_ENCODING - 可接受的响应编码。
HTTP_ACCEPT_LANGUAGE - 响应的可接受语言。
HTTP_HOST - 客户端发送的HTTP主机头。
HTTP_REFERER - 引用页面,如果有的话。
HTTP_USER_AGENT - 客户端的用户代理字符串。
QUERY_STRING - 查询字符串,作为单个(未解析的)字符串。
REMOTE_ADDR - 客户端的IP地址。
REMOTE_HOST - 客户端的主机名。
REMOTE_USER - Web服务器验证的用户(如果有)。
REQUEST_METHOD- 一个字符串,如"GET"或"POST"。
SERVER_NAME - 服务器的主机名。
SERVER_PORT - 服务器的端口(作为字符串)。
除了CONTENT_LENGTH和之外CONTENT_TYPE,如上所述,请求中的任何HTTP头都将转换为META键,方法是将所有字符转换为大写,用下划线替换任何连字符并HTTP_在名称中添加前缀。因此,例如,调用的标头X-Bender将映射到META密钥 HTTP_X_BENDER。
请注意,runserver在名称中删除带有下划线的所有标题,因此您将看不到它们META。这可以防止基于下划线和短划线之间的歧义的标头欺骗都在WSGI环境变量中对下划线进行规范化。它匹配Nginx和Apache 2.4+等Web服务器的行为。
HttpRequest.headers是一种更简单的方法来访问所有HTTP加前缀的标题,加号CONTENT_LENGTH和CONTENT_TYPE。
HttpRequest.headers
Django 2.2中的新功能:
一个不区分大小写的类似dict的对象,它提供对请求中所有HTTP加前缀的标题(加号Content-Length和Content-Type)的访问。
每个标题的名称在User-Agent显示时用标题 - 外壳(例如)进行样式化。您可以不区分大小写地访问标头:
>>> request.headers
{'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6', ...}
>>> 'User-Agent' in request.headers
True
>>> 'user-agent' in request.headers
True
>>> request.headers['User-Agent']
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
>>> request.headers['user-agent']
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
>>> request.headers.get('User-Agent')
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
>>> request.headers.get('user-agent')
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
HttpRequest.resolver_match¶
ResolverMatch表示已解析URL 的实例。此属性仅在URL解析发生后设置,这意味着它在所有视图中都可用,但在URL解析发生之前执行的中间件中不可用(process_view()尽管可以使用它 )。
2.request方法
1.HttpRequest.get_full_path()
返回 path,如果可以将加上查询字符串。
例如:"/music/bands/the_beatles/?print=true" (带参数)
2.HttpRequest.is_ajax()
如果请求是通过XMLHttpRequest 发起的,则返回True,方法是检查 HTTP_X_REQUESTED_WITH 相应的首部是否是字符串'XMLHttpRequest'。
大部分现代的 JavaScript 库都会发送这个头部。如果你编写自己的 XMLHttpRequest 调用(在浏览器端),你必须手工设置这个值来让 is_ajax() 可以工作。
如果一个响应需要根据请求是否是通过AJAX 发起的,并且你正在使用某种形式的缓存例如Django 的 cache middleware,
你应该使用 vary_on_headers('HTTP_X_REQUESTED_WITH') 装饰你的视图以让响应能够正确地缓存。
b.HttpResponse对象
1.response属性
HttpResponse.content
表示内容的字节字符串,如果需要,从字符串编码。
HttpResponse.charset
一个字符串,表示将在其中编码响应的字符集。如果未在HttpResponse实例化时间给出,则将从中提取 content_type,如果不成功,DEFAULT_CHARSET则将使用该 设置。
HttpResponse.status_code
该响应的 HTTP状态代码。
除非reason_phrase明确设置,否则修改 status_code构造函数外部的值也会修改值 reason_phrase。
HttpResponse.reason_phrase
响应的HTTP原因短语。它使用了HTTP标准的默认原因短语。
除非明确设置,否则reason_phrase由值确定 status_code。
HttpResponse.streaming
这总是如此False。
此属性存在,因此中间件可以不同于常规响应处理流式响应。
HttpResponse.closed
True 如果回复已经结束。
2.响应对象的主要形式
响应对象主要有三种形式:
HttpResponse()
render() //页面
--读取页面
--嵌入数据
redirect() //重定向
HttpResponse()括号内直接跟一个具体的字符串作为响应体
render(request, template_name[, context])
结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
参数:
request: 用于生成响应的请求对象。
template_name:要使用的模板的完整名称,可选的参数
context:添加到模板上下文的一个字典。默认是一个空字典。key是html用的名字,values是传入的变量名字,如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。
render方法就是将一个模板页面中的模板语法进行渲染,最终渲染成一个html页面作为响应体。
示例:
views:
a = 111
return render(request, 'template_name',{'name':a})
template_name.html:
<p>{{name}}</p>
传递要重定向的一个硬编码的URL路径
def my_view(request):
...
return redirect('/index/')
也可以是一个完整的URL:
def my_view(request):
...
return redirect('http://example.com/')