免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4686 | 回复: 0
打印 上一主题 下一主题

Request对象和response 对象 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-12 12:52 |只看该作者 |倒序浏览

概述
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 就是一个空的类似字典的对象.
    METAMETA是一个标准的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 表单元素,特别是````,使用一个键来传递多个值
    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 如何对待输入:
        The Beatles
        The Who
        The Zombies
    若用户输入了 "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 只能被当前域名读取.
    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 状态码.
                   
                   
                   

    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/84280/showart_2025290.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP