【转】Django中的request与response对象

时间:2023-03-08 21:21:26
【转】Django中的request与response对象
关于request与response

前面几个 Sections 介绍了关于 Django 请求(Request)处理的流程分析,我们也了解到,Django 是围绕着 Request 与 Response 进行处理,也就是无外乎“求”与“应”。

当请求一个页面时,Django 把请求的 metadata 数据包装成一个 HttpRequest 对象,然后 Django 加载合适的 view 方法,把这个 HttpRequest 对象作为第一个参数传给 view 方法。任何 view 方法都应该返回一个 HttpResponse 对象。

【转】Django中的request与response对象

HttpRequest

HttpRequest 对象表示来自某客户端的一个单独的 HTTP 请求。HttpRequest 对象是 Django 自动创建的。

它的属性有很多,可以参考 DjangoBook,比较常用的有以下几个:

1. method 请求方法,如:

if request.method == "POST":
......
elif request.mehtod =="GET":
......

2. 类字典对象GET、POST

3. COOKIES,字典形式

4. user:

一个django.contrib.auth.models.User 对象表示当前登录用户,若当前用户尚未登录,user会设为django.contrib.auth.models.AnonymousUser的一个实例。

可以将它们与is_authenticated()区分开:

if request.user.is_authenticated():
....
else:
....

5. session、字典形式

6. request.META

具体可以参考《request.META里包含了哪些数据?》

request.META 是一个 Python 字典,包含了所有本次 HTTP 请求的 Header 信息,比如用户 IP 地址和用户 Agent(通常是浏览器的名称和版本号)。注意,Header 信息的完整列表取决于用户所发送的 Header 信息和服务器端设置的 Header 信息。 这个字典中几个常见的键值有:

  • HTTP_REFERRER:进站前链接网页,如果有的话
  • HTTP_USER_AGENT,用户浏览器的user-agent字符串,如果有的话。 例如: "Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17" .
  • REMOTE_ADDR 客户端IP,如:"12.345.67.89" 。(如果申请是经过代理服务器的话,那么它可能是以逗号分割的多个IP地址,如:"12.345.67.89,23.456.78.90" 。)
  • ……
def request_test(request):
context={}
try:
http_referer=request.META['HTTP_REFERRER']
http_user_agent=request.META['HTTP_USER_AGENT']
remote_addr=request.META['REMOTE_ADDR']
return HttpResponse('[http_user_agent]:%s,[remote_addr]=%s' %(http_user_agent,remote_addr))
except Exception,e:
return HttpResponse("Error:%s" %e)

注意:GET、POST属性都是django.http.QueryDict的实例,在DjangoBook可具体了解。

HttpResponse

Request 和 Response 对象起到了服务器与客户机之间的信息传递作用。Request 对象用于接收客户端浏览器提交的数据,而 Response 对象的功能则是将服务器端的数据发送到客户端浏览器。

比如在 view 层,一般都是以下列代码结束一个 def:

return HttpResponse(html)
return render_to_response('nowamagic.html', {'data': data})

对于 HttpRequest 对象来说,是由 Django 自动创建, 但是,HttpResponse 对象就必须我们自己创建。每个 View 方法必须返回一个 HttpResponse 对象。HttpResponse 类在 django.http.HttpResponse。

1.构造 HttpRequest

HttpResponse 类存在于 django.http.HttpResponse,以字符串的形式传递给页面。一般地,你可以通过给 HttpResponse 的构造函数传递字符串表示的页面内容来构造 HttpResponse 对象:

>>> response = HttpResponse()
>>> response.write("<p>Welcome to nowamagic.net.</p>")
>>> response.write("<p>Here's another paragraph.</p>")

但是如果想要增量添加内容, 你可以把response当作filelike对象使用:

>>> response = HttpResponse()
>>> response['X-DJANGO'] = "It's the best."
>>> del response['X-PHP']
>>> response['X-DJANGO']
"It's the best."

也可以给 HttpResponse 传递一个 iterator 作为参数,而不用传递硬编码字符串。 如果你使用这种技术,下面是需要注意的一些事项:

  • iterator 应该返回字符串。
  • 如果 HttpResponse 使用 iterator 进行初始化,就不能把 HttpResponse 实例作为 filelike 对象使用。这样做将会抛出异常。

最后,再说明一下,HttpResponse 实现了 write() 方法,可以在任何需要 filelike 对象的地方使用 HttpResponse 对象。

2. 设置 Headers

你可以使用字典语法添加,删除 headers:

>>> response = HttpResponse()
>>> response['X-DJANGO'] = "It's the best."
>>> del response['X-PHP']
>>> response['X-DJANGO']
"It's the best."

3. HttpResponse子类

主要是对一些404、500等错误页面的处理。

Table H-5. HttpResponse Subclasses

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 the user’s last request.

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子类。