概述
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中的每个键是 <input type="file" name="" /> 中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 表单元素,特别是``<select multiple="multiple">``,使用一个键来传递多个值

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 如何对待输入:

<form action="/foo/bar/" method="post">
<input type="text" name="your_name" />
<select multiple="multiple" name="bands">
    <option value="beatles">The Beatles</option>
    <option value="who">The Who</option>
    <option value="zombies">The Zombies</option>
</select>
<input type="submit" />
</form>

若用户输入了 "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("<p>Here's the text of the Web page.</p>")
>>> response.write("<p>Here's another paragraph.</p>")

你可以使用字典语法添加或删除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 只能被当前域名读取.

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 状态码.

django的request对象和response对象的更多相关文章

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

    Django使用request和response对象在系统间传递状态.—(阿伦)当一个页面被请示时,Django创建一个包含请求元数据的 HttpRequest 对象. 然后Django调入合适的视图 ...

  2. request对象和response对象,什么时候用,具体用哪一个,没有感觉

    request对象和response对象,什么时候用,具体用哪一个,没有感觉

  3. JAVA-JSP内置对象之response对象

    相关资料:<21天学通Java Web开发> response对象1.response对象用来给客户端传送输出信息. 方法                                 ...

  4. Request对象和Response对象 JsonResponse对象 和 Django shortcut functions 和QueryDict对象

    request request属性 属性: django将请求报文中的请求行.头部信息.内容主体封装成 HttpRequest 类中的属性. 除了特殊说明的之外,其他均为只读的. ''' 0.Http ...

  5. django基础2: 路由配置系统,URLconf的正则字符串参数,命名空间模式,View(视图),Request对象,Response对象,JsonResponse对象,Template模板系统

    Django基础二 request request这个参数1. 封装了所有跟请求相关的数据,是一个对象 2. 目前我们学过1. request.method GET,POST ...2. reques ...

  6. python 之 Django框架(Django框架简介、视图装饰器、request对象、Response对象)

    12.33 Django框架简介: MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器( ...

  7. django系列3.4-- request对象和response对象(未完待续)

    一.request对象 详细信息可以查阅django官方文档 共有五种请求相关的常用值 request.path_info 返回用户访问的url不包括域名 request.method 请求中使用的H ...

  8. 运维开发笔记整理-Request对象与Response对象

    运维开发笔记整理-Request对象与HttpResponse对象 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.request对象 1>.什么是request 首先,我 ...

  9. request 对象和 response 对象

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象 HttpServletResponse HttpServletR ...

随机推荐

  1. php一些常规动态设置与获取

    error_reporting(E_ALL); ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE);ini ...

  2. C#委托和事件定义和使用

    委托 定义委托的语法和定义方法比较相似,只是比方法多了一个关键字delegate ,我们都知道方法就是将类型参数化,所谓的类型参数化就是说该方法接受一个参数,而该参数是某种类型的参数,比如int.st ...

  3. HBase 1.3(NOSQL) 发布,性能大幅提升

        Apache HBase 1.3.0版在2017年1月中旬正式发布了,新版本支持分层数据的压缩和多个方面的性能提升,像预写日志(WAL).一个新的RPC机制,等等.HBase 1.3.0一共修 ...

  4. mongoDB的shell数组操作器

    http://www.2cto.com/database/201304/205024.html mongoDB数组操作器   $push会向数组末尾加入一个元素,如果数组不存在,则会创建这个数组. 增 ...

  5. 使用 MVVMLight 绑定数据

    如果你还不知道如何在VS中加入MVVMLight的引用,那么建议你先翻阅这篇文章:在VS中安装/使用 MVVMLight 这篇文章主要是介绍如何使用MVVMLight来绑定数据到界面中(View),以 ...

  6. Python 字符串处理(转)

    转自:黄聪:Python 字符串操作(替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) http://www.cnblogs.com/huangcong/archive/2011/ ...

  7. Python 入门(六)Dict和Set类型

    什么是dict 我们已经知道,list 和 tuple 可以用来表示顺序集合,例如,班里同学的名字: ['Adam', 'Lisa', 'Bart'] 或者考试的成绩列表: [95, 85, 59] ...

  8. /etc/services

    /etc/services文件是记录网络服务名和它们对应使用的端口号及协议,很多的系统程序要使用这个文件.一般情况下,不要修改该文件的内容,否则可能会造成端口冲突 常见的服务如下,各个字段分别表示:s ...

  9. m2014-architecture-imgserver->Lighttpd Mod_Cache很简单很强大的动态缓存

    Lighttpd是一个德国人领导的开源软件,其根本的目的是提供一个专门针对高性能网站,安全.快速.兼容性好并且灵活的web server环境.具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模 ...

  10. C++11新特性之二——std::bind std::function 高级用法

    /* * File: main.cpp * Author: Vicky.H * Email: eclipser@163.com */ #include <iostream> #includ ...