Django的HttpRequest和HttpResponse对象详解
- 格式:pdf
- 大小:176.99 KB
- 文档页数:6
Django的HttpRequest和HttpResponse对象详解⽬录
HttpRequest
QueryDict对象
A Complete Example
HttpResponse
构造HttpResponses
设置Headers
HttpResponse⼦类
返回Errors
⾃定义404 (Not Found) View⽅法
注意:
⾃定义500 (Server Error) View⽅法
总结
本⽂研究的主要是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对象的属性
Request对象也有⼀些有⽤的⽅法,见Table H-2:
Table H-2. HttpRequest Methods
__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 H-3. How QueryDicts Differ from Standard Dictionaries.
Method Differences from Standard dict Implementation
__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. 额外的 (⾮字典的) QueryDict ⽅法
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:
<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 请求对象的内容:
>>> 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']
>>> request.POST.get('your_name', 'Adrian')
'John Smith'
>>> request.POST.get('nonexistent_field', 'Nowhere Man')
'Nowhere Man'
HttpResponse
对于HttpRequest 对象来说,是由Django⾃动创建, 但是,HttpResponse对象就必须我们⾃⼰创建。
每个View⽅法必须返回⼀个HttpResponse对象。
HttpResponse类在django.http.HttpResponse。
构造HttpResponses
⼀般地, 你可以通过给HttpResponse的构造函数传递字符串表⽰的页⾯内容来构造HttpResponse对象:
>>> response = HttpResponse("Here's the text of the Web page.")
>>> response = HttpResponse("Text only, please.", mimetype="text/plain")
但是如果想要增量添加内容, 你可以把response当作filelike对象使⽤:
>>> response = HttpResponse()
>>> response.write("<p>Here's the text of the Web page.</p>")
>>> response.write("<p>Here's another paragraph.</p>")
也可以给HttpResponse传递⼀个iterator作为参数,⽽不⽤传递硬编码字符串。
如果你使⽤这种技术, 下⾯是需要注意的⼀些事项:
· iterator应该返回字符串.
· 如果HttpResponse使⽤iterator进⾏初始化,就不能把HttpResponse实例作为filelike 对象使⽤。
这样做将会抛出异常。
最后,再说明⼀下,HttpResponse实现了write()⽅法, 可以在任何需要filelike对象的地⽅使⽤HttpResponse对象。
参见第11章,有⼀些例⼦。
设置Headers
你可以使⽤字典语法添加,删除headers:
>>> response = HttpResponse()
>>> response['X-DJANGO'] = "It's the best."
>>> del response['X-PHP']
>>> response['X-DJANGO']
"It's the best."
你也可以使⽤has_header(header)⽅法检测某个header是否存在。
不要⼿动设置Cookie headers;具体的做法,参见第12章,有关于怎样在Django中处理cookies的详细讲解。
HttpResponse⼦类
Django包含很多HttpResponse⼦类,⽤来处理不同的HTTP响应类型(见Table H-5). 和HttpResponse⼀样, 这些⼦类在django.http中.
Table H-5. HttpResponse Subclasses
Class Description
HttpResponseRedirect构造函数接受单个参数:重定向到的URL。
可以是全URL (e.g., '/')
或者相对URL(e.g., '/search/'). 注意:这将返回HTTP状态码302。
HttpResponsePermanentRedirect同HttpResponseRedirect⼀样,但是返回永久重定向(HTTP 状态码 301)。
HttpResponseNotModified构造函数不需要参数。
Use this to designate that a page hasn't been modified since the
HttpResponseNotModified 构造函数不需要参数。
Use this to designate that a page hasn't been modified since the user's last request.HttpResponseBadRequest 返回400 status code 。
HttpResponseNotFound 返回404 status code.
HttpResponseForbidden 返回403 status code.
HttpResponseGone 返回410 status code.
HttpResponseServerError 返回500 status code.
Table H-5. HttpResponse Subclasses Class Description 当然,你也可以⾃⼰定义不包含在上表中的HttpResponse ⼦类。
返回Errors
在Django 中返回HTTP 错误码是很容易的。
上⾯介绍了HttpResponseNotFound, HttpResponseForbidden,
HttpResponseServerError 等⼀些⼦类。
View ⽅法中返回这些⼦类的实例就OK 了,例如:
def my_view(request):
# ...
if foo:
return HttpResponseNotFound('<h1>Page not found</h1>')
else:
return HttpResponse('<h1>Page was found</h1>')
当返回HttpResponseNotFound 时,你需要定义错误页⾯的HTML:
return HttpResponseNotFound('<h1>Page not found</h1>')
因为404错误是最常使⽤的HTTP 错误, 有⼀个更⽅便的⽅法处理它。
为了⽅便,⽽且整个站点有⼀致的404错误页⾯也是友好的,Django 提供⼀个Http404异常类。
如果在⼀个View ⽅法中抛出Http404,Django 将会捕获它并且返回标准错误页⾯,同时返回错误码404。
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})
为了使⽤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 ⽅法, 像这样:
from django.conf.urls.defaults import *
urlpatterns = patterns('',
...
)
handler404 = 'mysite.views.my_custom_404_view'
Django 就是通过在URLConf ⽂件中查找handler404来决定404 view ⽅法的。
默认地, URLconfs 包含下⾯⼀⾏代码:
from django.conf.urls.defaults import *
在 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⽅法, 像这样:
from django.conf.urls.defaults import *
urlpatterns = patterns('',
...
)
handler500 = 'mysite.views.my_custom_error_view'
总结
以上就是本⽂关于Django的HttpRequest和HttpResponse对象详解的全部内容,希望对⼤家有所帮助。
感兴趣的朋友可以继续参阅本站其他相关专题,如有不⾜之处,欢迎留⾔指出。
感谢朋友们对本站的⽀持!。