请求和响应对象

快速浏览

Django使用请求和响应对象来通过系统传递状态。

当请求页面时,Django创建一个包含关于请求的元数据的HttpRequest对象。 然后Django加载相应的视图,将作为第一个参数的HttpRequest传递给视图函数。 每个视图负责返回一个HttpResponse对象。

本文档解释了在django.http模块中定义的HttpRequestHttpResponse对象的API。

HttpRequest对象

HttpRequest[source]

属性¶ T0>

所有的属性应该被认为是只读的,除非另有说明。

HttpRequest的。方案 T0> ¶ T1>

表示请求方案的字符串(通常为httphttps)。

HttpRequest的。体 T0> ¶ T1>

原始的HTTP请求体是一个字节字符串。 这对于以不同于传统HTML表单的方式处理数据非常有用:二进制图像,XML有效载荷等。为了处理传统的表单数据,请使用HttpRequest.POST

您也可以使用类似文件的界面从HttpRequest中读取。 参见HttpRequest.read()

HttpRequest的。路径 T0> ¶ T1>

表示请求页面的完整路径的字符串,不包括方案或域。

例如:"/music/bands/the_beatles/"

HttpRequest的。 PATH_INFO T0> ¶ T1>

在某些Web服务器配置下,主机名后的URL部分被分成脚本前缀部分和路径信息部分。 无论使用什么Web服务器,path_info属性总是包含路径的路径信息部分。 使用这个而不是path可以使你的代码更容易在测试和部署服务器之间移动。

例如,如果您的应用程序的WSGIScriptAlias设置为"/minfo",那么path可能是"/minfo/music/bands/the_beatles/"path_info将会是"/music/bands/the_beatles/"

HttpRequest的。方法 T0> ¶ T1>

表示请求中使用的HTTP方法的字符串。 这是保证大写。 例如:

if request.method == 'GET':
    do_something()
elif request.method == 'POST':
    do_something_else()
HttpRequest的。编码 T0> ¶ T1>

表示用于解码表单提交数据的当前编码的字符串(或None,这意味着使用DEFAULT_CHARSET设置)。 您可以写入此属性来更改访问表单数据时使用的编码。 任何后续的属性访问(如从GETPOST读取)都将使用新的encoding值。 如果您知道表单数据不在DEFAULT_CHARSET编码中,那么这很有用。

HttpRequest的。 CONTENT_TYPE T0> ¶ T1>

表示请求的MIME类型的字符串,从CONTENT_TYPE标头解析。

HttpRequest的。 content_params T0> ¶ T1>

包含在CONTENT_TYPE标题中的键/值参数字典。

HttpRequest的。 GET T0> ¶ T1>

包含所有给定的HTTP GET参数的类似字典的对象。 请参阅下面的QueryDict文档。

HttpRequest的。 POST T0> ¶ T1>

包含所有给定HTTP POST参数的类似字典的对象,前提是请求包含表单数据。 请参阅下面的QueryDict文档。 如果您需要访问请求中发布的原始数据或非表单数据,请改为通过HttpRequest.body属性进行访问。

如果通过POST HTTP方法请求表单,但是不包含表单数据,则可能通过POST发送一个空的POST字典。 Therefore, you shouldn’t use if request.POST to check for use of the POST method; instead, use if request.method == "POST" (see HttpRequest.method).

POST does not include file-upload information. 请参阅FILES

HttpRequest的。缓存 T0> ¶ T1>

包含所有Cookie的字典。 键和值是字符串。

HttpRequest的。文件 T0> ¶ T1>

包含所有上传文件的类似字典的对象。 Each key in FILES is the name from the <input type="file" name="" />. FILES中的每个值都是一个UploadedFile

有关更多信息,请参阅Managing files

FILES will only contain data if the request method was POST and the <form> that posted to the request had enctype="multipart/form-data". 否则,FILES将会是一个空白的字典对象。

HttpRequest的。 META T0> ¶ T1>

包含所有可用HTTP标头的字典。 可用的头文件取决于客户端和服务器,但是这里有一些例子:

  • CONTENT_LENGTH – The length of the request body (as a string).
  • CONTENT_TYPE – The MIME type of the request body.
  • HTTP_ACCEPT – Acceptable content types for the response.
  • HTTP_ACCEPT_ENCODING - 响应的可接受编码。
  • HTTP_ACCEPT_LANGUAGE – Acceptable languages for the response.
  • HTTP_HOST - 客户端发送的HTTP主机头。
  • HTTP_REFERER – The referring page, if any.
  • HTTP_USER_AGENT – The client’s user-agent string.
  • QUERY_STRING - 查询字符串,作为单个(未分析的)字符串。
  • REMOTE_ADDR – The IP address of the client.
  • REMOTE_HOST – The hostname of the client.
  • REMOTE_USER – The user authenticated by the Web server, if any.
  • REQUEST_METHOD - 一个字符串,例如"GET""POST"
  • SERVER_NAME – The hostname of the server.
  • SERVER_PORT – The port of the server (as a string).

除了CONTENT_LENGTHCONTENT_TYPE之外,如上所述,通过将所有字符转换为大写,将请求中的所有HTTP头转换为META ,用下划线替换任何连字符,并向该名称添加一个HTTP_前缀。 所以,例如,名为X-Bender的头将被映射到METAHTTP_X_BENDER

Note that runserver strips all headers with underscores in the name, so you won’t see them in META. 这可以防止基于下划线和短划线之间的歧义的标头欺骗,这两个标准化都是在WSGI环境变量中标准化为下划线。 它与Nginx和Apache 2.4+等Web服务器的行为相匹配。

HttpRequest的。 resolver_match T0> ¶ T1>

表示已解析URL的ResolverMatch实例。 这个属性只有在URL解析发生之后才被设置,这意味着它在所有的视图中都可用,但在中间件中是不可用的,这些中间件在URL解析发生之前执行(可以在process_view()中使用)。

由应用程序代码设置的属性

Django本身并没有设置这些属性,但是如果你的应用程序设置了它们,就可以使用它们。

HttpRequest的。 CURRENT_APP T0> ¶ T1>

url模板标签将使用它的值作为reverse()current_app参数。

HttpRequest的。 URL配置 T0> ¶ T1>

这将被用作当前请求的根URLconf,覆盖ROOT_URLCONF设置。 有关详细信息,请参阅How Django processes a request

urlconf can be set to None to revert any changes made by previous middleware and return to using the ROOT_URLCONF.

中间件设置的属性

Django的contrib应用程序中包含的一些中间件在请求中设置了属性。 如果在请求中看不到该属性,请确保在MIDDLEWARE中列出相应的中间件类。

HttpRequest的。会话 T0> ¶ T1>

来自SessionMiddleware:表示当前会话的可读写字典对象。

HttpRequest的。位点 T0> ¶ T1>

来自CurrentSiteMiddleware:表示当前站点的get_current_site()返回的SiteRequestSite的实例。

HttpRequest的。用户 T0> ¶ T1>

来自AuthenticationMiddleware:表示当前登录用户的AUTH_USER_MODEL实例。 如果用户当前未登录,则将user设置为AnonymousUser的实例。 您可以用is_authenticated来区分它们,如下所示:

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

方法¶ T0>

HttpRequest的。get_host()[source]

使用来自HTTP_X_FORWARDED_HOST(如果USE_X_FORWARDED_HOST已启用)和HTTP_HOST标头的信息,按顺序返回请求的始发主机。 If they don’t provide a value, the method uses a combination of SERVER_NAME and SERVER_PORT as detailed in PEP 3333.

例如:"127.0.0.1:8000"

注意

当主机位于多个代理之后时,get_host()方法失败。 一个解决方案是使用中间件来重写代理头,如下例所示:

from django.utils.deprecation import MiddlewareMixin

class MultipleProxyMiddleware(MiddlewareMixin):
    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()

这个中间件应该放在依赖于get_host()值的任何其他中间件之前,例如CommonMiddlewareCsrfViewMiddleware

HttpRequest的。get_port()[source]

Returns the originating port of the request using information from the HTTP_X_FORWARDED_PORT (if USE_X_FORWARDED_PORT is enabled) and SERVER_PORT META variables, in that order.

HttpRequest的。get_full_path()[source]

返回path,并附加一个附加查询字符串(如果适用)。

例如:"/music/bands/the_beatles/?print=true"

HttpRequest的。build_absolute_uri(location)[source]

返回location的绝对URI形式。 如果没有提供位置,则位置将被设置为request.get_full_path()

如果该位置已经是一个绝对的URI,它将不会被改变。 否则,使用此请求中可用的服务器变量来构建绝对URI。

例如:"https://example.com/music/bands/the_beatles/?print=true"

注意

不鼓励在同一个站点上混合使用HTTP和HTTPS,因此,build_absolute_uri()将始终使用当前请求具有的相同方案生成绝对URI。 如果您需要将用户重定向到HTTPS,最好让Web服务器将所有HTTP通信重定向到HTTPS。

返回签名cookie的cookie值,如果签名不再有效,则会引发django.core.signing.BadSignature异常。 如果提供default参数,则异常将被取消,并返回默认值。

可选的salt参数可用于提供额外的保护,防止对您的密钥进行暴力攻击。 如果提供,则会根据附加到cookie值的已签名时间戳来检查max_age参数,以确保cookie不超过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('nonexistent-cookie')
...
KeyError: 'nonexistent-cookie'
>>> request.get_signed_cookie('nonexistent-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

有关更多信息,请参阅cryptographic signing

HttpRequest的。is_secure()[source]

如果请求是安全的,则返回True;也就是说,如果它是使用HTTPS制作的。

HttpRequest的。is_ajax()[source]

Returns True if the request was made via an XMLHttpRequest, by checking the HTTP_X_REQUESTED_WITH header for the string 'XMLHttpRequest'. 大多数现代JavaScript库都发送这个头文件。 如果你编写自己的XMLHttpRequest调用(在浏览器端),如果你想is_ajax()工作,你必须手动设置这个头。

如果响应是否通过AJAX请求而发生变化,并且您正在使用某种形式的缓存(如Django的cache middleware),则应该修饰使用vary_on_headers('X-Requested-With')查看,以便正确缓存响应。

HttpRequest的。read(size=None)[source]
HttpRequest的。readline()[source]
HttpRequest的。readlines()[source]
HttpRequest的。__iter__()[source]

实现从HttpRequest实例读取文件类接口的方法。 这使得有可能以流媒体的方式消费传入的请求。 一个常见的用例是用一个迭代解析器处理一个大的XML负载,而不用在内存中构建一个完整的XML树。

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

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

QueryDict objects

QueryDict[source]

In an HttpRequest object, the GET and POST attributes are instances of django.http.QueryDict, a dictionary-like class customized to deal with multiple values for the same key. This is necessary because some HTML form elements, notably <select multiple>, pass multiple values for the same key.

request.POSTrequest.GET中的QueryDict在正常的请求/响应循环中被访问时将是不可变的。 要获得可变版本,您需要使用QueryDict.copy()

方法¶ T0>

QueryDict implements all the standard dictionary methods because it’s a subclass of dictionary. 这里列举了一些例外:

的QueryDict。__init__(query_string=None, mutable=False, encoding=None)[source]

基于query_string实例化一个QueryDict对象。

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

如果query_string没有被传入,那么生成的QueryDict将是空的(它将没有键或值)。

您遇到的大多数QueryDict,特别是request.POSTrequest.GET,都是不可变的。 如果你自己实例化一个,可以通过将mutable=True传递给它的__init__()来使其变为可变的。

用于设置键和值的字符串将从encoding转换为str 如果未设置encoding,则默认为DEFAULT_CHARSET

类方法 的QueryDict。fromkeys(iterable, value='', mutable=False, encoding=None)[source]
Django 1.11新增功能

iterable中的键创建一个新的QueryDict,每个值等于value 例如:

>>> QueryDict.fromkeys(['a', 'a', 'b'], value='val')
<QueryDict: {'a': ['val', 'val'], 'b': ['val']}>
的QueryDict。 __的GetItem __ T0>(键 T1>)¶ T2>

返回给定键的值。 如果该键具有多个值,则返回最后一个值。 如果密钥不存在,则引发django.utils.datastructures.MultiValueDictKeyError (这是Python标准KeyError的一个子类,所以你可以坚持捕获KeyError。)

的QueryDict。__ setitem __keyvalue[source]

将给定的键设置为[value](单个元素为value的列表)。 请注意,由于其他具有副作用的字典函数只能在可变的QueryDict(例如通过QueryDict.copy()创建的)上调用。

的QueryDict。 __包含__ T0>(键 T1>)¶ T2>

如果给定键已设置,则返回True This lets you do, e.g., if "foo" in request.GET.

的QueryDict。getkeydefault = None

使用与__getitem__()相同的逻辑,如果该键不存在,则使用挂钩返回默认值。

的QueryDict。setdefaultkeydefault = None[source]

dict.setdefault(),内部使用__setitem__()

的QueryDict。更新 T0>( other_dict T1>)¶ T2>

采取一个QueryDict或字典。 dict.update(),除了追加到当前的字典项目,而不是替换它们。 例如:

>>> q = QueryDict('a=1', mutable=True)
>>> q.update({'a': '2'})
>>> q.getlist('a')
['1', '2']
>>> q['a'] # returns the last
'2'
的QueryDict。项 T0>()¶ T1>

dict.items()一样,除了使用与__getitem__()相同的最后一个值逻辑并返回一个迭代器对象而不是视图对象。 例如:

>>> q = QueryDict('a=1&a=2&a=3')
>>> list(q.items())
[('a', '3')]
的QueryDict。值 T0>()¶ T1>

dict.values()一样,除了使用与__getitem__()相同的最后一个值逻辑并返回一个迭代器而不是视图对象。 例如:

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

In addition, QueryDict has the following methods:

的QueryDict。copy()[source]

使用copy.deepcopy()返回对象的副本。 即使原件没有,这个副本也是可变的。

的QueryDict。getlistkeydefault = None

用请求的密钥返回数据列表。 如果键不存在,则返回一个空列表,并且不提供默认值。 它保证返回一个列表,除非提供的默认值不是一个列表。

的QueryDict。setlistkeylist_[source]

将给定的键设置为list_(不像__setitem__())。

的QueryDict。appendlistkeyitem[source]

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

的QueryDict。setlistdefaultkeydefault_list = None[source]

setdefault()一样,除了它需要一个值列表而不是一个单一的值。

的QueryDict。列表 T0>()¶ T1>

items()一样,除了包含字典中每个成员的所有值(列表)。 例如:

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

返回给定键的值列表,并将其从字典中移除。 如果密钥不存在,则引发KeyError 例如:

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

移除字典的任意成员(因为没有排序的概念),并返回一个包含键值和键值所有值列表的二值元组。 在空字典上调用时引发KeyError 例如:

>>> q = QueryDict('a=1&a=2&a=3', mutable=True)
>>> q.popitem()
('a', ['1', '2', '3'])
的QueryDict。字典 T0>()¶ T1>

返回QueryDictdict表示。 对于QueryDict中的每个(key,list)对,dict都有(key,item),其中item是列表的一个元素,使用与QueryDict.__getitem__()

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

返回查询字符串格式的数据字符串。 例如:

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

使用safe参数传递不需要编码的字符。 例如:

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

HttpResponse对象

HttpResponse[source]

与由Django自动创建的HttpRequest对象不同,HttpResponse对象是您的责任。 您编写的每个视图负责实例化,填充和返回HttpResponse

HttpResponse类位于django.http模块中。

用法¶ T0>

传递字符串

典型的用法是将页面内容作为字符串传递给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迭代器而不是字符串。 HttpResponse will consume the iterator immediately, store its content as a string, and discard it. 具有close()方法的对象(如文件和生成器)将立即关闭。

如果您需要将响应从迭代器传输到客户端,则必须改为使用StreamingHttpResponse类。

设置标题字段

要设置或删除响应中的标题字段,请将其视为字典:

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

请注意,与字典不同,如果头字段不存在,del不会引发KeyError

For setting the Cache-Control and Vary header fields, it is recommended to use the patch_cache_control() and patch_vary_headers() methods from django.utils.cache, since these fields can have multiple, comma-separated values. “补丁”方法确保其他值,例如由中间件添加,不会被删除。

HTTP标头字段不能包含换行符。 尝试设置包含换行符(CR或LF)的标题字段将引发BadHeaderError

告诉浏览器将响应当作文件附件

要告诉浏览器将响应作为文件附件处理,请使用content_type参数并设置Content-Disposition标题。 例如,这是您可能会返回一个Microsoft Excel电子表格的方式:

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

Django没有针对Content-Disposition标题的具体内容,但很容易忘记语法,所以我们将其包含在这里。

属性¶ T0>

HttpResponse对象。含量 T0> ¶ T1>

表示内容的字符串,如果需要,从字符串编码。

HttpResponse对象。字符集 T0> ¶ T1>

表示响应将被编码的字符集的字符串。 如果没有在HttpResponse实例化时间给出,它将从content_type中提取,如果不成功,将使用DEFAULT_CHARSET设置。

HttpResponse对象。 STATUS_CODE T0> ¶ T1>

响应的 HTTP status code

Unless reason_phrase is explicitly set, modifying the value of status_code outside the constructor will also modify the value of reason_phrase.

HttpResponse对象。 reason_phrase T0> ¶ T1>

响应的HTTP原因短语。 它使用 HTTP standard’s默认原因短语。

Unless explicitly set, reason_phrase is determined by the value of status_code.

HttpResponse对象。流 T0> ¶ T1>

这总是False

这个属性存在,所以中间件可以把流式响应与常规响应不同。

HttpResponse对象。关闭 T0> ¶ T1>

True if the response has been closed.

方法¶ T0>

HttpResponse对象。__init__(content='', content_type=None, status=200, reason=None, charset=None)[source]

使用给定的页面内容和内容类型实例化一个HttpResponse对象。

content should be an iterator or a string. 如果它是一个迭代器,它应该返回字符串,这些字符串将被连接在一起形成响应的内容。 如果它不是一个迭代器或一个字符串,它将被访问时转换为字符串。

content_type is the MIME type optionally completed by a character set encoding and is used to fill the HTTP Content-Type header. 如果未指定,则由DEFAULT_CONTENT_TYPEDEFAULT_CHARSET设置组成,默认情况下为“text / html;字符集= UTF-8 T6>”。

status is the HTTP status code for the response.

reason is the HTTP response phrase. 如果没有提供,将使用默认的短语。

charset is the charset in which the response will be encoded. 如果没有给出,将从content_type中提取,如果不成功,将使用DEFAULT_CHARSET设置。

HttpResponse对象。__setitem__(header, value)

将给定的标题名称设置为给定的值。 headervalue都应该是字符串。

HttpResponse对象。 __ delitem __ T0>(头 T1>)¶ T2>

用给定的名称删除标题。 如果标题不存在,将自动失败。 不区分大小写。

HttpResponse对象。 __的GetItem __ T0>(头 T1>)¶ T2>

返回给定标题名称的值。 不区分大小写。

HttpResponse对象。 has_header T0>(头 T1>)¶ T2>

返回TrueFalse根据给定名称的标题区分大小写检查。

HttpResponse对象。setdefaultheadervalue

设置标题,除非已设置。

设置一个cookie。 参数与Python标准库中的Morsel cookie对象相同。

  • max_age should be a number of seconds, or None (default) if the cookie should last only as long as the client’s browser session. 如果expires没有指定,它将被计算。

  • expires should either be a string in the format "Wdy, DD-Mon-YY HH:MM:SS GMT" or a datetime.datetime object in UTC. 如果expiresdatetime对象,则会计算max_age

  • 如果要设置跨域cookie,请使用domain 例如,domain="example.com"会设置一个由www.example.com,blog.example.com等域可读的cookie。 否则,cookie将只能被设置的域读取。

  • 如果您想阻止客户端JavaScript访问cookie,请使用httponly=True

    HTTPOnly is a flag included in a Set-Cookie HTTP response header. 这不是Cookies的 RFC 2109标准的一部分,并不是所有浏览器都一致的。 但是,当它被尊重时,它可以是一个有用的方法来减轻客户端脚本访问受保护的cookie数据的风险。

警告

Both RFC 2109 and RFC 6265 state that user agents should support cookies of at least 4096 bytes. 对于许多浏览器,这也是最大的尺寸。 如果尝试存储超过4096字节的cookie,Django不会引发异常,但许多浏览器不会正确设置cookie。

set_cookie(),但cryptographic signing的cookie设置之前。 HttpRequest.get_signed_cookie()结合使用。 您可以使用可选的salt参数来增加键强度,但是您需要记住将它传递给相应的HttpRequest.get_signed_cookie()调用。

用给定的键删除cookie。 如果密钥不存在,将自动失败。

由于cookie的工作方式,pathdomain应该与set_cookie()中使用的值相同 - 否则cookie不能被删除。

HttpResponse对象。write(content)[source]

This method makes an HttpResponse instance a file-like object.

HttpResponse对象。冲洗 T0>()¶ T1>

This method makes an HttpResponse instance a file-like object.

HttpResponse对象。tell()[source]

This method makes an HttpResponse instance a file-like object.

HttpResponse对象。getvalue()[source]

返回HttpResponse.content的值。 This method makes an HttpResponse instance a stream-like object.

HttpResponse对象。可读 T0>()¶ T1>

总是False This method makes an HttpResponse instance a stream-like object.

HttpResponse对象。可查找 T0>()¶ T1>

总是False This method makes an HttpResponse instance a stream-like object.

HttpResponse对象。writable()[source]

总是True This method makes an HttpResponse instance a stream-like object.

HttpResponse对象。writelines(lines)[source]

将一行行写入响应。 行分隔符不被添加。 This method makes an HttpResponse instance a stream-like object.

HttpResponse子类

Django includes a number of HttpResponse subclasses that handle different types of HTTP responses. HttpResponse一样,这些子类位于django.http中。

HttpResponseRedirect[source]

构造函数的第一个参数是必需的 - 重定向到的路径。 This can be a fully qualified URL (e.g. 'https://www.yahoo.com/search/'), an absolute path with no domain (e.g. '/search/'), or even a relative path (e.g. 'search/'). 在最后一种情况下,客户端浏览器将根据当前路径重建完整的URL本身。 有关其他可选的构造函数参数,请参阅HttpResponse 请注意,这将返回一个HTTP状态码302。

URL T0> ¶ T1>

该只读属性表示响应将重定向到的URL(相当于Location响应标头)。

HttpResponsePermanentRedirect[source]

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

HttpResponseNotModified[source]

构造函数不接受任何参数,也不应该将内容添加到此响应中。 用这个来指定自用户上一次请求(状态码304)以来页面没有被修改。

HttpResponseBadRequest[source]

HttpResponse一样行事,但使用400状态码。

HttpResponseNotFound[source]

HttpResponse一样行事,但使用404状态码。

HttpResponseForbidden[source]

HttpResponse一样行事,但使用403状态码。

HttpResponseNotAllowed[source]

HttpResponse,但使用405状态码。 构造函数的第一个参数是必需的:允许的方法列表(例如['GET', 'POST'])。

HttpResponseGone[source]

HttpResponse一样行事,但使用410状态码。

HttpResponseServerError[source]

HttpResponse一样行事,但使用500个状态码。

注意

If a custom subclass of HttpResponse implements a render method, Django will treat it as emulating a SimpleTemplateResponse, and the render method must itself return a valid response object.

JsonResponse objects

JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs)[source]

HttpResponse子类有助于创建JSON编码的响应。 它从超类中继承了大多数行为,但有一些不同之处:

其默认的Content-Type头部设置为application/json

第一个参数data应该是一个dict实例。 如果safe参数设置为False(见下文),则它可以是任何JSON序列化的对象。

将使用默认为django.core.serializers.json.DjangoJSONEncoderencoder来序列化数据。 有关此序列化程序的更多详细信息,请参阅JSON serialization

safe布尔参数默认为True 如果设置为False,则任何对象都可以传递用于序列化(否则只允许dict)实例。 如果safeTrue,并且一个非dict对象作为第一个参数传递,则会引发一个TypeError

json_dumps_params参数是传递给用于生成响应的json.dumps()调用的关键字参数的字典。

用法¶ T0>

典型的用法可能如下所示:

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

序列化非字典对象

为了序列化dict以外的对象,必须将safe参数设置为False

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

如果不传递safe=False,则会引发TypeError

警告

第五版的ECMAScript之前,有可能中毒JavaScript Array构造函数。 由于这个原因,Django默认情况下不允许将非字典对象传递给JsonResponse构造函数。 但是,大多数现代浏览器都使用EcmaScript 5来移除这个攻击媒介。 因此可以禁用此安全措施。

更改默认的JSON编码器

如果您需要使用不同的JSON编码器类,则可以将encoder参数传递给构造器方法:

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

StreamingHttpResponse objects

StreamingHttpResponse[source]

The StreamingHttpResponse class is used to stream a response from Django to the browser. 如果生成响应时间过长或使用太多内存,则可能需要执行此操作。 例如,generating large CSV files非常有用。

性能考虑

Django是为短命的请求而设计的。 流式响应将整个响应期间的工作进程绑定在一起。 这可能会导致性能不佳。

一般来说,您应该在请求 - 响应周期之外执行昂贵的任务,而不是诉诸流式响应。

StreamingHttpResponse不是HttpResponse的子类,因为它具有略微不同的API。 但是,它几乎是相同的,有以下显着差异:

  • 应该给它一个产生字符串作为内容的迭代器。
  • 除了迭代响应对象本身之外,您不能访问其内容。 这应该只在响应返回给客户端时发生。
  • 它没有content属性。 相反,它有一个streaming_content属性。
  • 您不能使用类似于文件的对象tell()write()方法。 这样做会引发一个例外。

StreamingHttpResponse should only be used in situations where it is absolutely required that the whole content isn’t iterated before transferring the data to the client. 由于内容不能访问,很多中间件无法正常运行。 例如,不能为流式响应生成ETagContent-Length头。

属性¶ T0>

StreamingHttpResponse。 streaming_content T0> ¶ T1>

表示内容的字符串的迭代器。

StreamingHttpResponse。 STATUS_CODE T0> ¶ T1>

响应的 HTTP status code

Unless reason_phrase is explicitly set, modifying the value of status_code outside the constructor will also modify the value of reason_phrase.

StreamingHttpResponse。 reason_phrase T0> ¶ T1>

响应的HTTP原因短语。 它使用 HTTP standard’s默认原因短语。

Unless explicitly set, reason_phrase is determined by the value of status_code.

StreamingHttpResponse。流 T0> ¶ T1>

这总是True

FileResponse对象

FileResponse[source]

FileResponse is a subclass of StreamingHttpResponse optimized for binary files. It uses wsgi.file_wrapper if provided by the wsgi server, otherwise it streams the file out in small chunks.

FileResponse expects a file open in binary mode like so:

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