mingyou2010 发表于 2011-12-21 08:44

HTTP请求(Request)和回应(Response)对象

Django<span style="FONT-FAMILY: 宋体">使用</span>request<span style="FONT-FAMILY: 宋体">和</span>response<span style="FONT-FAMILY: 宋体">对象在系统间传递状态。</span><span style="FONT-FAMILY: 宋体"></span>
<p id="cn2"><span style="FONT-FAMILY: 宋体">当一个页面被请示时,</span>Django<span style="FONT-FAMILY: 宋体">创建一个包含请求元数据的</span> HttpRequest <span style="FONT-FAMILY: 宋体">对象。然后</span>Django<span style="FONT-FAMILY: 宋体">调入合适的视图,把</span> HttpRequest <span style="FONT-FAMILY: 宋体">作为视图的函数的第一个参数传入。每个视图要负责返回一个</span> HttpResponse <span style="FONT-FAMILY: 宋体">对象。</span> </p>
<p id="cn3"><span style="FONT-FAMILY: 宋体">我们在书中已经使用过这些对象了;这篇附录说明了</span>
HttpRequest <span style="FONT-FAMILY: 宋体">和</span> HttpResponse <span style="FONT-FAMILY: 宋体">的全部</span>API<span style="FONT-FAMILY: 宋体">。</span> </p>
<p><span id="cn4">HttpRequest</span><span style="FONT-FAMILY: 宋体">对象</span> </p>
<p id="cn5">HttpRequest <span style="FONT-FAMILY: 宋体">表示来自某客户端的一个单独的</span>HTTP<span style="FONT-FAMILY: 宋体">请求。</span> </p>
<p id="cn6">HttpRequest<span style="FONT-FAMILY: 宋体">实例的属性包含了关于此次请求的大多数重要信息</span>(<span style="FONT-FAMILY: 宋体">详见表</span>H-1)<span style="FONT-FAMILY: 宋体">。</span>
<span style="FONT-FAMILY: 宋体">除了</span>session<span style="FONT-FAMILY: 宋体">外的所有属性都应该认为是只读的</span>. </p>
<table style="WIDTH: 560px; BORDER-COLLAPSE: collapse; HEIGHT: 1408px" id="cn7" border="1" cellpadding="0" cellspacing="0" width="560">
<thead>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm" colspan="2">
<p><span style="FONT-FAMILY: 宋体">表</span> H-1. HttpRequest<span style="FONT-FAMILY: 宋体">对象的属性</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">属性</span></p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">描述</span></p></td></tr></thead>
<tbody>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>path</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">表示提交请求页面完整地址的字符串,不包括域名,如</span>
"/music/bands/the_beatles/" <span style="FONT-FAMILY: 宋体">。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>method</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">表示提交请求使用的</span>HTTP<span style="FONT-FAMILY: 宋体">方法。它总是大写的。例如:</span></p>
<p>if request.method == 'GET':</p>
<p>&nbsp;&nbsp; &nbsp;do_something()</p>
<p>elif request.method == 'POST':</p>
<p>&nbsp;&nbsp;&nbsp; do_something_else()</p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>GET</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">一个类字典对象,包含所有的</span>HTTP<span style="FONT-FAMILY: 宋体">的</span>GET<span style="FONT-FAMILY: 宋体">参数的信息。见</span>
QueryDict <span style="FONT-FAMILY: 宋体">文档。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>POST</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">一个类字典对象,包含所有的</span>HTTP<span style="FONT-FAMILY: 宋体">的</span>POST<span style="FONT-FAMILY: 宋体">参数的信息。见</span>
QueryDict <span style="FONT-FAMILY: 宋体">文档。</span></p>
<p><span style="FONT-FAMILY: 宋体">通过</span>POST<span style="FONT-FAMILY: 宋体">提交的请求有可能包含一个空的</span> POST <span style="FONT-FAMILY: 宋体">字典,也就是说,</span> <span style="FONT-FAMILY: 宋体">一个通过</span>POST<span style="FONT-FAMILY: 宋体">方法提交的表单可能不包含数据。因此,不应该使用</span> if request.POST <span style="FONT-FAMILY: 宋体">来判断</span>POST<span style="FONT-FAMILY: 宋体">方法的使用,而是使用</span> if request.method == "POST" <span style="FONT-FAMILY: 宋体">(见表中的</span> method <span style="FONT-FAMILY: 宋体">条目)。</span></p>
<p><span style="FONT-FAMILY: 宋体">注意:</span> POST <span style="FONT-FAMILY: 宋体">并</span> <span style="FONT-FAMILY: 宋体">不</span> <span style="FONT-FAMILY: 宋体">包含文件上传信息。见</span> FILES <span style="FONT-FAMILY: 宋体">。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>REQUEST</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">为了方便而创建,这是一个类字典对象,先搜索</span> POST <span style="FONT-FAMILY: 宋体">,再搜索</span> GET <span style="FONT-FAMILY: 宋体">。</span>
<span style="FONT-FAMILY: 宋体">灵感来自于</span>PHP<span style="FONT-FAMILY: 宋体">的</span> $_REQEUST <span style="FONT-FAMILY: 宋体">。</span></p>
<p><span style="FONT-FAMILY: 宋体">例如,</span> <span style="FONT-FAMILY: 宋体">若</span> GET = {"name": "john"} <span style="FONT-FAMILY: 宋体">,</span> POST = {"age": '34'} <span style="FONT-FAMILY: 宋体">,</span> REQUEST["name"] <span style="FONT-FAMILY: 宋体">会是</span> "john" <span style="FONT-FAMILY: 宋体">,</span>
REQUEST["age"] <span style="FONT-FAMILY: 宋体">会是</span> "34" <span style="FONT-FAMILY: 宋体">。</span></p>
<p><span style="FONT-FAMILY: 宋体">强烈建议使用</span> GET <span style="FONT-FAMILY: 宋体">和</span> POST <span style="FONT-FAMILY: 宋体">,而不是</span>
REQUEST <span style="FONT-FAMILY: 宋体">。这是为了向前兼容和更清楚的表示。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>COOKIES</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">一个标准的</span>Python<span style="FONT-FAMILY: 宋体">字典,包含所有</span>cookie<span style="FONT-FAMILY: 宋体">。键和值都是字符串。</span>cookie<span style="FONT-FAMILY: 宋体">使用的更多信息见第</span>12<span style="FONT-FAMILY: 宋体">章。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>FILES</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">一个类字典对象,包含所有上传的文件。</span> FILES <span style="FONT-FAMILY: 宋体">的键来自</span> &lt;input type="file" name="" /&gt; <span style="FONT-FAMILY: 宋体">中的</span> name <span style="FONT-FAMILY: 宋体">。</span>
FILES <span style="FONT-FAMILY: 宋体">的值是一个标准的</span>Python<span style="FONT-FAMILY: 宋体">字典,包含以下三个键:</span></p>
<p>filename <span style="FONT-FAMILY: 宋体">:字符串,表示上传文件的文件名。</span> </p>
<p>content-type <span style="FONT-FAMILY: 宋体">:上传文件的内容类型。</span> </p>
<p>content <span style="FONT-FAMILY: 宋体">:上传文件的原始内容。</span> </p>
<p><span style="FONT-FAMILY: 宋体">注意</span> FILES <span style="FONT-FAMILY: 宋体">只在请求的方法是</span> POST <span style="FONT-FAMILY: 宋体">,并且提交的</span> &lt;form&gt; <span style="FONT-FAMILY: 宋体">包含</span> enctype="multipart/form-data" <span style="FONT-FAMILY: 宋体">时才包含数据。否则,</span> FILES <span style="FONT-FAMILY: 宋体">只是一个空的类字典对象。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>META</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">一个标准的</span>Python<span style="FONT-FAMILY: 宋体">字典,包含所有有效的</span>HTTP<span style="FONT-FAMILY: 宋体">头信息。有效的头信息与客户端和服务器有关。这里有几个例子:</span></p>
<p>CONTENT_LENGTH </p>
<p>CONTENT_TYPE </p>
<p>QUERY_STRING <span style="FONT-FAMILY: 宋体">:未解析的原始请求字符串。</span> </p>
<p>REMOTE_ADDR <span style="FONT-FAMILY: 宋体">:客户端</span>IP<span style="FONT-FAMILY: 宋体">地址。</span> </p>
<p>REMOTE_HOST <span style="FONT-FAMILY: 宋体">:客户端主机名。</span> </p>
<p>SERVER_NAME <span style="FONT-FAMILY: 宋体">:服务器主机名。</span> </p>
<p>SERVER_PORT <span style="FONT-FAMILY: 宋体">:服务器端口号。</span> </p>
<p><span style="FONT-FAMILY: 宋体">在</span> META <span style="FONT-FAMILY: 宋体">中有效的任一</span>HTTP<span style="FONT-FAMILY: 宋体">头信息都是带有</span> HTTP_ <span style="FONT-FAMILY: 宋体">前缀的键,例如:</span></p>
<p>HTTP_ACCEPT_ENCODING </p>
<p>HTTP_ACCEPT_LANGUAGE </p>
<p>HTTP_HOST <span style="FONT-FAMILY: 宋体">:客户端发送的</span> Host <span style="FONT-FAMILY: 宋体">头信息。</span> </p>
<p>HTTP_REFERER <span style="FONT-FAMILY: 宋体">:被指向的页面,如果存在的。</span> </p>
<p>HTTP_USER_AGENT <span style="FONT-FAMILY: 宋体">:客户端的</span>user-agent<span style="FONT-FAMILY: 宋体">字符串。</span> </p>
<p>HTTP_X_BENDER <span style="FONT-FAMILY: 宋体">:</span> X-Bender <span style="FONT-FAMILY: 宋体">头信息的值,如果已设的话。</span> </p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>user</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">一个</span> django.contrib.auth.models.User <span style="FONT-FAMILY: 宋体">对象表示当前登录用户。</span> <span style="FONT-FAMILY: 宋体">若当前用户尚未登录,</span> user <span style="FONT-FAMILY: 宋体">会设为</span> django.contrib.auth.models.AnonymousUser
<span style="FONT-FAMILY: 宋体">的一个实例。可以将它们与</span> is_authenticated() <span style="FONT-FAMILY: 宋体">区别开:</span></p>
<div style="BORDER-BOTTOM: #94da3a 1pt solid; BORDER-LEFT: #94da3a 1pt solid; PADDING-BOTTOM: 4pt; PADDING-LEFT: 5pt; PADDING-RIGHT: 5pt; BORDER-TOP: #94da3a 1pt solid; BORDER-RIGHT: #94da3a 1pt solid; PADDING-TOP: 4pt">
<p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0cm">if
request.user.is_authenticated():</p>
<p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0cm">&nbsp;&nbsp;&nbsp;
# Do something for logged-in users.</p>
<p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0cm">else:</p>
<p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0cm">&nbsp;&nbsp;&nbsp;
# Do something for anonymous users.</p></div>
<p>user <span style="FONT-FAMILY: 宋体">仅当</span>Django<span style="FONT-FAMILY: 宋体">激活</span> AuthenticationMiddleware <span style="FONT-FAMILY: 宋体">时有效。</span></p>
<p><span style="FONT-FAMILY: 宋体">关于认证和用户的完整细节,见第</span>12<span style="FONT-FAMILY: 宋体">章。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>session</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">一个可读写的类字典对象,表示当前</span>session<span style="FONT-FAMILY: 宋体">。仅当</span>Django<span style="FONT-FAMILY: 宋体">已激活</span>session<span style="FONT-FAMILY: 宋体">支持时有效。见第</span>12<span style="FONT-FAMILY: 宋体">章。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>raw_post_data</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>POST<span style="FONT-FAMILY: 宋体">的原始数据。</span> <span style="FONT-FAMILY: 宋体">用于对数据的复杂处理。</span></p></td></tr></tbody></table>
<p id="cn10">Request<span style="FONT-FAMILY: 宋体">对象同样包含了一些有用的方法,见表</span>H-2<span style="FONT-FAMILY: 宋体">。</span> </p>
<table style="WIDTH: 560px; BORDER-COLLAPSE: collapse; HEIGHT: 250px" id="cn11" border="1" cellpadding="0" cellspacing="0" width="560">
<thead>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm" colspan="2">
<p><span style="FONT-FAMILY: 宋体">表</span> H-2. HttpRequest <span style="FONT-FAMILY: 宋体">的方法</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">方法</span></p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">描述</span></p></td></tr></thead>
<tbody>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>__getitem__(key)</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">请求所给键的</span>GET/POST<span style="FONT-FAMILY: 宋体">值,先查找</span>POST<span style="FONT-FAMILY: 宋体">,然后是</span>GET<span style="FONT-FAMILY: 宋体">。若键不存在,则引发异常</span> KeyError <span style="FONT-FAMILY: 宋体">。</span></p>
<p><span style="FONT-FAMILY: 宋体">该方法使用户可以以访问字典的方式来访问一个</span> HttpRequest <span style="FONT-FAMILY: 宋体">实例。</span></p>
<p><span style="FONT-FAMILY: 宋体">例如,</span> request["foo"] <span style="FONT-FAMILY: 宋体">和先检查</span> request.POST["foo"] <span style="FONT-FAMILY: 宋体">再检查</span> request.GET["foo"] <span style="FONT-FAMILY: 宋体">一样。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>has_key()</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">返回</span> True <span style="FONT-FAMILY: 宋体">或</span> False <span style="FONT-FAMILY: 宋体">,标识</span>
request.GET <span style="FONT-FAMILY: 宋体">或</span> request.POST <span style="FONT-FAMILY: 宋体">是否包含所给的键。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>get_full_path()</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">返回</span> path <span style="FONT-FAMILY: 宋体">,若请求字符串有效,则附加于其后。例如,</span>
"/music/bands/the_beatles/?print=true" <span style="FONT-FAMILY: 宋体">。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>is_secure()</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">如果请求是安全的,则返回</span> True <span style="FONT-FAMILY: 宋体">。也就是说,请求是以</span>HTTPS<span style="FONT-FAMILY: 宋体">的形式提交的。</span></p></td></tr></tbody></table>
<p><span id="cn14">QueryDict </span><span style="FONT-FAMILY: 宋体">对象</span> </p>
<p id="cn15"><span style="FONT-FAMILY: 宋体">在一个</span> HttpRequest <span style="FONT-FAMILY: 宋体">对象中,</span> GET <span style="FONT-FAMILY: 宋体">和</span>
POST <span style="FONT-FAMILY: 宋体">属性都是</span> django.http.QueryDict <span style="FONT-FAMILY: 宋体">的实例。</span> QueryDict <span style="FONT-FAMILY: 宋体">是一个类似于字典的类,专门用来处理用一个键的多值。当处理一些</span>HTML<span style="FONT-FAMILY: 宋体">表单中的元素,特别是</span> &lt;select multiple="multiple"&gt;
<span style="FONT-FAMILY: 宋体">之类传递同一</span>key<span style="FONT-FAMILY: 宋体">的多值的元素时,就需要这个类了。</span> </p>
<p id="cn16">QueryDict <span style="FONT-FAMILY: 宋体">实例是不可变的,除非创建了一个</span> copy()
<span style="FONT-FAMILY: 宋体">副本。也就是说不能直接更改</span> request.POST <span style="FONT-FAMILY: 宋体">和</span> request.GET <span style="FONT-FAMILY: 宋体">的属性。</span> </p>
<p id="cn17">QueryDict <span style="FONT-FAMILY: 宋体">实现了所有标准的字典的方法,因为它正是字典的一个子类。与其不同的东西都已在表</span>H-3<span style="FONT-FAMILY: 宋体">中列出。</span> </p>
<table style="WIDTH: 560px; BORDER-COLLAPSE: collapse; HEIGHT: 504px" id="cn18" border="1" cellpadding="0" cellspacing="0" width="560">
<thead>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm" colspan="2">
<p><span style="FONT-FAMILY: 宋体">表</span> H-3. QueryDicts <span style="FONT-FAMILY: 宋体">与标准字典的区别</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">方法</span></p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">与标准字典实现的不同</span></p></td></tr></thead>
<tbody>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>__getitem__</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">与一个字典一样。但是,当一个键有多个值时,</span> __getitem__()
<span style="FONT-FAMILY: 宋体">返回最后一个值。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>__setitem__</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">将所给键的值设为</span> <span style="FONT-FAMILY: 宋体">(一个只有一个</span> value <span style="FONT-FAMILY: 宋体">元素的</span> Python<span style="FONT-FAMILY: 宋体">列表)。</span> <span style="FONT-FAMILY: 宋体">注意,因对其它的字典函数有副作用,故它只能被称为一个可变的</span> QueryDict <span style="FONT-FAMILY: 宋体">(通过</span> copy() <span style="FONT-FAMILY: 宋体">创建)。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>get()</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">如果一个键多个值,和</span> __getitem__ <span style="FONT-FAMILY: 宋体">一样,</span> get() <span style="FONT-FAMILY: 宋体">返回最后一个值。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>update()</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">参数是一个</span> QueryDict <span style="FONT-FAMILY: 宋体">或标准字典。</span> <span style="FONT-FAMILY: 宋体">和标准字典的</span> </p>
<p>update <span style="FONT-FAMILY: 宋体">不同,这个方法</span>*<span style="FONT-FAMILY: 宋体">增加</span>*<span style="FONT-FAMILY: 宋体">而不是替换一项内容:</span> </p>
<div style="BORDER-BOTTOM: #94da3a 1pt solid; BORDER-LEFT: #94da3a 1pt solid; PADDING-BOTTOM: 4pt; PADDING-LEFT: 5pt; PADDING-RIGHT: 5pt; BORDER-TOP: #94da3a 1pt solid; BORDER-RIGHT: #94da3a 1pt solid; PADDING-TOP: 4pt">
<p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0cm">&gt;&gt;&gt;
q = QueryDict('a=1')</p>
<p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0cm">&gt;&gt;&gt;
q = q.copy() # <span style="FONT-FAMILY: 宋体">使其可变</span></p>
<p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0cm">&gt;&gt;&gt;
q.update({'a': '2'})</p>
<p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0cm">&gt;&gt;&gt;
q.getlist('a')</p>
<p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0cm">['1',
'2']</p>
<p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0cm">&gt;&gt;&gt;
q['a'] # <span style="FONT-FAMILY: 宋体">返回最后一个值</span></p>
<p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0cm">['2']</p></div></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>items()</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">和标准字典的</span> items() <span style="FONT-FAMILY: 宋体">方法一样,</span> <span style="FONT-FAMILY: 宋体">不同的是它和</span>
__getitem()__ <span style="FONT-FAMILY: 宋体">一样,返回最后一个值:</span></p>
<div style="BORDER-BOTTOM: #94da3a 1pt solid; BORDER-LEFT: #94da3a 1pt solid; PADDING-BOTTOM: 4pt; PADDING-LEFT: 5pt; PADDING-RIGHT: 5pt; BORDER-TOP: #94da3a 1pt solid; BORDER-RIGHT: #94da3a 1pt solid; PADDING-TOP: 4pt">
<p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0cm">&gt;&gt;&gt;
q = QueryDict('a=1&amp;a=2&amp;a=3')</p>
<p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0cm">&gt;&gt;&gt;
q.items()</p>
<p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0cm">[('a',
'3')]</p></div></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>values()</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">和标准字典的</span> values() <span style="FONT-FAMILY: 宋体">方法一样,</span> <span style="FONT-FAMILY: 宋体">不同的是它和</span>
__getitem()__ <span style="FONT-FAMILY: 宋体">一样,返回最后一个值。</span></p></td></tr></tbody></table>
<p id="cn21"><span style="FONT-FAMILY: 宋体">另外,</span> QueryDict <span style="FONT-FAMILY: 宋体">还有在表</span>H-4<span style="FONT-FAMILY: 宋体">中列出的方法。</span> </p>
<table style="WIDTH: 560px; BORDER-COLLAPSE: collapse; HEIGHT: 355px" id="cn22" border="1" cellpadding="0" cellspacing="0" width="560">
<thead>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm" colspan="2">
<p><span style="FONT-FAMILY: 宋体">表</span> H-4. <span style="FONT-FAMILY: 宋体">附加的</span> (<span style="FONT-FAMILY: 宋体">非字典的</span>)
QueryDict <span style="FONT-FAMILY: 宋体">方法</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">方法</span></p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">描述</span></p></td></tr></thead>
<tbody>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>copy()</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">返回一个对象的副本,使用的是</span>Python<span style="FONT-FAMILY: 宋体">标准库中的</span> copy.deepcopy() <span style="FONT-FAMILY: 宋体">。</span> <span style="FONT-FAMILY: 宋体">该副本是可变的,也就是说,你能改变它的值。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>getlist(key)</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">以</span>Python<span style="FONT-FAMILY: 宋体">列表的形式返回所请求键的数据。若键不存在则返回空列表。它保证了一定会返回某种形式的</span>list<span style="FONT-FAMILY: 宋体">。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>setlist(key, list_)</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">将所给键的键值设为</span> list_ <span style="FONT-FAMILY: 宋体">(与</span> __setitem__() <span style="FONT-FAMILY: 宋体">不同)。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>appendlist(key, item)</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">在</span> key <span style="FONT-FAMILY: 宋体">相关的</span>list<span style="FONT-FAMILY: 宋体">上增加</span>
item <span style="FONT-FAMILY: 宋体">。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>setlistdefault(key, l)</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">和</span> setdefault <span style="FONT-FAMILY: 宋体">一样,</span> <span style="FONT-FAMILY: 宋体">不同的是它的第二个参数是一个列表,而不是一个值。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>lists()</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">和</span> items() <span style="FONT-FAMILY: 宋体">一样,</span> <span style="FONT-FAMILY: 宋体">不同的是它以一个列表的形式返回字典每一个成员的所有值。</span> <span style="FONT-FAMILY: 宋体">例如:</span></p>
<div style="BORDER-BOTTOM: #94da3a 1pt solid; BORDER-LEFT: #94da3a 1pt solid; PADDING-BOTTOM: 4pt; PADDING-LEFT: 5pt; PADDING-RIGHT: 5pt; BORDER-TOP: #94da3a 1pt solid; BORDER-RIGHT: #94da3a 1pt solid; PADDING-TOP: 4pt">
<p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0cm">&gt;&gt;&gt;
q = QueryDict('a=1&amp;a=2&amp;a=3')</p>
<p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0cm">&gt;&gt;&gt;
q.lists()</p>
<p style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0cm">[('a',
['1', '2', '3'])]</p></div></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>urlencode()</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">返回一个请求字符串格式的数据字符串(如,</span>
"a=2&amp;b=3&amp;b=5" <span style="FONT-FAMILY: 宋体">)。</span></p></td></tr></tbody></table>
<p><span id="cn25">一个完整的例子</span> </p>
<p id="cn26"><span style="FONT-FAMILY: 宋体">例如</span>, <span style="FONT-FAMILY: 宋体">给定这个</span>HTML<span style="FONT-FAMILY: 宋体">表单</span>:
</p>
<p><span style="COLOR: #008000">&lt;form action="/foo/bar/"
method="post"&gt;</span></p>
<p><span style="COLOR: #008000">&lt;input type="text" name="your_name"
/&gt;</span></p>
<p><span style="COLOR: #008000">&lt;select multiple="multiple"
name="bands"&gt;</span></p>
<p><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp; &lt;option value="beatles"&gt;The
Beatles&lt;/option&gt;</span></p>
<p><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp; &lt;option value="who"&gt;The
Who&lt;/option&gt;</span></p>
<p><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp; &lt;option value="zombies"&gt;The
Zombies&lt;/option&gt;</span></p>
<p><span style="COLOR: #008000">&lt;/select&gt;</span></p>
<p><span style="COLOR: #008000">&lt;input type="submit" /&gt;</span></p>
<p><span style="COLOR: #008000">&lt;/form&gt;</span></p>
<p id="cn29"><span style="FONT-FAMILY: 宋体">如果用户在</span> your_name <span style="FONT-FAMILY: 宋体">中输入</span> "John Smith" <span style="FONT-FAMILY: 宋体">,并且在多选框中同时选择了</span>The Beatles<span style="FONT-FAMILY: 宋体">和</span>The Zombies<span style="FONT-FAMILY: 宋体">,那么以下就是</span>Django<span style="FONT-FAMILY: 宋体">的</span>request<span style="FONT-FAMILY: 宋体">对象所拥有的:</span> </p>
<p><span style="COLOR: #008000">&gt;&gt;&gt; request.GET</span></p>
<p><span style="COLOR: #008000">{}</span></p>
<p><span style="COLOR: #008000">&gt;&gt;&gt; request.POST</span></p>
<p><span style="COLOR: #008000">{'your_name': ['John Smith'], 'bands':
['beatles', 'zombies']}</span></p>
<p><span style="COLOR: #008000">&gt;&gt;&gt;
request.POST['your_name']</span></p>
<p><span style="COLOR: #008000">'John Smith'</span></p>
<p><span style="COLOR: #008000">&gt;&gt;&gt; request.POST['bands']</span></p>
<p><span style="COLOR: #008000">'zombies'</span></p>
<p><span style="COLOR: #008000">&gt;&gt;&gt;
request.POST.getlist('bands')</span></p>
<p><span style="COLOR: #008000">['beatles', 'zombies']</span></p>
<p><span style="COLOR: #008000">&gt;&gt;&gt; request.POST.get('your_name',
'Adrian')</span></p>
<p><span style="COLOR: #008000">'John Smith'</span></p>
<p><span style="COLOR: #008000">&gt;&gt;&gt;
request.POST.get('nonexistent_field', 'Nowhere Man')</span></p>
<p><span style="COLOR: #008000">'Nowhere Man'</span></p>
<p id="cn32"><span style="FONT-FAMILY: 宋体">使用时请注意</span>: </p>
<p id="cn33">GET , POST , COOKIES , FILES , META , REQUEST , raw_post_data <span style="FONT-FAMILY: 宋体">和</span> user <span style="FONT-FAMILY: 宋体">这些属性都是延迟加载的。</span> <span style="FONT-FAMILY: 宋体">也就是说除非代码中访问它们,否则</span>Django<span style="FONT-FAMILY: 宋体">并不会花费资源来计算这些属性值。</span> </p>
<p><span id="cn34">HttpResponse </span></p>
<p id="cn35"><span style="FONT-FAMILY: 宋体">与</span>Django<span style="FONT-FAMILY: 宋体">自动创建的</span> HttpRequest <span style="FONT-FAMILY: 宋体">对象相比,</span> HttpResponse <span style="FONT-FAMILY: 宋体">对象则是由你创建的。你创建的每个视图都需要实例化,处理和返回一个</span> HttpResponse
<span style="FONT-FAMILY: 宋体">对象。</span> </p>
<p id="cn36">HttpResponse <span style="FONT-FAMILY: 宋体">类存在于</span>
django.http.HttpResponse <span style="FONT-FAMILY: 宋体">。</span> </p>
<p><span id="cn37">构造</span>HttpResponse </p>
<p id="cn38"><span style="FONT-FAMILY: 宋体">一般情况下,你创建一个</span> HttpResponse <span style="FONT-FAMILY: 宋体">时,以字符串的形式来传递页面的内容给</span> HttpResponse <span style="FONT-FAMILY: 宋体">的构造函数:</span> </p>
<p>&gt;&gt;&gt; response = HttpResponse("Here's the text of the Web page.")</p>
<p>&gt;&gt;&gt; response = HttpResponse("Text only, please.",
mimetype="text/plain")</p>
<p id="cn41"><span style="FONT-FAMILY: 宋体">但是如果希望逐渐增加内容,则可以把</span> response <span style="FONT-FAMILY: 宋体">当作一个类文件对象使用:</span> </p>
<p>&gt;&gt;&gt; response = HttpResponse()</p>
<p>&gt;&gt;&gt; response.write("&lt;p&gt;Here's the text of the Web
page.&lt;/p&gt;")</p>
<p>&gt;&gt;&gt; response.write("&lt;p&gt;Here's another
paragraph.&lt;/p&gt;")</p>
<p id="cn44"><span style="FONT-FAMILY: 宋体">你可以将一个迭代器传递给</span> HttpResponse <span style="FONT-FAMILY: 宋体">,而不是固定的字符串。如果你要这样做的话,请遵循以下规则:</span> </p>
<p id="cn45"><span style="FONT-FAMILY: 宋体">迭代器应返回字符串。</span> </p>
<p id="cn46"><span style="FONT-FAMILY: 宋体">若一个</span> HttpResponse <span style="FONT-FAMILY: 宋体">已经通过实例化,并以一个迭代器作为其内容,就不能以一个类文件对象使用</span> HttpResponse
<span style="FONT-FAMILY: 宋体">实例。这样做的话,会导致一个</span> Exception <span style="FONT-FAMILY: 宋体">。</span> </p>
<p id="cn47"><span style="FONT-FAMILY: 宋体">最后,注意</span> HttpResponse <span style="FONT-FAMILY: 宋体">实现了一个</span> write() <span style="FONT-FAMILY: 宋体">方法,使其可以在任何可以使用类文件对象的地方使用。这方面的例子见第</span>11<span style="FONT-FAMILY: 宋体">章。</span> </p>
<p><span id="cn48">设置</span> Headers </p>
<p id="cn49"><span style="FONT-FAMILY: 宋体">您可以使用字典一样地添加和删除头信息。</span> </p>
<p>&gt;&gt;&gt; response = HttpResponse()</p>
<p>&gt;&gt;&gt; response['X-DJANGO'] = "It's the best."</p>
<p>&gt;&gt;&gt; del response['X-PHP']</p>
<p>&gt;&gt;&gt; response['X-DJANGO']</p>
<p>"It's the best."</p>
<p id="cn52"><span style="FONT-FAMILY: 宋体">你也可以使用</span> has_header(header) <span style="FONT-FAMILY: 宋体">来检查一个头信息项是否存在。</span> </p>
<p id="cn53"><span style="FONT-FAMILY: 宋体">请避免手工设置</span> Cookie <span style="FONT-FAMILY: 宋体">头,参见第</span>12<span style="FONT-FAMILY: 宋体">章</span>Django<span style="FONT-FAMILY: 宋体">中</span>cookie<span style="FONT-FAMILY: 宋体">工作原理的说明。</span> </p>
<p><span id="cn54">HttpResponse</span><span style="FONT-FAMILY: 宋体">的子类</span>
</p>
<p id="cn55">Django<span style="FONT-FAMILY: 宋体">包含许多处理不同类型的</span>HTTP<span style="FONT-FAMILY: 宋体">请求的</span> HttpResponse <span style="FONT-FAMILY: 宋体">子类(见表</span>H-5<span style="FONT-FAMILY: 宋体">)。像</span>
HttpResponse <span style="FONT-FAMILY: 宋体">一样,这些类在</span> django.http <span style="FONT-FAMILY: 宋体">中。</span> </p>
<table style="WIDTH: 560px; BORDER-COLLAPSE: collapse; HEIGHT: 369px" id="cn56" border="1" cellpadding="0" cellspacing="0" width="560">
<thead>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm" colspan="2">
<p><span style="FONT-FAMILY: 宋体">表</span> H-5. HttpResponse <span style="FONT-FAMILY: 宋体">子类</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">类名</span></p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">描述</span></p></td></tr></thead>
<tbody>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>HttpResponseRedirect</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">构造函数的参数有一个:重定向的路径。</span> <span style="FONT-FAMILY: 宋体">它可以是一个完整的</span>URL <span style="FONT-FAMILY: 宋体">(例如,</span> 'http://search.yahoo.com/' <span style="FONT-FAMILY: 宋体">)或者不包括域名的绝对路径(如</span> '/search/' <span style="FONT-FAMILY: 宋体">)。</span> <span style="FONT-FAMILY: 宋体">注意它返回</span>
HTTP <span style="FONT-FAMILY: 宋体">状态码</span> 302<span style="FONT-FAMILY: 宋体">。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>HttpResponsePermanentRedirect</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">类似</span> HttpResponseRedirect <span style="FONT-FAMILY: 宋体">,</span> <span style="FONT-FAMILY: 宋体">但是它返回一个永久转义</span> <span style="FONT-FAMILY: 宋体">(</span>HTTP <span style="FONT-FAMILY: 宋体">状态码</span>
301<span style="FONT-FAMILY: 宋体">),而不是暂时性转移(状态码</span>302<span style="FONT-FAMILY: 宋体">)。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>HttpResponseNotModified</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">构造函数没有任何参数。用它来表示这个页面在上次请求后未改变。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>HttpResponseBadRequest</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">类似</span> HttpResponse <span style="FONT-FAMILY: 宋体">,但使用</span>400<span style="FONT-FAMILY: 宋体">状态码。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>HttpResponseNotFound</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">类似</span> HttpResponse <span style="FONT-FAMILY: 宋体">,但使用</span>404<span style="FONT-FAMILY: 宋体">状态码。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>HttpResponseForbidden</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">类似</span> HttpResponse <span style="FONT-FAMILY: 宋体">,但使用</span>403<span style="FONT-FAMILY: 宋体">状态码。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>HttpResponseNotAllowed</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">类似</span> HttpResponse <span style="FONT-FAMILY: 宋体">,但使用</span>405<span style="FONT-FAMILY: 宋体">状态码。它必须有一个参数:允许方法的列表。(例如,</span> ['GET', 'POST'] <span style="FONT-FAMILY: 宋体">)。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>HttpResponseGone</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">类似</span> HttpResponse <span style="FONT-FAMILY: 宋体">,但使用</span>410<span style="FONT-FAMILY: 宋体">状态码。</span></p></td></tr>
<tr>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p>HttpResponseServerError</p></td>
<td style="PADDING-BOTTOM: 0cm; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; PADDING-TOP: 0cm">
<p><span style="FONT-FAMILY: 宋体">类似</span> HttpResponse <span style="FONT-FAMILY: 宋体">,但使用</span>500<span style="FONT-FAMILY: 宋体">状态码。</span></p></td></tr></tbody></table>
<p id="cn59"><span style="FONT-FAMILY: 宋体">当然,如果框架不支持一些特性,你也可以定义自己的</span>
HttpResponse <span style="FONT-FAMILY: 宋体">子类来处理不同的请求。</span> </p>
<p><span id="cn60">返回错误</span> </p>
<p id="cn61"><span style="FONT-FAMILY: 宋体">在</span>Django<span style="FONT-FAMILY: 宋体">中返回</span>HTTP<span style="FONT-FAMILY: 宋体">错误代码很容易。我们前面已经提到</span> HttpResponseNotFound <span style="FONT-FAMILY: 宋体">,</span> HttpResponseForbidden <span style="FONT-FAMILY: 宋体">,</span> HttpResponseServerError <span style="FONT-FAMILY: 宋体">,和其它子类。为了更好地表示一个错误,只要返回这些子类之一的一个实例,而不是一个通常的</span>
HttpResponse <span style="FONT-FAMILY: 宋体">,例如:</span> </p>
<p><span style="COLOR: #008000">def my_view(request):</span></p>
<p><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp; # ...</span></p>
<p><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp; if foo:</span></p>
<p><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return
HttpResponseNotFound('&lt;h1&gt;Page not found&lt;/h1&gt;')</span></p>
<p><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp; else:</span></p>
<p><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return HttpResponse('&lt;h1&gt;Page was
found&lt;/h1&gt;')</span></p>
<p id="cn64"><span style="FONT-FAMILY: 宋体">至今为止,</span>404<span style="FONT-FAMILY: 宋体">错误是最常见的</span>HTTP<span style="FONT-FAMILY: 宋体">错误,有一种更容易的方式来处理。</span> </p>
<p id="cn65"><span style="FONT-FAMILY: 宋体">当返回一个错误,比如</span> HttpResponseNotFound
<span style="FONT-FAMILY: 宋体">时,需要定义错误页面的</span>HTML<span style="FONT-FAMILY: 宋体">:</span> </p>
<p>return HttpResponseNotFound('&lt;h1&gt;Page not found&lt;/h1&gt;')</p>
<p id="cn68"><span style="FONT-FAMILY: 宋体">为了方便,而且定义一个通用的应用于网站的</span>404<span style="FONT-FAMILY: 宋体">错误页面也是一个很好的选择,</span>Django<span style="FONT-FAMILY: 宋体">提供了一个</span> Http404 <span style="FONT-FAMILY: 宋体">异常。如果在视图的任何地方引发</span> Http404 <span style="FONT-FAMILY: 宋体">异常,</span>Django<span style="FONT-FAMILY: 宋体">就会捕获错误并返回应用程序的标准错误页面,当然,还有</span>HTTP<span style="FONT-FAMILY: 宋体">错误代码</span>404<span style="FONT-FAMILY: 宋体">。</span>
</p>
<p id="cn69"><span style="FONT-FAMILY: 宋体">例如:</span> </p>
<p><span style="COLOR: #008000">from django.http import Http404</span></p>
<p><span style="COLOR: #008000">def detail(request, poll_id):</span></p>
<p><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp; try:</span></p>
<p><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p =
Poll.objects.get(pk=poll_id)</span></p>
<p><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp; except Poll.DoesNotExist:</span></p>
<p><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raise Http404</span></p>
<p><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp; return
render_to_response('polls/detail.html', {'poll': p})</span></p>
<p id="cn72"><span style="FONT-FAMILY: 宋体">为了完全发挥出</span> Http404 <span style="FONT-FAMILY: 宋体">的功能,应创建一个模板,在</span>404<span style="FONT-FAMILY: 宋体">错误被引发时显示。模板的名字应该是</span> 404.html <span style="FONT-FAMILY: 宋体">,而且应该位于模板树的最高层。</span> </p>
<p><span id="cn73">自定义</span> 404 (<span style="FONT-FAMILY: 宋体">无法找到</span>)
<span style="FONT-FAMILY: 宋体">视图</span> </p>
<p id="cn74"><span style="FONT-FAMILY: 宋体">当引发</span> Http404 <span style="FONT-FAMILY: 宋体">异常,</span>Django<span style="FONT-FAMILY: 宋体">加载一个专门处理</span>404<span style="FONT-FAMILY: 宋体">错误的视图。默认情况下,这个视图是</span>
django.views.defaults.page_not_found <span style="FONT-FAMILY: 宋体">,它会加载并显示模板</span> 404.html <span style="FONT-FAMILY: 宋体">。</span> </p>
<p id="cn75"><span style="FONT-FAMILY: 宋体">这意味着需要在根模板目录定义一个</span> 404.html <span style="FONT-FAMILY: 宋体">模板。这个模板会作用于所有</span>404<span style="FONT-FAMILY: 宋体">错误。</span> </p>
<p id="cn76"><span style="FONT-FAMILY: 宋体">视图</span> page_not_found <span style="FONT-FAMILY: 宋体">适用于</span>99%<span style="FONT-FAMILY: 宋体">的网站应用程序,但若是希望重载该视图,可以在</span>URLconf<span style="FONT-FAMILY: 宋体">中指定</span> handler404 <span style="FONT-FAMILY: 宋体">,就像这样:</span> </p>
<p><span style="COLOR: #008000">from django.conf.urls.defaults import
*</span></p>
<p><span style="COLOR: #008000">urlpatterns = patterns('',</span></p>
<p><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp; ...</span></p>
<p><span style="COLOR: #008000">)</span></p>
<p><span style="COLOR: #008000">handler404 =
'mysite.views.my_custom_404_view'</span></p>
<p id="cn79"><span style="FONT-FAMILY: 宋体">后台执行时,</span>Django<span style="FONT-FAMILY: 宋体">以</span> handler404 <span style="FONT-FAMILY: 宋体">来确定</span>404<span style="FONT-FAMILY: 宋体">视图。默认情况下,</span>URLconf<span style="FONT-FAMILY: 宋体">包含以下内容:</span> </p>
<p>from django.conf.urls.defaults import *</p>
<p id="cn82"><span style="FONT-FAMILY: 宋体">这句话负责当前模块中的</span> handler404 <span style="FONT-FAMILY: 宋体">设置。正如你所见,在</span> django/conf/urls/defaults.py <span style="FONT-FAMILY: 宋体">中,</span> handler404 <span style="FONT-FAMILY: 宋体">默认被设为</span> 'django.views.defaults.page_not_found'
<span style="FONT-FAMILY: 宋体">。</span> </p>
<p id="cn83"><span style="FONT-FAMILY: 宋体">关于</span>404<span style="FONT-FAMILY: 宋体">视图,有三点需要注意:</span> </p>
<p id="cn84"><span style="FONT-FAMILY: 宋体">当</span>Django<span style="FONT-FAMILY: 宋体">在</span>URLconf<span style="FONT-FAMILY: 宋体">无法找到匹配的正则表达式时,</span>404<span style="FONT-FAMILY: 宋体">视图会显示。</span> </p>
<p id="cn85"><span style="FONT-FAMILY: 宋体">如果没有定义自己的</span>404<span style="FONT-FAMILY: 宋体">视图,而只是简单地使用默认的视图,此时就需要在模板目录的根目录创建一个</span> 404.html
<span style="FONT-FAMILY: 宋体">模板。默认的</span>404<span style="FONT-FAMILY: 宋体">视图会对所有</span>404<span style="FONT-FAMILY: 宋体">错误使用改模板。</span> </p>
<p id="cn86"><span style="FONT-FAMILY: 宋体">若</span> DEBUG <span style="FONT-FAMILY: 宋体">被设为</span> True <span style="FONT-FAMILY: 宋体">(在</span>settings<span style="FONT-FAMILY: 宋体">模块内),则</span>404<span style="FONT-FAMILY: 宋体">视图不会被使用,此时显示的是跟踪信息。</span> </p>
<p><span id="cn87">自定义</span> 500 (<span style="FONT-FAMILY: 宋体">服务器错误</span>)
<span style="FONT-FAMILY: 宋体">视图</span> </p>
<p id="cn88"><span style="FONT-FAMILY: 宋体">同样地,若是在试图代码中出现了运行时错误,</span>Django<span style="FONT-FAMILY: 宋体">会进行特殊情况处理。如果视图引发了一个异常,</span>Django<span style="FONT-FAMILY: 宋体">会默认访问视图</span> django.views.defaults.server_error <span style="FONT-FAMILY: 宋体">,加载并显示模板</span> 500.html <span style="FONT-FAMILY: 宋体">。</span> </p>
<p id="cn89"><span style="FONT-FAMILY: 宋体">这意味着需要在根模板目录定义一个</span> 500.html <span style="FONT-FAMILY: 宋体">模板。该模板作用于所有服务器错误。</span> </p>
<p id="cn90"><span style="FONT-FAMILY: 宋体">视图</span> server_error <span style="FONT-FAMILY: 宋体">适用于</span>99%<span style="FONT-FAMILY: 宋体">的网站应用程序,但若是希望重载该视图,可以在</span>URLconf<span style="FONT-FAMILY: 宋体">中指定</span> handler500 <span style="FONT-FAMILY: 宋体">,就像这样:</span> </p>
<p><span style="COLOR: #008000">from django.conf.urls.defaults import
*</span></p>
<p><span style="COLOR: #008000">urlpatterns = patterns('',</span></p>
<p><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp; ...</span></p>
<p><span style="COLOR: #008000">)</span></p>
<p><span style="COLOR: #008000">handler500 =
'mysite.views.my_custom_error_view'</span></p>
               
               
               
               
页: [1]
查看完整版本: HTTP请求(Request)和回应(Response)对象