请求和响应对象

快速概述

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

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

本文档解释了 HttpRequestHttpResponse 对象,在 django.http 模块。

HttpRequest 对象

class HttpRequest[源代码]

属性

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

HttpRequest.scheme

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

HttpRequest.body

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

你也可以从 HttpRequest 使用类似文件的接口 HttpRequest.read()HttpRequest.readline() . 访问 body 属性 之后 使用这些I/O流方法之一读取请求将生成 RawPostDataException .

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

表示请求的mime类型的字符串,从 CONTENT_TYPE 标题。

HttpRequest.content_params

包含在 CONTENT_TYPE 标题。

HttpRequest.GET

一个类似字典的对象,包含所有给定的HTTP GET参数。见 QueryDict 文件如下。

HttpRequest.POST

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

有可能一个请求可以通过一个空邮件进入 POST 字典——例如,如果表单是通过PostHTTP方法请求的,但不包括表单数据。因此,你不应该使用 if request.POST 检查post方法的使用;相反,使用 if request.method == "POST" (见 HttpRequest.method

POSTnot 包括文件上载信息。见 FILES .

HttpRequest.COOKIES

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

HttpRequest.FILES

包含所有上载文件的类似字典的对象。每个密钥 FILESname<input type="file" name=""> . 每一个值 FILES 是一个 UploadedFile .

文档管理 更多信息。

FILES 仅当请求方法为post且 <form> 发布到请求中的 enctype="multipart/form-data" . 否则, FILES 将是类似于空字典的对象。

HttpRequest.META

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

  • 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头都将转换为 META 通过将所有字符转换为大写、用下划线替换任何连字符并添加 HTTP_ 名称的前缀。例如,一个名为 X-Bender 将映射到 META 钥匙 HTTP_X_BENDER .

请注意 runserver 去掉名称中带有下划线的所有标题,这样您就看不到它们了 META 。这防止了基于下划线和破折号之间的歧义的标题欺骗,这两者在WSGI环境变量中都被规范化为下划线。它与Nginx和Apache2.4+等Web服务器的行为相匹配。

HttpRequest.headers 是访问所有HTTP前缀头的简单方法,另外 CONTENT_LENGTHCONTENT_TYPE .

HttpRequest.headers

一个不区分大小写、类似dict的对象,提供对所有HTTP前缀头(加上 Content-LengthContent-Type )来自请求。

每个标题的名称都使用标题大小写(例如 User-Agent )显示时。您可以访问标头,不区分大小写:

>>> request.headers
{'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6', ...}

>>> "User-Agent" in request.headers
True
>>> "user-agent" in request.headers
True

>>> request.headers["User-Agent"]
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
>>> request.headers["user-agent"]
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)

>>> request.headers.get("User-Agent")
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
>>> request.headers.get("user-agent")
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)

例如,在Django模板中使用,也可以使用下划线代替连字符来查找标题:

{{ request.headers.user_agent }}
HttpRequest.resolver_match

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

应用程序代码设置的属性

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

HttpRequest.current_app

这个 url 模板标记将使用其值作为 current_app 参数 reverse() .

HttpRequest.urlconf

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

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

HttpRequest.exception_reporter_filter

这将代替 DEFAULT_EXCEPTION_REPORTER_FILTER 对于当前请求。看到了吗 自定义错误报告 有关详细信息。

HttpRequest.exception_reporter_class

这将代替 DEFAULT_EXCEPTION_REPORTER 对于当前请求。看到了吗 自定义错误报告 有关详细信息。

中间件设置的属性

Django的contrib应用程序中包含的一些中间件根据请求设置属性。如果在请求上看不到属性,请确保在 MIDDLEWARE .

HttpRequest.session

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

HttpRequest.site

CurrentSiteMiddleware :的实例 SiteRequestSite 由返回 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.

这个 auser() 方法做同样的事情,但可以在异步上下文中使用。

方法

HttpRequest.auser()
New in Django 5.0.

AuthenticationMiddleware :Coroutine。返回 AUTH_USER_MODEL 表示当前登录的用户。如果用户当前未登录, auser 将返回 AnonymousUser 。这类似于 user 属性,但它在异步上下文中工作。

HttpRequest.get_host()[源代码]

使用来自 HTTP_X_FORWARDED_HOST (如果 USE_X_FORWARDED_HOST 启用) HTTP_HOST 头,按这个顺序。如果它们不提供值,则该方法使用 SERVER_NAMESERVER_PORT 详述 PEP 3333 .

例子: "127.0.0.1:8000"

加薪 django.core.exceptions.DisallowedHost 如果主机不在 ALLOWED_HOSTS or the domain name is invalid according to RFC 1034/1035

备注

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

class MultipleProxyMiddleware:
    FORWARDED_FOR_FIELDS = [
        "HTTP_X_FORWARDED_FOR",
        "HTTP_X_FORWARDED_HOST",
        "HTTP_X_FORWARDED_SERVER",
    ]

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(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()
        return self.get_response(request)

这个中间件应该放在任何其他依赖于 get_host() --例如, CommonMiddlewareCsrfViewMiddleware .

HttpRequest.get_port()[源代码]

使用来自的信息返回请求的起始端口 HTTP_X_FORWARDED_PORT (如果 USE_X_FORWARDED_PORT 启用) SERVER_PORT META 变量,按顺序排列。

HttpRequest.get_full_path()[源代码]

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

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

HttpRequest.get_full_path_info()[源代码]

喜欢 get_full_path() 但使用 path_info 而不是 path .

例子: "/minfo/music/bands/the_beatles/?print=true"

HttpRequest.build_absolute_uri(location=None)[源代码]

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

如果该位置已经是绝对URI,则不会更改它。否则,将使用此请求中可用的服务器变量生成绝对URI。例如:

>>> request.build_absolute_uri()
'https://example.com/music/bands/the_beatles/?print=true'
>>> request.build_absolute_uri("/bands/")
'https://example.com/bands/'
>>> request.build_absolute_uri("https://example2.com/bands/")
'https://example2.com/bands/'

备注

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

返回已签名cookie的cookie值,或引发 django.core.signing.BadSignature 签名不再有效时出现异常。如果你提供 default 参数异常将被抑制,并返回默认值。

可选的 salt 参数可以用来提供额外的保护,防止对您的密钥进行暴力攻击。如果提供,则 max_age 将根据附加到cookie值的签名时间戳检查参数,以确保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()[源代码]

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

HttpRequest.accepts(mime_type)[源代码]

退货 True 如果请求 Accept 标头与 mime_type 论据:

>>> request.accepts("text/html")
True

大多数浏览器发送 Accept: */* 默认情况下,它将返回 True 对于所有内容类型。设置显式 Accept API请求中的头对于仅为这些使用者返回不同的内容类型非常有用。看到了吗 内容协商示例 使用 accepts() 向API使用者返回不同的内容。

如果响应根据 Accept header和您使用的是类似Django的某种形式的缓存 cache middleware ,你应该用 vary_on_headers('Accept') 以便正确缓存响应。

HttpRequest.read(size=None)[源代码]
HttpRequest.readline()[源代码]
HttpRequest.readlines()[源代码]
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 ,一个类似字典的类,它被定制来处理同一个键的多个值。这是必要的,因为有些HTML表单元素,尤其是 <select multiple> ,为同一个键传递多个值。

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

方法

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

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

实例化A QueryDict 基于对象 query_string .

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

如果 query_string 没有传入,结果 QueryDict 将为空(它将没有键或值)。

大多数 QueryDict 你遇到的,尤其是那些 request.POSTrequest.GET ,将是不可变的。如果您自己正在实例化一个,则可以通过传递使其可变 mutable=True 对其 __init__() .

用于设置键和值的字符串将从 encodingstr .如果 encoding 未设置,默认为 DEFAULT_CHARSET .

classmethod QueryDict.fromkeys(iterable, value='', mutable=False, encoding=None)[源代码]

创建一个新的 QueryDict 密钥来自 iterable 并且每个值都等于 value 。例如:

>>> QueryDict.fromkeys(["a", "a", "b"], value="val")
<QueryDict: {'a': ['val', 'val'], 'b': ['val']}>
QueryDict.__getitem__(key)

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

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

将给定的键设置为 [value] (单个元素为 value )注意,这和其他字典函数一样具有副作用,只能对可变的 QueryDict (例如通过 QueryDict.copy()

QueryDict.__contains__(key)

返回 True 如果设置了给定的键。这样就可以了,例如, if "foo" in request.GET .

QueryDict.get(key, default=None)

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

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

喜欢 dict.setdefault() ,除非它使用 __setitem__() 内部的。

QueryDict.update(other_dict)

接受一项 QueryDict 或者是一本词典。喜欢 dict.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()

喜欢 dict.items() ,不同之处在于它使用与 __getitem__() 并返回迭代器对象而不是视图对象。例如:

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

喜欢 dict.values() ,不同之处在于它使用与 __getitem__() 并返回迭代器而不是视图对象。例如:

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

此外, QueryDict 有以下方法:

QueryDict.copy()[源代码]

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

QueryDict.getlist(key, default=None)

返回具有请求的键的数据列表。如果键不存在,则返回空列表,并且 defaultNone 。除非提供的默认值不是列表,否则保证返回列表。

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()

返回一个 dict 的代表 QueryDict 。对于中的每个(密钥、列表)对 QueryDictdict 将具有(key,Item),其中Item是列表的一个元素,使用与相同的逻辑 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'

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

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

HttpResponse 对象

class HttpResponse[源代码]

与…对比 HttpRequest 对象,由Django自动创建, HttpResponse 物品是你的责任。您编写的每个视图负责实例化、填充和返回 HttpResponse .

这个 HttpResponse 类生活在 django.http 模块。

使用

通过字符串

典型用法是将页面内容作为字符串、字节串或 memoryview ,致 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 = HttpResponse(b"Bytestrings are also accepted.")
>>> response = HttpResponse(memoryview(b"Memoryview as well."))

但如果您想要增量地添加内容,您可以使用 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 将立即使用迭代器,将其内容存储为字符串,然后丢弃它。对象与A close() 立即关闭文件和生成器等方法。

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

设置标题字段

若要设置或删除响应中的标头字段,请使用 HttpResponse.headers

>>> response = HttpResponse()
>>> response.headers["Age"] = 120
>>> del response.headers["Age"]

您还可以通过将您的响应当作词典来处理标题:

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

这代表 HttpResponse.headers ,是由提供的原始接口 HttpResponse .

当使用这个界面时,不像字典, del 不提高 KeyError 如果标题字段不存在。

您还可以在实例化时设置Header:

>>> response = HttpResponse(headers={"Age": 120})

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

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

告诉浏览器将响应视为文件附件

若要通知浏览器将响应视为文件附件,请将 Content-TypeContent-Disposition 标题。例如,您可以通过以下方式返回Microsoft Excel电子表格:

>>> response = HttpResponse(
...     my_data,
...     headers={
...         "Content-Type": "application/vnd.ms-excel",
...         "Content-Disposition": 'attachment; filename="foo.xls"',
...     },
... )

没有什么特别的 Content-Disposition 头,但很容易忘记语法,所以我们在这里包含了它。

属性

HttpResponse.content

一种表示内容的字节串,必要时用字符串编码。

HttpResponse.cookies

A http.cookies.SimpleCookie 对象,该对象包含响应中包含的Cookie。

HttpResponse.headers

不区分大小写的、类似于dict的对象,它提供指向响应上的所有HTTP标头的接口, Set-Cookie 标题。看见 设置标题字段HttpResponse.cookies

HttpResponse.charset

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

HttpResponse.status_code

这个 HTTP status code 以此作为回应。

除非 reason_phrase 显式设置,修改 status_code 在构造函数外部还将修改 reason_phrase .

HttpResponse.reason_phrase

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

除非明确规定, reason_phrase 由以下值确定 status_code .

HttpResponse.streaming

总是这样 False .

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

HttpResponse.closed

True 如果响应已关闭。

方法

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

实例化一个 HttpResponse 具有给定页内容、内容类型和页眉的。

content 通常是一个迭代器,bytestring, memoryview 或字符串。其他类型将通过编码其字符串表示形式转换为字节字符串。迭代器应该返回字符串或字节串,这些字符串或字节串将连接在一起以形成响应的内容。

content_type mime类型是否可以由字符集编码完成,并用于填充http Content-Type 标题。如果未指定,则由 'text/html' 以及 DEFAULT_CHARSET 默认设置: "text/html; charset=utf-8" .

statusHTTP status code 以此作为回应。您可以使用Python的 http.HTTPStatus 对于有意义的别名,例如 HTTPStatus.NO_CONTENT

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

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

headers 是一种 dict 响应的HTTP标头的。

HttpResponse.__setitem__(header, value)

将给定的头名称设置为给定值。两个 headervalue 应该是字符串。

HttpResponse.__delitem__(header)

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

HttpResponse.__getitem__(header)

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

HttpResponse.get(header, alternate=None)

返回给定标头的值,或 alternate 如果标头不存在。

HttpResponse.has_header(header)

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

HttpResponse.items()

表现得像 dict.items() 对于响应上的HTTP标头。

HttpResponse.setdefault(header, value)

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

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

  • max_age 应该是一个 timedelta 对象、整型秒数或 None 如果Cookie应仅在客户端的浏览器会话期间持续,则为(默认)。如果 expires 未指定,则将对其进行计算。

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

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

  • 使用 secure=True 如果希望仅在使用发出请求时将cookie发送到服务器 https 方案。

  • 使用 httponly=True 如果要阻止客户端javascript访问cookie。

    HttpOnly 是包含在set cookie HTTP响应头中的标志。它是 RFC 6265 标准的cookie,可以是一个有用的方式,以减轻客户端脚本访问受保护的cookie数据的风险。

  • 使用 samesite='Strict'samesite='Lax' 告诉浏览器在执行跨源请求时不要发送此cookie。 SameSite 不是所有浏览器都支持,所以它不是Django CSRF保护的替代品,而是深度防御措施。

    使用 samesite='None' (字符串)显式声明此cookie与所有相同站点和跨站点请求一起发送。

警告

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

喜欢 set_cookie() ,但是 cryptographic signing 设置前的cookie。与一起使用 HttpRequest.get_signed_cookie() . 您可以使用选项 salt 用于添加键强度的参数,但需要记住将其传递给相应的 HttpRequest.get_signed_cookie() 调用。

删除具有给定密钥的cookie。如果密钥不存在,则会自动失败。

因为 cookies 的工作方式, pathdomain 应该与您在中使用的值相同 set_cookie() --否则不能删除cookie。

HttpResponse.close()

这个方法在请求结束时由wsgi服务器直接调用。

HttpResponse.write(content)[源代码]

此方法使 HttpResponse 实例一个类似文件的对象。

HttpResponse.flush()

此方法使 HttpResponse 实例一个类似文件的对象。

HttpResponse.tell()[源代码]

此方法使 HttpResponse 实例一个类似文件的对象。

HttpResponse.getvalue()[源代码]

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

HttpResponse.readable()

总是 False . 此方法使 HttpResponse 实例一个类似流的对象。

HttpResponse.seekable()

总是 False . 此方法使 HttpResponse 实例一个类似流的对象。

HttpResponse.writable()[源代码]

总是 True . 此方法使 HttpResponse 实例一个类似流的对象。

HttpResponse.writelines(lines)[源代码]

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

HttpResponse 子类

Django包括 HttpResponse 处理不同类型HTTP响应的子类。喜欢 HttpResponse ,这些子类生活在 django.http .

class HttpResponseRedirect[源代码]

构造函数的第一个参数是必需的——重定向到的路径。这可以是完全限定的URL(例如 '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将其视为模拟 SimpleTemplateResponserender 方法本身必须返回有效的响应对象。

自定义响应类

如果您发现自己需要Django不提供的响应类,您可以在 http.HTTPStatus 。例如:

from http import HTTPStatus
from django.http import HttpResponse

class HttpResponseNoContent(HttpResponse):
    status_code = HTTPStatus.NO_CONTENT

JsonResponse 对象

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

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

其默认值 Content-Type 标题设置为 application/json .

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

这个 encoder ,默认为 django.core.serializers.json.DjangoJSONEncoder ,将用于序列化数据。见 JSON serialization 有关此序列化程序的详细信息。

这个 safe 布尔参数默认为 True . 如果它被设置为 False ,可以为序列化传递任何对象(否则仅限于 dict 允许实例)。如果 safeTrue 一个非“dict”对象作为第一个参数传递, TypeError 将被提升。

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

使用

典型用法可能如下所示:

>>> 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 ,A TypeError 将被提升。

请注意,基于 dict 对象的可扩展性更强、更灵活,并且更易于维护向前兼容性。因此,您应该避免在JSON编码的响应中使用非DICT对象。

警告

在此之前 5th edition of ECMAScript 它有可能毒化该脚本 Array 构造函数。因此,Django不允许将非dict对象传递给 JsonResponse 默认情况下,构造函数。然而,大多数现代浏览器都实现了ECMASIPT5,它移除了这一攻击媒介。因此,可以禁用此安全预防措施。

更改默认JSON编码器

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

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

StreamingHttpResponse 对象

class StreamingHttpResponse[源代码]

这个 StreamingHttpResponse 类用于将来自Django的响应传输到浏览器。

高级用法

StreamingHttpResponse 有些高级,因为知道您将在WSGI下同步还是在ASGI下异步服务应用程序,并适当地调整您的使用,这一点很重要。

请仔细阅读这些笔记。

的用法示例 StreamingHttpResponse 在WSGI下,流内容在生成响应时会花费太长时间或使用太多内存。例如,它对以下方面很有用 generating large CSV files

不过,在执行此操作时需要考虑性能问题。在WSGI下的Django是为短期请求设计的。流响应将在响应的整个持续时间内绑定一个工作进程。这可能会导致较差的性能。

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

然而,在ASGI下服务时, StreamingHttpResponse 无需在等待I/O的同时停止服务其他请求。这为长期请求流内容和实现模式(如长轮询和服务器发送的事件)打开了可能性。

即使在ASGI的记录下, StreamingHttpResponse 应该仅在绝对要求在将数据传输到客户端之前不迭代整个内容的情况下使用。由于内容无法访问,很多中间件无法正常工作。例如, ETagContent-Length 无法为流响应生成标头。

这个 StreamingHttpResponse 不是的子类 HttpResponse 因为它的API稍有不同。然而,它几乎是相同的,具有以下显著差异:

  • 它应该被赋予一个产生字节串的迭代器, memoryview ,或将字符串作为内容。当在WSGI下服务时,这应该是一个同步迭代器。当在ASGI下服务时,它应该是一个异步迭代器。

  • 您不能访问其内容,除非通过迭代响应对象本身。这应该只有在响应返回到客户端时才会发生:您不应该自己迭代响应。

    在WSGI下,响应将被同步迭代。在ASGI下,响应将被异步迭代。(这就是迭代器类型必须与您正在使用的协议匹配的原因。)

    为了避免崩溃,在迭代期间会将不正确的迭代器类型映射到正确的类型,并会引发警告,但要做到这一点,必须完全使用迭代器,这就违背了使用 StreamingHttpResponse 完全没有。

  • 它没有 content 属性。相反,它有一个 streaming_content 属性。这可以在中间件中用来包装可迭代的响应,但不应该使用。

  • 不能使用类似文件的对象 tell()write() 方法。这样做会引发一个例外。

这个 HttpResponseBase 基类在以下方面是常见的 HttpResponseStreamingHttpResponse

属性

StreamingHttpResponse.streaming_content

响应内容的迭代器,bytestring根据 HttpResponse.charset .

StreamingHttpResponse.status_code

这个 HTTP status code 以此作为回应。

除非 reason_phrase 显式设置,修改 status_code 在构造函数外部还将修改 reason_phrase .

StreamingHttpResponse.reason_phrase

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

除非明确规定, reason_phrase 由以下值确定 status_code .

StreamingHttpResponse.streaming

总是这样 True .

StreamingHttpResponse.is_async

布尔值,指示 StreamingHttpResponse.streaming_content 是否为异步迭代器。

这对于需要包装的中间件很有用 StreamingHttpResponse.streaming_content

处理断开连接

New in Django 5.0.

如果客户端在流响应期间断开连接,Django将取消正在处理响应的协程。如果要手动清理资源,可以通过捕获 asyncio.CancelledError **

async def streaming_response():
    try:
        # Do some work here
        async for chunk in my_streaming_iterator():
            yield chunk
    except asyncio.CancelledError:
        # Handle disconnect
        ...
        raise


async def my_streaming_view(request):
    return StreamingHttpResponse(streaming_response())

此示例仅显示如何在响应流传输时处理客户端断开。如果在返回 StreamingHttpResponse 对象,则您可能还希望 handle disconnections in the view 它本身。

FileResponse 对象

class FileResponse(open_file, as_attachment=False, filename='', **kwargs)[源代码]

FileResponse 是的子类 StreamingHttpResponse 为二进制文件优化。它使用 wsgi.file_wrapper 如果由wsgi服务器提供,否则它会将文件分块输出。

如果 as_attachment=True , the Content-Disposition 标题设置为 attachment ,它要求浏览器将文件作为下载提供给用户。否则,a Content-Disposition 值为的标头 inline (浏览器默认设置)只有在文件名可用时才会设置。

如果 open_file 没有名字或者 open_file 不合适,请使用 filename 参数。注意,如果您传递一个类似文件的对象 io.BytesIO ,这是你的任务 seek() 在传递给 FileResponse .

这个 Content-Length 当可以从的内容中猜到标头时,自动设置标头 open_file

这个 Content-Type 属性中猜测到标头时,自动设置标头 filename ,或名称为 open_file

FileResponse 接受包含二进制内容的任何类似文件的对象,例如以二进制模式打开的文件,如下所示:

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

文件将自动关闭,因此不要使用上下文管理器打开它。

在ASGI下使用

Python的文件API是同步的。这意味着文件必须被完全使用,才能在ASGI下提供服务。

为了以异步方式传输文件,您需要使用提供异步文件API的第三方包,例如 aiofiles

方法

FileResponse.set_headers(open_file)[源代码]

在响应初始化期间自动调用此方法并设置各种头 (Content-LengthContent-TypeContent-Disposition 取决于 open_file .

HttpResponseBase 班级

class HttpResponseBase[源代码]

这个 HttpResponseBase 类是所有Django响应所共有的。它不应用于直接创建响应,但可用于类型检查。