Skip to main content

请求和响应对象

快速概述

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

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

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

HttpRequest 对象

class HttpRequest[源代码]

属性

除非另有说明,否则所有属性都应被视为只读属性。

HttpRequest.scheme

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

HttpRequest.body

原始HTTP请求正文作为字节字符串。这对于以不同于常规HTML表单的方式处理数据是有用的:二进制图像,XML有效负载等。对于处理常规表单数据,使用 HttpRequest.POST

您还可以使用类似文件的接口从Http请求中读取。见 HttpRequest.read()

HttpRequest.path

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

示例:"/music/bands/the_beatles/"

HttpRequest.path_info

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

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

HttpRequest.method

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

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

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

HttpRequest.content_type
New in Django 1.10.

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

HttpRequest.content_params
New in Django 1.10.

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

HttpRequest.GET

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

HttpRequest.POST

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

可能的是,通过使用空的 POST 字典的POST可以进入请求 - 例如,通过POST HTTP方法请求表单但不包括表单数据。因此,您不应使用 if request.POST 来检查POST方法的使用;相反,使用 if request.method == "POST" (见上文)。

注意:POST 确实 not 包括文件上传信息。参见 FILES

HttpRequest.COOKIES

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

HttpRequest.FILES

包含所有已上传文件的类似字典的对象。 FILES 中的每个键是来自 <input type="file" name="" />nameFILES 中的每个值是 UploadedFile

有关详细信息,请参阅 管理文件

注意,如果请求方法是POST并且发布到请求的 <form> 具有 enctype="multipart/form-data",则 FILES 将仅包含数据。否则,FILES 将是一个空白的类字典对象。

HttpRequest.META

包含所有可用HTTP标头的标准Python字典。可用的标头取决于客户端和服务器,但以下是一些示例:

  • CONTENT_LENGTH - 请求正文的长度(作为字符串)。

  • CONTENT_TYPE - 请求正文的MIME类型。

  • HTTP_ACCEPT - 响应的可接受内容类型。

  • HTTP_ACCEPT_ENCODING - 响应的可接受编码。

  • HTTP_ACCEPT_LANGUAGE - 响应的可接受的语言。

  • HTTP_HOST - 客户端发送的HTTP主机头。

  • HTTP_REFERER - 引荐页面(如果有)。

  • HTTP_USER_AGENT - 客户端的用户代理字符串。

  • QUERY_STRING - 查询字符串,作为单个(未解析的)字符串。

  • REMOTE_ADDR - 客户端的IP地址。

  • REMOTE_HOST - 客户端的主机名。

  • REMOTE_USER - 由Web服务器验证的用户(如果有)。

  • REQUEST_METHOD - 字符串,例如 "GET""POST"

  • SERVER_NAME - 服务器的主机名。

  • SERVER_PORT - 服务器的端口(作为字符串)。

除了上面给出的 CONTENT_LENGTHCONTENT_TYPE 之外,通过将所有字符转换为大写,将任何连字符替换为下划线并向名称添加 HTTP_ 前缀,将请求中的任何HTTP头转换为 META 密钥。因此,例如,称为 X-Bender 的报头将被映射到 META 密钥 HTTP_X_BENDER

请注意,runserver 会删除名称中带有下划线的所有标题,因此您不会在 META 中看到它们。这可以防止基于下划线和破折号之间的歧义的标题欺骗都正常化为WSGI环境变量中的下划线。它匹配Web服务器的行为,如Nginx和Apache 2.4+。

HttpRequest.resolver_match

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

应用程序代码设置的属性

Django不会设置这些属性本身,但使用它们,如果您的应用程序设置。

HttpRequest.current_app

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

HttpRequest.urlconf

这将用作当前请求的根URLconf,覆盖 ROOT_URLCONF 设置。有关详细信息,请参阅 Django如何处理请求

urlconf 可以设置为 None 以恢复以前的中间件所做的任何更改并返回到使用 ROOT_URLCONF

Changed in Django 1.9:

设置 urlconf=None 在旧版本中引发了 ImproperlyConfigured

由中间件设置的属性

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

HttpRequest.session

SessionMiddleware:一个可读和可写的,类似字典的对象,表示当前会话。

HttpRequest.site

CurrentSiteMiddlewareSiteRequestSite 的实例,由 get_current_site() 返回,表示当前站点。

HttpRequest.user

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.

方法

HttpRequest.get_host()[源代码]

使用来自 HTTP_X_FORWARDED_HOST (如果启用了 USE_X_FORWARDED_HOST)和 HTTP_HOST 头的信息按顺序返回请求的发起主机。如果它们不提供值,则该方法使用 PEP 3333 中详述的 SERVER_NAMESERVER_PORT 的组合。

示例:"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()
New in Django 1.9.

使用来自 HTTP_X_FORWARDED_PORT (如果启用了 USE_X_FORWARDED_PORT)和 SERVER_PORT META 变量的信息按顺序返回请求的源端口。

HttpRequest.get_full_path()[源代码]

返回 path,以及附加的查询字符串(如果适用)。

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

HttpRequest.build_absolute_uri(location)[源代码]

返回 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('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()[源代码]

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

HttpRequest.is_ajax()[源代码]

如果请求是通过 XMLHttpRequest 发出的,则通过检查字符串 'XMLHttpRequest'HTTP_X_REQUESTED_WITH 头来返回 True。大多数现代JavaScript库发送此标题。如果你编写自己的XMLHttpRequest调用(在浏览器端),你必须手动设置这个标题,如果你想 is_ajax() 工作。

如果一个响应不同是否通过AJAX请求,并且你正在使用某种形式的缓存,如Django的 cache middleware,你应该用 vary_on_headers('X-Requested-With') 装饰视图,以便响应被正确缓存。

HttpRequest.read(size=None)[源代码]
HttpRequest.readline()[源代码]
HttpRequest.readlines()[源代码]
HttpRequest.xreadlines()[源代码]
HttpRequest.__iter__()

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

给定此标准接口,HttpRequest实例可以直接传递到XML解析器,如ElementTree:

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

QueryDict 对象

class QueryDict[源代码]

HttpRequest 对象中,GETPOST 属性是 django.http.QueryDict 的实例,django.http.QueryDict 是一个类似字典的类,定制为处理同一个键的多个值。这是必要的,因为一些HTML表单元素(特别是 <select multiple>)为同一个键传递多个值。

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

方法

QueryDict 实现所有标准字典方法,因为它是字典的子类。例外情况如下:

QueryDict.__init__(query_string=None, mutable=False, encoding=None)[源代码]

基于 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 转换为unicode。如果未设置encoding,则默认为 DEFAULT_CHARSET

QueryDict.__getitem__(key)

返回给定键的值。如果键有多个值,__getitem__() 返回最后一个值。如果键不存在,则提高 django.utils.datastructures.MultiValueDictKeyError。 (这是Python的标准 KeyError 的子类,所以你可以坚持捕捉 KeyError。)

QueryDict.__setitem__(key, value)[源代码]

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

QueryDict.__contains__(key)

如果设置了给定的键,则返回 True。这让你做,例如,if "foo" in request.GET

QueryDict.get(key, default=None)

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

QueryDict.setdefault(key, default=None)[源代码]

就像标准字典 setdefault() 方法,除了它在内部使用 __setitem__()

QueryDict.update(other_dict)

使用 QueryDict 或标准字典。就像标准字典 update() 方法,除了它的 appends 到当前字典项而不是替换它们。例如:

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

就像标准字典 items() 方法,除了它使用与 __getitem__() 相同的最后一个逻辑。例如:

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

就像标准字典 iteritems() 方法。像 QueryDict.items() 一样,这使用与 QueryDict.__getitem__() 相同的最后一个逻辑。

仅适用于Python 2。

QueryDict.iterlists()

QueryDict.iteritems(),除了它包括作为列表的所有值,对于字典的每个成员。

仅适用于Python 2。

QueryDict.values()

就像标准字典 values() 方法,除了它使用与 __getitem__() 相同的最后一个逻辑。例如:

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

就像 QueryDict.values(),除了迭代器。

仅适用于Python 2。

此外,QueryDict 有以下方法:

QueryDict.copy()[源代码]

使用 copy.deepcopy() 从Python标准库返回对象的副本。此副本将是可变的,即使原件不是。

QueryDict.getlist(key, default=None)

使用请求的键返回数据,作为Python列表。如果键不存在并且未提供默认值,则返回空列表。它保证返回某种类型的列表,除非提供的默认值不是列表。

QueryDict.setlist(key, list_)[源代码]

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

QueryDict.appendlist(key, item)[源代码]

将项目附加到与键相关联的内部列表。

QueryDict.setlistdefault(key, default_list=None)[源代码]

就像 setdefault,除了它需要一个值列表而不是单个值。

QueryDict.lists()

items(),除了它包括所有值,作为列表,为字典的每个成员。例如:

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

返回给定键的值的列表,并从字典中删除它们。如果键不存在,则提升 KeyError。例如:

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

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

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

返回 QueryDictdict 表示。对于 QueryDict 中的每个(键,列表)对,dict 将具有(键,项),其中项是列表的一个元素,使用与 QueryDict.__getitem__() 相同的逻辑:

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

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

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

(可选)urlencode可以传递不需要编码的字符。例如:

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

HttpResponse 对象

class HttpResponse[源代码]

HttpRequest 对象(由Django自动创建)相反,HttpResponse 对象是您的责任。你写的每个视图都负责实例化,填充和返回 HttpResponse

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 一个迭代器而不是字符串。 HttpResponse 将立即使用迭代器,将其内容存储为字符串,并将其舍弃。具有 close() 方法的对象(例如文件和生成器)将立即关闭。

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

Changed in Django 1.10:

具有 close() 方法的对象在WSGI服务器对响应调用 close() 时曾经被关闭。

设置标题字段

要在响应中设置或删除头字段,请像字典一样对待:

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

注意,与字典不同,如果头字段不存在,del 不产生 KeyError

对于设置 Cache-ControlVary 头字段,建议使用 django.utils.cache 中的 patch_cache_control()patch_vary_headers() 方法,因为这些字段可以有多个逗号分隔的值。 “补丁”方法确保其他值,例如。通过中间件添加,不会删除。

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 头,但很容易忘记语法,所以我们已经包括在这里。

属性

HttpResponse.content

表示内容的字节,必要时从Unicode对象编码。

HttpResponse.charset

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

HttpResponse.status_code

HTTP status code 的响应。

Changed in Django 1.9:

除非显式地设置 reason_phrase,否则修改构造函数外的 status_code 的值也将修改 reason_phrase 的值。

HttpResponse.reason_phrase

响应的HTTP原因短语。

Changed in Django 1.9:

reason_phrase 不再默认为所有大写字母。它现在使用 HTTP standard’s 默认原因短语。

除非明确设置,否则 reason_phrasestatus_code 的当前值确定。

HttpResponse.streaming

这总是 False

此属性存在,因此中间件可以处理流响应与常规响应不同。

HttpResponse.closed

True 如果响应已关闭。

方法

HttpResponse.__init__(content='', content_type=None, status=200, reason=None, charset=None)[源代码]

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

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

content_type 是MIME类型,可选地由字符集编码完成,并用于填充HTTP Content-Type 头。如果未指定,则它由 DEFAULT_CONTENT_TYPEDEFAULT_CHARSET 设置形成,默认为:“ text/html; charset=utf-8 ”。

status 是响应的 HTTP status code

reason 是HTTP响应短语。如果未提供,将使用默认短语。

charset 是将对响应进行编码的字符集。如果没有给出,它将从 content_type 中提取,如果不成功,将使用 DEFAULT_CHARSET 设置。

HttpResponse.__setitem__(header, value)

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

HttpResponse.__delitem__(header)

删除具有给定名称的标题。如果标头不存在,则默认失败。不区分大小写。

HttpResponse.__getitem__(header)

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

HttpResponse.has_header(header)

基于对具有给定名称的头的不区分大小写的检查返回 TrueFalse

HttpResponse.setdefault(header, value)

设置标题,除非它已经设置。

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

  • max_age 应该是秒数,或者 None (默认),如果cookie应该只在客户端的浏览器会话持续。如果没有指定 expires,它将被计算。

  • expires 应为格式为 "Wdy, DD-Mon-YY HH:MM:SS GMT" 的字符串或UTC中的 datetime.datetime 对象。如果 expiresdatetime 对象,则将计算 max_age

  • 如果您要设置跨网域Cookie,请使用 domain。例如,domain=".lawrence.com" 将设置域www.lawrence.com,blogs.lawrence.com和calendars.lawrence.com可读的cookie。否则,Cookie只能由设置它的域读取。

  • 如果您希望防止客户端JavaScript访问Cookie,请使用 httponly=True

    HTTPOnly 是Set-Cookie HTTP响应头中包含的标志。它不是cookie的 RFC 2109 标准的一部分,并且它不被所有浏览器一致遵循。然而,当它被尊重时,它可以是一种有用的方式来减少客户端脚本访问受保护的cookie数据的风险。

警告

RFC 2109RFC 6265 都声明用户代理应该支持至少4096字节的cookie。对于许多浏览器,这也是最大大小。如果尝试存储大于4096字节的cookie,Django不会引发异常,但是许多浏览器不会正确设置cookie。

set_cookie(),但 加密签名 的cookie之前设置它。与 HttpRequest.get_signed_cookie() 一起使用。您可以使用可选的 salt 参数来添加键强度,但您需要记住将其传递给相应的 HttpRequest.get_signed_cookie() 调用。

使用给定的键删除cookie。如果键不存在,则默认失败。

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

HttpResponse.write(content)[源代码]

这个方法使 HttpResponse 实例成为一个类文件对象。

HttpResponse.flush()

这个方法使 HttpResponse 实例成为一个类文件对象。

HttpResponse.tell()[源代码]

这个方法使 HttpResponse 实例成为一个类文件对象。

HttpResponse.getvalue()[源代码]

返回 HttpResponse.content 的值。此方法使 HttpResponse 实例是类流对象。

HttpResponse.readable()
New in Django 1.10:

总是 False。此方法使 HttpResponse 实例是类流对象。

HttpResponse.seekable()
New in Django 1.10:

总是 False。此方法使 HttpResponse 实例是类流对象。

HttpResponse.writable()[源代码]

总是 True。此方法使 HttpResponse 实例是类流对象。

HttpResponse.writelines(lines)[源代码]

将线列表写入响应。不添加行分隔符。此方法使 HttpResponse 实例是类流对象。

HttpResponse 子类

Django包括一些处理不同类型的HTTP响应的 HttpResponse 子类。像 HttpResponse 一样,这些亚类存在于 django.http 中。

class HttpResponseRedirect[源代码]

构造函数的第一个参数是必需的 - 重定向到的路径。这可以是完全限定的网址(例如 'https://www.yahoo.com/search/'),无域的绝对路径(例如 '/search/'),或甚至相对路径(例如 'search/')。在后一种情况下,客户端浏览器将根据当前路径重建完整的URL本身。有关其他可选构造函数参数,请参见 HttpResponse。请注意,这会返回HTTP状态代码302。

url

此只读属性表示响应将重定向到的URL(等效于 Location 响应头)。

class HttpResponsePermanentRedirect[源代码]

HttpResponseRedirect,但它返回永久重定向(HTTP状态代码301)而不是“发现”重定向(状态代码302)。

class HttpResponseNotModified[源代码]

构造函数不接受任何参数,并且不应将任何内容添加到此响应。使用此选项可指定自用户上次请求以来未修改页面(状态代码304)。

class HttpResponseBadRequest[源代码]

行为就像 HttpResponse,但使用400状态码。

class HttpResponseNotFound[源代码]

行为就像 HttpResponse,但使用404状态码。

class HttpResponseForbidden[源代码]

行为就像 HttpResponse,但使用403状态码。

class HttpResponseNotAllowed[源代码]

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

class HttpResponseGone[源代码]

行为就像 HttpResponse,但使用410状态码。

class HttpResponseServerError[源代码]

行为就像 HttpResponse,但使用500状态码。

注解

如果 HttpResponse 的自定义子类实现了 render 方法,Django会将其视为模拟 SimpleTemplateResponse,并且 render 方法本身必须返回有效的响应对象。

JsonResponse 对象

class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs)[源代码]

有助于创建JSON编码响应的 HttpResponse 子类。它从它的超类继承了大多数行为,有几个区别:

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

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

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

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

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

Changed in Django 1.9:

添加了 json_dumps_params 参数。

用法

典型用法看起来像:

>>> 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默认不允许将非dict对象传递给 JsonResponse 构造函数。然而,大多数现代浏览器实现EcmaScript 5删除这个攻击向量。因此,可以禁用此安全预防措施。

更改默认JSON编码器

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

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

StreamingHttpResponse 对象

class StreamingHttpResponse[源代码]

StreamingHttpResponse 类用于将来自Django的响应流式传输到浏览器。如果生成响应所需时间过长或使用太多内存,则可能需要执行此操作。例如,它对 生成大型CSV文件 有用。

性能注意事项

Django是为短期请求而设计的。流响应将在响应的整个持续时间绑定工作进程。这可能会导致性能降低。

一般来说,你应该在请求 - 响应周期之外执行昂贵的任务,而不是求助于流传输的响应。

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

  • 它应该给一个迭代器,产生字符串作为内容。

  • 您无法访问其内容,但通过迭代响应对象本身除外。这应该只有当响应返回到客户端时才会发生。

  • 它没有 content 属性。相反,它有一个 streaming_content 属性。

  • 您不能使用类文件对象 tell()write() 方法。这样做会引发异常。

StreamingHttpResponse 只应在绝对需要在将数据传输到客户端之前不重复整个内容的情况下使用。由于内容无法访问,许多中间件无法正常工作。例如,不能为流响应生成 ETagContent-Length 头。

属性

StreamingHttpResponse.streaming_content

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

StreamingHttpResponse.status_code

HTTP status code 的响应。

Changed in Django 1.9:

除非显式地设置 reason_phrase,否则修改构造函数外的 status_code 的值也将修改 reason_phrase 的值。

StreamingHttpResponse.reason_phrase

响应的HTTP原因短语。

Changed in Django 1.9:

reason_phrase 不再默认为所有大写字母。它现在使用 HTTP standard’s 默认原因短语。

除非明确设置,否则 reason_phrasestatus_code 的当前值确定。

StreamingHttpResponse.streaming

这总是 True

FileResponse 对象

class FileResponse[源代码]

FileResponse 是针对二进制文件优化的 StreamingHttpResponse 的子类。它使用 wsgi.file_wrapper (如果由wsgi服务器提供),否则它以小块流式传输文件。

FileResponse 期望文件以二进制模式打开,如此:

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