Django的httprequest对象和httpresponse对象
请求一张页面时,Django把请求的metadata数据包装成一个HttpRequest对象,然后Django加载合适的view方法,把这个HttpRequest 对象作为第一个参数传给view方法。任何view方法都应该返回一个HttpResponse对象。
我们在本书中大量使用这两个对象;本附录详细解释HttpRequest和HttpResponse对象。
HttpRequest
HttpRequest代表一个来自uesr-agent的HTTP请求。
大多重要的请求信息都是作为HttpRequest 对象的属性出现(see Table H-1). 除了session外,其他所有属性都是只读的。
Table H-1. HttpRequest对象的属性
Attribute |
Description |
path |
请求页面的全路径,不包括域名—例如, "/music/bands/the_beatles/"。 |
method |
请求中使用的HTTP方法的字符串表示。全大写表示。例如: if request.method == 'GET': |
GET |
包含所有HTTP GET参数的类字典对象。参见QueryDict 文档。 |
POST |
包含所有HTTP POST参数的类字典对象。参见QueryDict 文档。 服务器收到空的POST请求的情况也是有可能发生的。也就是说,表单form通过HTTP POST方法提交请求,但是表单中可以没有数据。因此,不能使用语句if request.POST来判断是否使用HTTP POST方法;应该使用if request.method == "POST" (参见本表的method属性)。 注意: POST不包括file-upload信息。参见FILES属性。 |
REQUEST |
为了方便,该属性是POST和GET属性的集合体,但是有特殊性,先查找POST属性,然后再查找GET属性。借鉴PHP’s $_REQUEST。 例如,如果GET = {"name": 强烈建议使用GET and POST,因为这两个属性更加显式化,写出的代码也更易理解。 |
COOKIES |
包含所有cookies的标准Python字典对象。Keys和values都是字符串。参见第12章,有关于cookies更详细的讲解。 |
FILES |
包含所有上传文件的类字典对象。FILES中的每个Key都是<input type="file"
注意:只有在请求方法是POST,并且请求页面中<form>有enctype="multipart/form-data"属性时FILES才拥有数据。否则,FILES 是一个空字典。 |
META |
包含所有可用HTTP头部信息的字典。
META 中这些头加上前缀HTTP_最为Key, 例如:
|
user |
是一个django.contrib.auth.models.User if request.user.is_authenticated(): 只有激活Django中的AuthenticationMiddleware时该属性才可用 关于认证和用户的更详细讲解,参见第12章。 |
session |
唯一可读写的属性,代表当前会话的字典对象。只有激活Django中的session支持时该属性才可用。 参见第12章。 |
raw_post_data |
原始HTTP POST数据,未解析过。 |
Request对象也有一些有用的方法,见Table H-2:
Table |
|
Method |
Description |
__getitem__(key) |
返回GET/POST的键值,先取POST,后取GET。如果键不存在抛出 KeyError。 这是我们可以使用字典语法访问HttpRequest对象。 例如,request["foo"]等同于先request.POST["foo"] 然后 request.GET["foo"]的操作。 |
has_key() |
检查request.GET or request.POST中是否包含参数指定的Key。 |
get_full_path() |
返回包含查询字符串的请求路径。例如, "/music/bands/the_beatles/?print=true" |
is_secure() |
如果请求是安全的,返回True,就是说,发出的是HTTPS请求。 |
QueryDict对象
在HttpRequest对象中, GET和POST属性是django.http.QueryDict类的实例。 QueryDict类似字典的自定义类,用来处理单键对应多值的情况。因为一些HTML
form元素,例如,<selectmultiple="multiple">,
就会传多个值给单个键。
QueryDict对象是immutable(不可更改的),除非创建它们的copy()。这意味着我们不能直接改变request.POST and
request.GET的属性。
QueryDict实现所有标准的字典方法。还包括一些特有的方法,见Table
H-3.
Table |
|
Method |
Differences from Standard dict |
__getitem__ |
和标准字典的处理有一点不同,就是,如果Key对应多个Value,__getitem__()返回最后一个value。 |
__setitem__ |
设置参数指定key的value列表(一个Python list)。注意:它只能在一个mutable QueryDict 对象上被调用(就是通过copy()产生的一个QueryDict对象的拷贝). |
get() |
如果key对应多个value,get()返回最后一个value。 |
update() |
参数可以是QueryDict,也可以是标准字典。和标准字典的update方法不同,该方法添加字典 items,而不是替换它们: >>> q = QueryDict('a=1') >>> q = q.copy() # to make it mutable >>> q.update({'a': '2'}) >>> q.getlist('a') ['1', '2'] >>> q['a'] # returns the last ['2'] |
items() |
和标准字典的items()方法有一点不同,该方法使用单值逻辑的__getitem__(): >>> q = QueryDict('a=1&a=2&a=3') >>> q.items() [('a', '3')] |
values() |
和标准字典的values()方法有一点不同,该方法使用单值逻辑的__getitem__(): |
此外, QueryDict也有一些方法,见Table H-4.
H-4. |
|
Method |
Description |
copy() |
返回对象的拷贝,内部实现是用Python标准库的copy.deepcopy()。该拷贝是mutable(可更改的) — 就是说,可以更改该拷贝的值。 |
getlist(key) |
返回和参数key对应的所有值,作为一个Python list返回。如果key不存在,则返回空list。 It’s guaranteed to return a list of some sort.. |
setlist(key,list_) |
设置key的值为list_ (unlike __setitem__()). |
appendlist(key,item) |
添加item到和key关联的内部list. |
setlistdefault(key,list) |
和setdefault有一点不同,它接受list而不是单个value作为参数。 |
lists() |
和items()有一点不同, 它会返回key的所有值,作为一个list, 例如: >>> q = QueryDict('a=1&a=2&a=3') >>> q.lists() [('a', ['1', '2', '3'])] |
urlencode() |
返回一个以查询字符串格式进行格式化后的字符串(e.g., "a=2&b=3&b=5"). |
A Complete Example
例如, 下面是一个HTML form:
[html] view plain copy
- <span style="font-size:12px;"><form action="/foo/bar/" method="post">
- <input type="text" name="your_name" />
- <select multiple="multiple" name="bands">
- <option value="beatles">The Beatles</option>
- <option value="who">The Who</option>
- <option value="zombies">The Zombies</option>
- </select>
- <input type="submit" />
- </form></span>
如果用户在your_name域中输入"JohnSmith",同时在多选框中选择了“The Beatles”和“The
Zombies”,下面是Django请求对象的内容:
[python] view plain copy
- <span style="font-size:12px;">>>> request.GET{}
- >>> request.POST
- {'your_name': ['John Smith'], 'bands': ['beatles', 'zombies']}
- >>> request.POST['your_name']
- 'John Smith'
- >>> request.POST['bands']
- 'zombies'
- >>> request.POST.getlist('bands')
- ['beatles', 'zombies']
10. >>> request.POST.get('your_name', 'Adrian')
11. 'John Smith'
12. >>> request.POST.get('nonexistent_field', 'Nowhere Man')
13. 'Nowhere Man'</span>
HttpResponse
对于HttpRequest 对象来说,是由Django自动创建, 但是,HttpResponse对象就必须我们自己创建。每个View方法必须返回一个HttpResponse对象。
HttpResponse类在django.http.HttpResponse。
构造HttpResponses
一般地, 你可以通过给HttpResponse的构造函数传递字符串表示的页面内容来构造HttpResponse对象:
[python] view plain copy
- <span style="font-size:12px;">>>> response = HttpResponse("Here's the text of the Web page.")
- >>> response = HttpResponse("Text only, please.", mimetype="text/plain")</span>
但是如果想要增量添加内容, 你可以把response当作filelike对象使用:
[python] view plain copy
- <span style="font-size:12px;">>>> response = HttpResponse()
- >>> response.write("<p>Here's the text of the Web page.</p>")
- >>> response.write("<p>Here's another paragraph.</p>")</span>
[python] view plain copy
- <span style="font-family: verdana, arial, helvetica, sans-serif; line-height: 15.6px; "><span style="font-size:12px;">也可以给HttpResponse传递一个iterator作为参数,而不用传递硬编码字符串。 如果你使用这种技术, 下面是需要注意的一些事项:</span></span>
·
iterator应该返回字符串.
·
如果HttpResponse使用iterator进行初始化,就不能把HttpResponse实例作为filelike 对象使用。这样做将会抛出异常。
最后,再说明一下,HttpResponse实现了write()方法, 可以在任何需要filelike对象的地方使用HttpResponse对象。参见第11章,有一些例子。
设置Headers
你可以使用字典语法添加,删除headers:
[python] view plain copy
- <span style="font-size:12px;">>>> response = HttpResponse()
- >>> response['X-DJANGO'] = "It's the best."
- >>> del response['X-PHP']
- >>> response['X-DJANGO']
- "It's the best."</span>
你也可以使用has_header(header)方法检测某个header是否存在。
不要手动设置Cookie headers;具体的做法,参见第12章,有关于怎样在Django中处理cookies的详细讲解。
HttpResponse子类
Django包含很多HttpResponse子类,用来处理不同的HTTP响应类型(见Table H-5). 和HttpResponse一样, 这些子类在django.http中.
Table |
|
Class |
Description |
HttpResponseRedirect |
构造函数接受单个参数:重定向到的URL。可以是全URL (e.g., 'http://search.yahoo.com/')或者相对URL(e.g., '/search/'). 注意:这将返回HTTP状态码302。 |
HttpResponsePermanentRedirect |
同HttpResponseRedirect一样,但是返回永久重定向(HTTP 状态码 301)。 |
HttpResponseNotModified |
构造函数不需要参数。Use this to designate that a page hasn’t been modified since |
HttpResponseBadRequest |
返回400 status code。 |
HttpResponseNotFound |
返回404 status code. |
HttpResponseForbidden |
返回403 status code. |
HttpResponseNotAllowed |
返回405 status code. 它需要一个必须的参数:一个允许的方法的list (e.g., ['GET','POST']). |
HttpResponseGone |
返回410 status code. |
HttpResponseServerError |
返回500 status code. |
当然,你也可以自己定义不包含在上表中的HttpResponse子类。
返回Errors
在Django中返回HTTP错误码是很容易的。上面介绍了HttpResponseNotFound, HttpResponseForbidden,
HttpResponseServerError等一些子类。View方法中返回这些子类的实例就OK了,例如:
[python] view plain copy
- <span style="font-size:12px;">def my_view(request):
- # ...
- if foo:
- return HttpResponseNotFound('<h1>Page not found</h1>')
- else:
- return HttpResponse('<h1>Page was found</h1>')</span>
当返回HttpResponseNotFound时,你需要定义错误页面的HTML:
return
HttpResponseNotFound('<h1>Page not found</h1>')
因为404错误是最常使用的HTTP错误, 有一个更方便的方法处理它。
为了方便,而且整个站点有一致的404错误页面也是友好的,Django提供一个Http404异常类。如果在一个View方法中抛出Http404,Django将会捕获它并且返回标准错误页面,同时返回错误码404。
[python] view plain copy
- <span style="font-size:12px;">from django.http import Http404
- def detail(request, poll_id):
- try:
- p = Poll.objects.get(pk=poll_id)
- except Poll.DoesNotExist:
- raise Http404
- return render_to_response('polls/detail.html', {'poll': p})</span>
为了使用Http404异常, 你需要创建一个模板文件。当异常抛出时,就会显示该模板文件。该模板文件的文件名是404.html,在模板根目录下创建。
自定义404 (Not Found) View方法
当抛出Http404异常时, Django会加载一个特殊的view方法处理404错误。默认地, 它是django.views.defaults.page_not_found,负责加载和渲染404.html模板文件。
这意味着我们必须在模板根目录定义404.html模板文件,该模板文件应用于所有的404异常。
该page_not_found view方法应该可以应对几乎99%的Web
App,但是如果想要重载该view方法时, 你可以在URLConf文件中指定handler404为自定义的404 errpr view方法, 像这样:
[python] view plain copy
- <span style="font-size:12px;">from django.conf.urls.defaults import *
- urlpatterns = patterns('',
- ...
- )
- handler404 = 'mysite.views.my_custom_404_view'</span>
Django就是通过在URLConf文件中查找handler404来决定404 view方法的。默认地, URLconfs包含下面一行代码:
[python] view plain copy
- <span style="font-size:12px;">from django.conf.urls.defaults import *</span>
在 django/conf/urls/defaults.py模块中, handler404赋值为 'django.views.defaults.page_not_found'。
注意:
·
如果请求URL没有和Django的URLConf文件中的任何一个正则表示式匹配,404
view方法就会被调用。
·
如果没有定义自己的404 view — 使用默认地404 view,你仍然有一个工作要做:在模板根目录创建404.html模板文件。默认地404 view将使用该模板处理所有404错误。
·
如果 DEBUG设置为True (在setting模块中),404 view方法不会被使用,取而代之的是,traceback信息。
自定义500 (Server Error) View方法
同样地,当view代码发生运行时错误时,Django也会产生特殊行为。如果view方法产生异常,Django将会调用默认地view方法django.views.defaults.server_error,
该方法加载渲染500.html模板文件。
这意味着我们必须在模板根目录定义500.html模板文件,该模板文件应用于所有的服务器错误。
该server_error view方法应该可以应对几乎99%的Web
App,但是如果想要重载该view方法时, 你可以在URLConf文件中指定handler500为自定义的server error view方法, 像这样:
[python] view plain copy
- <span style="font-size:12px;">from django.conf.urls.defaults import *
- urlpatterns = patterns('',
- ...
- )
- handler500 = 'mysite.views.my_custom_error_view'</span>
Django的httprequest对象和httpresponse对象的更多相关文章
- Django中的HttpRequsest 和Httpresponse对象
HttpRequest对象:每一个用户请求在到达视图函数的同时,django会自动创建一个HttpRequest对象并把这个对象当做第一个参数传给要调用的views方法,HttpRequest对象里封 ...
- Django框架之第四篇(视图层)--HttpRequest对象、HttpResponse对象、JsonResponse、CBV和FBV、文件上传
视图层 一.视图函数 一个视图函数,简称视图,是一个简单的python函数,它接收web请求并且会返回web响应.响应可以是一张网页的html,一个重定向,或者是一张图片...任何东西都可以.无论是什 ...
- Django框架(九):视图(二) HttpRequest对象、HttpResponse对象
1. HttpRequest对象 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象,这个对象不需要我们创建,直接使用服务器构造好的对象就可以.视图的第一个参数必须是HttpR ...
- Django(十一)视图详解:基本使用、登录实例、HttpReqeust对象、HttpResponse对象
一.视图(基于类的视图) [参考]https://docs.djangoproject.com/zh-hans/3.0/topics/class-based-views/intro/ 1)视图的功能 ...
- django request对象和HttpResponse对象
HttpRequest对象(除非特殊说明,所有属性都是只读,session属性是个例外)HttpRequest.scheme 请求方案(通常为http或https)HttpRequest.body 字 ...
- [R]django的HTTPREQUEST对象
django的HTTPREQUEST对象 via Django使用request和response对象 当请求一张页面时,Django把请求的metadata数据包装成一个HttpRequest对象, ...
- django的HTTPREQUEST对象
Django使用request和response对象 当请求一张页面时,Django把请求的metadata数据包装成一个HttpRequest对象,然后Django加载合适的view方法,把这个Ht ...
- 【转】Django中的request与response对象
关于request与response 前面几个 Sections 介绍了关于 Django 请求(Request)处理的流程分析,我们也了解到,Django 是围绕着 Request 与 Respon ...
- 第二章:视图层 - 7:HttpResponse对象
类定义:class HttpResponse[source] HttpResponse类定义在django.http模块中. HttpRequest对象由Django自动创建,而HttpRespons ...
随机推荐
- 使用Jmeter创建ActiveMQ JMS POINT TO POINT请求,环境搭建、请求创建、插件安装、监听服务器资源等
转自:http://www.cnblogs.com/qianyiliushang/p/4348584.html 准备工作: 安装JDK,推荐使用1.7以上版本,并设置JAVA_HOME 下载Jmete ...
- Eureka的高可用
问题: 现在Eureka和Client是1对1,但是Eureka挂了,就不能用了. 如何解决呢,创建多个Erurka.并且Eureka进行相互注册.如下图 怎么相互注册呢 1. 创建两个Eureka ...
- Typescript学习总结之模块
面向对象的特性 模块 模块可以帮助开发者将代码分割为可重用的单元.开发者可以自己决定将模块中的哪些资源(类.方法.变量) 暴露给外部使用,哪些资源只在模块内使用. 如下图, 创建了a.ts 和b.ts ...
- ASP.NET AJAX入门系列(3):使用ScriptManagerProxy控件
在ASP.NET AJAX中,由于一个ASPX页面上只能有一个ScriptManager控件,所以在有母版页的情况下,如果需要在Master-Page和Content-Page中需要引入不同的脚本时, ...
- 抓包及分析(wireshark&tcpdump)
1.简介 Wireshark是一个网络协议检测工具,支持Windows平台和Unix平台,我一般只在Windows平台下使用Wireshark,如果是Linux的话,我直接用tcpdump了,因为我工 ...
- 手机开发者模型,上方显示p dx dy xv yv
prs:当前压强 (红色的时候 表示 压强趋向稳定或达到最大压强)p:触碰点状况p:(x/y) x为当前监控的触摸点 y为当次触摸屏幕操作最大触摸点个数 你可以理解为 y是有多少根手指放过在屏幕上 x ...
- Winfrom Chart实现数据统计
简介 Chart图标根据实际使用情况,部分图表适用于多组数据的数据分析统计功能,例如柱状图:部分图表适用于单组数据的数据分析统计,例如饼状图. 主要属性 注意使用: Chart图表的如下属性:Lege ...
- VS2010 如何自动生成UML图
项目名---右键----查看类图
- 黄聪:ffmpeg基本用法(转)
FFmpeg FFmpeg 基本用法 本课要解决的问题 1.FFmpeg的转码流程是什么? 2.常见的视频格式包含哪些内容吗? 3.如何把这些内容从视频文件中抽取出来? 4.如何从一种格式转换为另一种 ...
- 在64位平台上的Lucene,应该使用MMapDirectory[转]
http://blog.thetaphi.de/2012/07/use-lucenes-mmapdirectory-on-64bit.html 从3.1版本开始,Lucene和Solr开始在64位的W ...