全部博文(2065)
分类: Python/Ruby
2009-08-12 12:52:39
Django 使用 request 和 response 对象表示系统状态数据..
当请求一个页面时,Django创建一个 HttpRequest 对象.该对象包含 request 的元数据. 然后 Django 调用相应的 view 函数(HttpRequest 对象自动传递给该view函数<作为第一个参数>), 每一个 view 负责返回一个 HttpResponse 对象.
本文档解释了 HttpRequest 和 HttpResponse 对象的 API.
除了 session 以外的其它属性都应该被看作是只读的.
一个字符串表示请求页的路径全名(不包括域名).
Example: "/music/bands/the_beatles/"
可以认为是一个字典对象,包括所有的 HTTP POST 参数,参见下面的 QueryDict 文档.
注意: POST 不 包括文件上载信息, 参阅 FILES.
为了使用方便,该对象也可以认为是一个字典对象,它包括所有 POST 和 GET 数据(先POST,后GET). (灵感来自PHP中的 $_REQUEST 全局变量).
举例: 如果 GET={"name":"john"}, POST={"AGE":"34"} 则 REQUEST["name"]="john", REQUEST["age"]="34".
强烈建议你使用 GET 或 POST 而不是 REQUEST,因为前者更清晰.
注意 FILES 只有在请求方式为 POST 并且表单包括 enctype="multipart/form-data" 属性时才会有数据,否则 FILES 就是一个空的类似字典的对象.
可用的 header 依赖客户机和服务器,下面是某些可能的值:
只有你的 Django 激活了 AuthenticationMiddleware 之后 user 对象才可用. 参阅 . .. Authentication in Web requests: http://www.djangoproject.com/documentation/authentication/#authentication-in-web-requests
根据给定的键,返回一个 GET/POST 值. 该方法首先检查 POST,然后是 GET. 若给定的键未找到,引发 KeyError 异常
这使得你能够使用访问字典的语法来存取 HttpRequest 实例. 举例来说: 无论 request.POST 有一个 "foo" 键还是 request.GET 有一个 "foo" 键,``request["foo"]`` 都会返回相应的值.
返回一个路径,包括query字符串.
Example: "/music/bands/the_beatles/?print=true"
在一个 HttpRequest 对象中, GET和POST属性都是 django.http.QueryDict 的实例. QueryDict 是一个类似字典的类,被设计成可以处理同一个键有多个值的情况.这是很必要的,因为有些 HTML 表单元素,特别是``
QueryDict 实例是不可变对象,除非你创建他们的一个拷贝.这意味着你不能直接改变 request.POST 和 request.GET 的值.
QueryDict 实现了所有的标准字典方法,因为它就是 dictionary 的一个子类.下文中对与标准字典不一致的地方做了标注:
__getitem__(key) -- 返加给定键的值. 如果该键有多个值, __getitem__ 返回最后一个值.
__setitem__(key, value) -- 将 key 的值设置为 [value] (一个Python 列表,只有一个元素 value).注意,这个方法象其它字典方法一个拥有副作用,只能被一个可变的 QueryDict 对象调用.(一个通过`` copy()``创建的副本).
__contains__(key) -- 如果给定键存在,返回 True. 它允许你这么干: if "foo" in request.GET.
get(key, default) --类似 __getitem__() ,如果该键不存在,返回一个默认值.
has_key(key)
setdefault(key, default) -- 类似标准字典的 setdefault(),不同之处在于它内部使用的是 __setitem__().
update(other_dict) -- 类似标准字典的 update(), 唯一的不同是它将 other_dict 的元素追加到(而不是替换到)当前字典中. 示例:
>>> 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__() 的逻辑,它使用最后一个值.示例:
>>> q = QueryDict('a=1&a=2&a=3')
>>> q.values()
['3']
除了这些之外,``QueryDict`` 还拥有下列方法:
copy() -- 返回当前对象的一个拷贝,它使用标准库中的 深拷贝 方法. 这个拷贝是可变的,也就是说你可以改变这个拷贝的值.
getlist(key) -- 以一个Python列表的形式返回指定键的值.若该键不存在,返回一个空的列表.该列表是以某种方式排序的.
setlist(key, list_) -- 不同于 __setitem__() ,将给定的键的值设置为一个列表.
appendlist(key, item) -- 将给定键对应的值(别忘了,它是一个列表)追加一个 item.
setlistdefault(key, default_list) -- 就象 setdefault ,不过它接受一个列表作为值而不是一个单一的值.
lists() -- 就象 items(),不过它包含所有的值(以列表的方式):
>>> q = QueryDict('a=1&a=2&a=3')
>>> q.lists()
[('a', ['1', '2', '3'])]urlencode() -- 以一个查询字符串的形式返回一个字符串. Example: "a=2&b=3&b=5".
下面是一个例子演示了 Django 如何对待输入:
若用户输入了 "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 实例使用一个迭代器进行了初始化, 该实例就不允许再以类似文件操作的方式来访问.否则就会引发异常.
Django包括一系列 HttpResponse 子类处理不同的HTTP请求.象 HttpResponse 一样,这些子类都在 django.http 中定义.