¶
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方法必须自己返回一个有效的响应对象。
¶
- ¶
- 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头。
¶
- ¶
wsgi.file_wrapper ,否则将会流式化一个文件为一些小块。
FileResponse 需要通过二进制模式打开文件,如下:
>>> from django.http import FileResponse
>>> response = FileResponse(open('myfile.png', 'rb'))
转自:http://doc.codingdict.com/django/ref/request-response.html