============================ Request对象和response 对象 ============================ :作者: Django 团队 :译者: weizhong2004@gmail.com :翻译开始日期: 2006-03-30 :翻译结束日期: 2006-03-30 :最后修订日期: 2006-05-11 :原文版本: 2786 概述 ============== Django 使用 request 和 response 对象表示系统状态数据.. 当请求一个页面时,Django创建一个 ``HttpRequest`` 对象.该对象包含 request 的元数据. 然后 Django 调用相应的 view 函数(``HttpRequest`` 对象自动传递给该view函数<作为第一个参数>), 每一个 view 负责返回一个 ``HttpResponse`` 对象. 本文档解释了 ``HttpRequest`` 和 ``HttpResponse`` 对象的 API. HttpRequest 对象 =================== 属性 ---------- 除了 session 以外的其它属性都应该被看作是只读的. ``path`` 一个字符串表示请求页的路径全名(不包括域名). Example: ``"/music/bands/the_beatles/"`` ``GET`` 可以认为是一个字典对象,包括所有的 HTTP GET 参数,参见下面的 ``QueryDict`` 文档. ``POST`` 可以认为是一个字典对象,包括所有的 HTTP POST 参数,参见下面的 ``QueryDict`` 文档. **注意:** ``POST`` *不* 包括文件上载信息, 参阅 ``FILES``. ``REQUEST`` 为了使用方便,该对象也可以认为是一个字典对象,它包括所有 POST 和 GET 数据(先POST,后GET). (灵感来自PHP中的 $_REQUEST 全局变量). 举例: 如果 ``GET={"name":"john"}``, ``POST={"AGE":"34"}`` 则 ``REQUEST["name"]="john"``, ``REQUEST["age"]="34"``. 强烈建议你使用 GET 或 POST 而不是 REQUEST,因为前者更清晰. ``COOKIES`` 是一个标准的Python字典,包括所有的cookie. 键和值都是字符串. ``FILES`` 可以看作是一个字典对象,它包含所有的上载文件. FILES中的每个键是 中name 的值,每个值是一个标准的Python字典,该字典有以下三个键: * filename -- 上传文件的文件名,一个python 字符串 * content-type 上传文件的 content type * content 上传文件的原始内容 注意 FILES 只有在请求方式为 POST 并且表单包括 enctype="multipart/form-data" 属性时才会有数据,否则 FILES 就是一个空的类似字典的对象. ``META`` META是一个标准的Python字典,包含所有可能的 HTTP 头. 可用的 header 依赖客户机和服务器,下面是某些可能的值: * CONTENT_LENGTH * CONTENT_TYPE * HTTP_ACCEPT_ENCODING * HTTP_ACCEPT_LANGUAGE * HTTP_REFERER 引用页,如果有的话 * HTTP_USER_AGENT 客户机用户代理字符串 * QUERY_STRING 查询字符串,单一的未解析的字符串 * REMOTE_ADDR 客户机IP地址 * REMOTE_HOST 客户机hostname * REQUEST_METHOD 请求方式,比如 GET 或 POST * SERVER_NAME 服务器 hostname * SERVER_PORT 服务器端口 ``user`` 一个 django.contrib.auth.users.User 对象, 表示当前登录用户.如果当前没有用户登录, user 被设置成 `django.contrib.auth.models.AnonymousUser` 的一个实例.你可以用 is_anonymous() 来区分登录用户和未登录用户.就象下面这样:: if request.user.is_anonymous(): # Do something for anonymous users. else: # Do something for logged-in users. 只有你的 Django 激活了 ``AuthenticationMiddleware`` 之后 ``user`` 对象才可用. 参阅 `Authentication in Web requests`_. .. Authentication in Web requests: http://www.djangoproject.com/documentation/authentication/#authentication-in-web-requests ``session`` 一个可读写的,类似字典的对象,表示当前的 session. 当有你的django 安装包括session支持并且被激活,该对象才存在.要了解关于session的更多细节,阅读session文档: http://www.djangoproject.com/documentation/sessions/ ``raw_post_data`` 原始 HTTP POST 数据. 该属性仅用于POST数据的高级处理. 更多时候你只需要 POST 对象. 方法 ------- ``__getitem__(key)`` 根据给定的键,返回一个 GET/POST 值. 该方法首先检查 POST,然后是 GET. 若给定的键未找到,引发 ``KeyError`` 异常 这使得你能够使用访问字典的语法来存取 ``HttpRequest`` 实例. 举例来说: 无论 ``request.POST`` 有一个 ``"foo"`` 键还是 ``request.GET`` 有一个 ``"foo"`` 键,``request["foo"]`` 都会返回相应的值. ``has_key()`` 返回 ``True`` 或 ``False`` . ``get_full_path()`` 返回一个路径,包括query字符串. Example: ``"/music/bands/the_beatles/?print=true"`` QueryDict 对象 ----------------- 在一个 HttpRequest 对象中, GET和POST属性都是 ``django.http.QueryDict`` 的实例. ``QueryDict`` 是一个类似字典的类,被设计成可以处理同一个键有多个值的情况.这是很必要的,因为有些 HTML 表单元素,特别是`` 若用户输入了 "John Smith" 在 your_name 框并且选择在多选框中同时选中了 The Beatles 和 The Zombies, 然后点击 Submit, Django的request对象将拥有:: >>> 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' 实现备注 -------------------- ``GET``, ``POST``, ``COOKIES``, ``FILES``, ``META``, ``REQUEST``,``raw_post_data`` 及 ``user`` 属性都是惰性的.也就是说在你要求得到他们的值之前,django并不花费时间计算他们的值.只有你需要时,才实时计算出你要的值给你.简单来说,就象 xrange 函数. HttpResponse 对象 ==================== 对应着 ``HttpRequest`` 对象, ``HttpResponse`` 对象也是 Django自动生成的. 该对象包含你的响应. 你写的每一个view都是可响应的并且返回一个 ``HttpResponse`` 对象. ``HttpResponse`` 类定义在 ``django.http`` 中. 用法 ----- 传递字符串 ~~~~~~~~~~~~ 典型的用法就是将页面的内容作为字符串传递给 ``HpptResponse`` 构造函数:: >>> response = HttpResponse("Here's the text of the Web page.") >>> response = HttpResponse("Text only, please.", mimetype="text/plain") 如果你需要随时增加内容,你可以象使用一个文件一样来使用 response 对象:: >>> response = HttpResponse() >>> response.write("

Here's the text of the Web page.

") >>> response.write("

Here's another paragraph.

") 你可以使用字典语法添加或删除headers:: >>> response = HttpResponse() >>> response['X-DJANGO'] = "It's the best." >>> del response['X-PHP'] >>> response['X-DJANGO'] "It's the best." 注意:即使该header 不存在, del 也不会引发 ``KeyError`` 异常. 传递迭代器 ~~~~~~~~~~~~~~~~~ 最后一点,允许将一个迭代器传递给 ``HttpResponse`` 对象. 如果打算使用这一技术, 只需要遵守以下规则: * 迭代器必须返回字符串 * 如果一个 ``HttpResponse`` 实例使用一个迭代器进行了初始化, 该实例就不允许再以类似文件操作的方式来访问.否则就会引发异常. 方法 ------- ``__init__(content='', mimetype=DEFAULT_MIME_TYPE)`` 根据你提供的页面内容(一个字符串)和MIME类型,初始化一个 ``HttpResponse`` 对象.默认的MIME类型是 ``'text/html'``. ``content`` 可以是一个迭代对象或者是一个字符串. 如果它是一个迭代对象, 它应该返回字符串, 并且这些字符串连接起来能够形成 response 的内容. ``__setitem__(header, value)`` ``header`` 和 ``value`` 都是字符串,将给定的header设置为给定的 ``value``. ``__delitem__(header)`` 删除给定名字的header 如果header不存在,则静默.header是大小写敏感的.. ``__getitem__(header)`` 返回给定header的值,大小写敏感. ``has_header(header)`` 检查给定header是否存在(大小写敏感),返回 ``True ``或``False``. ``set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None)`` 设置一个cookie 参数与Python标准库中的 cookie Morsel 对象一样 * max_age是一个秒数, None表示只要浏览器不关就一直存在. * expires 是一个这种格式的字符串: "Wdy, DD-Mon-YY HH:MM:SS GMT". * 如果你要设置一个跨域名的cookie,使用 domain . 举例来说: domain=".lawrence.com" 将设置一个cookie 可以被 www.lawrence.com blogs.lawrence.com 和calendars.lawrence.com 等类似的域名读取. 否则,一个cookie 只能被当前域名读取. .. _`cookie Morsel`: http://www.python.org/doc/current/lib/morsel-objects.html ``delete_cookie(key)`` 删除给定key的cookie,若该key不存在,静默. ``content`` 以一个Python字符串的形式返回页面内容,如果需要,将其改造为unicode对象返回.注意它是一个 property ,不是一个方法. 使用 ``r.content`` 而不是 ``r.content()``. ``write(content)``, ``flush()`` and ``tell()`` 这几个方法将HttpResponse实例改造成为一个类似文件的对象. HttpResponse 子类 ----------------------- Django包括一系列 ``HttpResponse`` 子类处理不同的HTTP请求.象 ``HttpResponse`` 一样,这些子类都在 ``django.http`` 中定义. ``HttpResponseRedirect`` 该类的构造函数只接受一个参数--要重定向的路径. 该路径可以是一个 URL 全称(如 ``'http://www.google.com'`` ) 也可以是一个不包括域名的绝对 URL (如 ``'/search/'`` ). 注意它返回一个 HTTP 状态码 302. ``HttpResponsePermanentRedirect`` 类似 ``HttpResponseRedirect``, 不过它返回一个持久化重定向(HTTP状态码301),而不是一个 found 重定向(状态码302). ``HttpResponseNotModified`` 该类的构造函数不接受任何参数,表示一个页面从用户最后一次请示以来未做任何改动. ``HttpResponseNotFound`` 类似 ``HttpResponse`` 不过使用 404 状态码. ``HttpResponseForbidden`` 类似 ``HttpResponse`` 不过使用 403 状态码. ``HttpResponseGone`` 类似 ``HttpResponse`` 不过使用 410 状态码. ``HttpResponseServerError`` 类似 ``HttpResponse`` 不过使用 500 状态码.