Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29318904
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Python/Ruby

2009-08-12 12:52:39

Django 使用 request 和 response 对象表示系统状态数据..

当请求一个页面时,Django创建一个 HttpRequest 对象.该对象包含 request 的元数据. 然后 Django 调用相应的 view 函数(HttpRequest 对象自动传递给该view函数<作为第一个参数>), 每一个 view 负责返回一个 HttpResponse 对象.

本文档解释了 HttpRequestHttpResponse 对象的 API.

除了 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: 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()
返回 TrueFalse .
get_full_path()

返回一个路径,包括query字符串.

Example: "/music/bands/the_beatles/?print=true"

在一个 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 函数.

对应着 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)
headervalue 都是字符串,将给定的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 可以被 blogs.lawrence.com 和calendars.lawrence.com 等类似的域名读取. 否则,一个cookie 只能被当前域名读取.
delete_cookie(key)
删除给定key的cookie,若该key不存在,静默.
content
以一个Python字符串的形式返回页面内容,如果需要,将其改造为unicode对象返回.注意它是一个 property ,不是一个方法. 使用 r.content 而不是 r.content().
write(content), flush() and tell()
这几个方法将HttpResponse实例改造成为一个类似文件的对象.

Django包括一系列 HttpResponse 子类处理不同的HTTP请求.象 HttpResponse 一样,这些子类都在 django.http 中定义.

HttpResponseRedirect
该类的构造函数只接受一个参数--要重定向的路径. 该路径可以是一个 URL 全称(如 '' ) 也可以是一个不包括域名的绝对 URL (如 '/search/' ). 注意它返回一个 HTTP 状态码 302.
HttpResponsePermanentRedirect
类似 HttpResponseRedirect, 不过它返回一个持久化重定向(HTTP状态码301),而不是一个 found 重定向(状态码302).
HttpResponseNotModified
该类的构造函数不接受任何参数,表示一个页面从用户最后一次请示以来未做任何改动.
HttpResponseNotFound
类似 HttpResponse 不过使用 404 状态码.
HttpResponseForbidden
类似 HttpResponse 不过使用 403 状态码.
HttpResponseGone
类似 HttpResponse 不过使用 410 状态码.
HttpResponseServerError
类似 HttpResponse 不过使用 500 状态码.
阅读(587) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~