Django 使用Request 对象和Response 对象在系统间传递状态。

HttpResponse 对象。

django.http 模块中。

会话(session) 属性是个例外,需要注意。

HttpRequest.scheme
New in Django 1.7.

https)。

HttpRequest.body

HttpRequest.POST

HttpRequest.read()

HttpRequest.path

一个字符串,表示请求的页面的完整路径,不包含域名。

HttpRequest.path_info

path 可以让代码在测试和开发环境中更容易地切换。

HttpRequest.method

例如:

if request.method == 'GET':
    do_something()
elif request.method == 'POST':
    do_something_else()
HttpRequest.encoding

DEFAULT_CHARSET 中,则使用它。

HttpRequest.GET

QueryDict 文档。

HttpRequest.POST

HttpRequest.body 属性。

(参见上文)。

FILES

HttpRequest.REQUEST

POST 代替。

$_REQUEST

REQUEST,因为它们更加明确。

HttpRequest.COOKIES

键和值都为字符串。

HttpRequest.FILES

管理文件。

FILES 将为一个空的类似于字典的对象。

HttpRequest.META

具体的头部信息取决于客户端和服务器,下面是一些示例:

  • CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。
  • CONTENT_TYPE —— 请求的正文的MIME 类型。
  • HTTP_ACCEPT —— 响应可接收的Content-Type。
  • HTTP_ACCEPT_ENCODING —— 响应可接收的编码。
  • HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。
  • HTTP_HOST —— 客服端发送的HTTP Host 头部。
  • HTTP_REFERER —— Referring 页面。
  • HTTP_USER_AGENT —— 客户端的user-agent 字符串。
  • QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。
  • REMOTE_ADDR —— 客户端的IP 地址。
  • REMOTE_HOST —— 客户端的主机名。
  • REMOTE_USER —— 服务器认证后的用户。
  • SERVER_NAME —— 服务器的主机名。
  • SERVER_PORT —— 服务器的端口(是一个字符串)。

HTTP_X_BENDER 键。

HttpRequest.user

is_authenticated() 区分它们,像这样:

if request.user.is_authenticated():
    # Do something for logged-in users.
else:
    # Do something for anonymous users.

Django 中的用户认证。

HttpRequest.session

会话的文档。

HttpRequest.urlconf

Django 如何处理请求。

HttpRequest.resolver_match

process_view 代替)。

HttpRequest.get_host()

PEP 3333 中有详细描述。

有一个解决办法是使用中间件重写代理的头部,例如下面的例子:

class MultipleProxyMiddleware(object):
    FORWARDED_FOR_FIELDS = [
        'HTTP_X_FORWARDED_FOR',
        'HTTP_X_FORWARDED_HOST',
        'HTTP_X_FORWARDED_SERVER',
    ]

    def process_request(self, request):
        """
        Rewrites the proxy headers so that only the most
        recent proxy is used.
        """
        for field in self.FORWARDED_FOR_FIELDS:
            if field in request.META:
                if ',' in request.META[field]:
                    parts = request.META[field].split(',')
                    request.META[field] = parts[-1].strip()

CsrfViewMiddleware

HttpRequest.get_full_path()

path,如果可以将加上查询字符串。

HttpRequest.build_absolute_uri(location)

request.get_full_path()

否则,使用请求中的服务器相关的变量构建绝对URI。

HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

default 参数,将不会引发异常并返回default 的值。

max_age 秒。

示例:

>>> request.get_signed_cookie('name')
'Tony'
>>> request.get_signed_cookie('name', salt='name-salt')
'Tony' # assuming cookie was set using the same salt
>>> request.get_signed_cookie('non-existing-cookie')
...
KeyError: 'non-existing-cookie'
>>> request.get_signed_cookie('non-existing-cookie', False)
False
>>> request.get_signed_cookie('cookie-that-was-tampered-with')
...
BadSignature: ...
>>> request.get_signed_cookie('name', max_age=60)
...
SignatureExpired: Signature age 1677.3839159 > 60 seconds
>>> request.get_signed_cookie('name', False, max_age=60)
False

密钥签名。

HttpRequest.is_secure()

即请求是通过HTTPS 发起的。

HttpRequest.is_ajax()

is_ajax() 可以工作。

vary_on_headers('HTTP_X_REQUESTED_WITH') 装饰你的视图以让响应能够正确地缓存。

HttpRequest.read(size=None)
HttpRequest.readline()
HttpRequest.readlines()
HttpRequest.xreadlines()
HttpRequest.__iter__()

一个常见的用例是使用迭代解析器处理大型XML有效载荷,而不在内存中构造一个完整的XML树。

根据这个标准的接口,一个HttpRequest 实例可以直接传递给XML 解析器,例如ElementTree:

import xml.etree.ElementTree as ET
for element in ET.iterparse(request):
    process(element)

multiple> 是一个显著的例子。

.copy()

下面列出了不同点:

QueryDict.__init__(query_string=None, mutable=False, encoding=None)

QueryDict 一个对象。

>>> QueryDict('a=1&a=2&c=3')
<QueryDict: {'a': ['1', '2'], 'c': ['3']}>

QueryDict 的结果 是空的 (将没有键和值).

mutable=True 可以实现。 .

DEFAULT_CHARSET.

Changed in Django 1.8:

query_string 是一个必需的位置参数。

QueryDict.__getitem__(key)

KeyError。)

QueryDict.__setitem__(key, value)

copy() 创建的字典)。

QueryDict.__contains__(key)

request.GET 这样的操作。

QueryDict.get(key, default)

__getitem__() 相同的逻辑,但是当key 不存在时返回一个默认值。

QueryDict.setdefault(key, default)

__setitem__()

QueryDict.update(other_dict)

例如:

>>> q = QueryDict('a=1', mutable=True)
>>> q.update({'a': '2'})
>>> q.getlist('a')
['1', '2']
>>> q['a'] # returns the last
['2']
QueryDict.items()

例如:

>>> q = QueryDict('a=1&a=2&a=3')
>>> q.items()
[('a', '3')]
QueryDict.iteritems()

QueryDict.__getitem__() 一样的返回最新的值的逻辑。

QueryDict.iterlists()

QueryDict.iteritems(),只是它将字典中的每个成员作为列表。

QueryDict.values()

例如:

>>> q = QueryDict('a=1&a=2&a=3')
>>> q.values()
['3']
QueryDict.itervalues()

QueryDict.values(),只是它是一个迭代器。

QueryDict 具有以下方法︰

QueryDict.copy()

此副本是可变的即使原始对象是不可变的。

QueryDict.getlist(key, default)

它保证返回的是某种类型的列表,除非默认值不是列表。

QueryDict.setlist(key, list_)

__setitem__() 不同)。

QueryDict.appendlist(key, item)

将项追加到内部与键相关联的列表中。

QueryDict.setlistdefault(key, default_list)

setdefault,除了它接受一个列表而不是单个值。

QueryDict.lists()

例如:

>>> q = QueryDict('a=1&a=2&a=3')
>>> q.lists()
[('a', ['1', '2', '3'])]
QueryDict.pop(key)

例如 ︰

>>> q = QueryDict('a=1&a=2&a=3', mutable=True)
>>> q.pop('a')
['1', '2', '3']
QueryDict.popitem()

例如 ︰

>>> q = QueryDict('a=1&a=2&a=3', mutable=True)
>>> q.popitem()
('a', ['1', '2', '3'])
QueryDict.dict()

QueryDict.__getitem__()相同的逻辑:

>>> q = QueryDict('a=1&a=3&a=5')
>>> q.dict()
{'a': '5'}
QueryDict.urlencode([safe])

示例︰

>>> q = QueryDict('a=2&b=3&b=5')
>>> q.urlencode()
'a=2&b=3&b=5'

例如︰

>>> q = QueryDict(mutable=True)
>>> q['next'] = '/a&b/'
>>> q.urlencode(safe='/')
'next=/a%26b/'

HttpResponse.

django.http模块中定义的。

HttpResponse 构造函数:

>>> from django.http import HttpResponse
>>> response = HttpResponse("Here's the text of the Web page.")
>>> response = HttpResponse("Text only, please.", content_type="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>")

HttpResponse 将立即处理这个迭代器, 把它的内容存成字符串,并丢弃它

StreamingHttpResponse 类代替;.

把它当作一个类似字典的结构,从你的response中设置和移除一个header field。

>>> response = HttpResponse()
>>> response['Age'] = 120
>>> del response['Age']

KeyError异常。

“补丁”方法确保其他值,例如,通过中间件添加的,不会删除。

BadHeaderError异常。

例如,下面是 如何给浏览器返回一个微软电子表格:

>>> response = HttpResponse(my_data, content_type='application/vnd.ms-excel')
>>> response['Content-Disposition'] = 'attachment; filename="foo.xls"'

Content-Disposition头的Django特定的,但是很容易忘记语法,所以我们在这里包括它。

HttpResponse.content

一个用来代替content的字节字符串,如果必要,则从一个Unicode对象编码而来。

HttpResponse.charset
New in Django 1.8.

DEFAULT_CHARSET选项将会被使用。

HttpResponse.status_code

HTTP 响应状态码

HttpResponse.reason_phrase

响应的HTTP原因短语。

HttpResponse.streaming

False

由于这个属性的存在,使得中间件(middleware)能够区别对待流式response和常规response。

HttpResponse.closed
New in Django 1.8.

True如果响应已关闭。

HttpResponse.__init__(content='', content_type=None, status=200, reason=None, charset=None)

HttpResponse对象。

如果不是迭代器或者字符串,那么在其被接收的时候将转换成字符串。

charset = utf-8“。

HTTP 响应状态码 。.

如果没有指定, 则使用默认响应短语.

DEFAULT_CHARSET 的设定将被使用.

New in Django 1.8:

charset参数。

HttpResponse.__setitem__(header, value)

value 都应该是字符串类型。

HttpResponse.__delitem__(header)

不区分大小写。

HttpResponse.__getitem__(header)

不区分大小写。

HttpResponse.has_header(header)

False 。

HttpResponse.setdefault(header, value)
New in Django 1.8.

设置一个首部,除非该首部 header 已经存在了。

HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False)

Morsel Cookie 对象相同。

  • expires,则会通过计算得到。

  • max_age 会通过计算得到。

  • 否则,Cookie 将只能被设置它的域读取。

  • httponly=True

    但是,如果使用,它是一种降低客户端脚本访问受保护的Cookie 数据风险的有用的方法。

警告

如果视图存储大于4096 个字节的Cookie,Django 不会引发异常,但是浏览器将不能正确设置Cookie。

HttpResponse.set_signed_cookie(key, value, salt='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=True)

HttpRequest.get_signed_cookie() 调用。

HttpResponse.delete_cookie(key, path='/', domain=None)

如果key 不存在则什么也不发生。

set_cookie() 中使用的值相同 —— 否则Cookie 不会删掉。

HttpResponse.write(content)

HttpResponse实例是一个类似文件的对象。

HttpResponse.flush()

HttpResponse实例是一个类似文件的对象。

HttpResponse.tell()

HttpResponse实例是一个类似文件的对象。

HttpResponse.getvalue()
New in Django 1.8.

HttpResponse实例是一个类似流的对象。

HttpResponse.writable()
New in Django 1.8.

HttpResponse实例是一个类似流的对象。

HttpResponse.writelines(lines)
New in Django 1.8.

HttpResponse实例是一个类似流的对象。

django.http之中。

注意!这个响应会返回一个302的HTTP状态码。

url

Location response hader)。

HttpResponseRedirect一样,但是它会返回一个永久的重定向(HTTP状态码301)而不是一个“found”重定向(状态码302)。

使用此选项可指定自用户上次请求(状态代码304)以来尚未修改页面。

HttpResponse的行为类似,但是使用了一个400的状态码。

HttpResponse的行为类似,但是使用的404状态码。

HttpResponse类似,但使用403状态代码。

'POST'])。

HttpResponse类似,但使用410状态码。

HttpResponse类似,但使用500状态代码。

注意

render方法必须自己返回一个有效的响应对象。

New in Django 1.7.
JsonResponse.__init__(data, encoder=DjangoJSONEncoder, safe=True, **kwargs)

它从父类继承大部分行为,并具有以下不同点:

application/json

False,它可以是任何可JSON 序列化的对象。

JSON 序列化。

TypeError

典型的用法如下:

>>> from django.http import JsonResponse
>>> response = JsonResponse({'foo': 'bar'})
>>> response.content
'{"foo": "bar"}'

False

>>> response = JsonResponse([1, 2, 3], safe=False)

TypeError

警告

所以可以不用关注这个安全预防措施。

encoder 参数给构造函数:

>>> response = JsonResponse(data, encoder=MyJSONEncoder)

生成大型CSV文件非常有用。

基于性能的考虑

这可能导致性能变差。

总的来说,你需要将代价高的任务移除请求—响应的循环,而不是求助于流式响应。

尽管如此,除了以下的几个明显不同的地方,其他几乎完全相同:

  • 应该提供一个迭代器给它,这个迭代器生成字符串来构成内容(content)
  • 这只在响应被返回到客户端的时候发生。
  • streaming_content 属性。
  • 那么做会抛出一个异常。

Length头。

StreamingHttpResponse.streaming_content

一个表示内容(content)的字符串的迭代器

StreamingHttpResponse.status_code

HTTP状态码。

StreamingHttpResponse.reason_phrase

响应的HTTP原因短语。

StreamingHttpResponse.streaming

True.

New in Django 1.8.

wsgi.file_wrapper ,否则将会流式化一个文件为一些小块。

FileResponse 需要通过二进制模式打开文件,如下:

>>> from django.http import FileResponse
>>> response = FileResponse(open('myfile.png', 'rb'))

转自:http://doc.codingdict.com/django/ref/request-response.html

相关文章: