Django使用请求和响应对象通过系统传递状态。
当请求页面时,Django将创建一个 HttpRequest
包含有关请求的元数据的对象。然后Django加载适当的视图,通过 HttpRequest
作为视图函数的第一个参数。每个视图负责返回 HttpResponse
对象。
本文档解释了 HttpRequest
和 HttpResponse
对象,在 django.http
模块。
HttpRequest
对象¶除非另有说明,否则所有属性都应视为只读。
原始HTTP请求主体作为字节字符串。这对于以不同于传统HTML表单的方式处理数据很有用:二进制图像、XML有效负载等。对于处理传统表单数据,请使用 HttpRequest.POST
.
您还可以阅读 HttpRequest
使用类似文件的界面 HttpRequest.read()
或 HttpRequest.readline()
.访问 body
属性 after 使用这些I/O流方法之一读取请求将产生 RawPostDataException
。
表示所请求页面的完整路径的字符串,不包括方案、域或查询字符串。
例子: "/music/bands/the_beatles/"
在某些Web服务器配置下,主机名后的URL部分分为脚本前缀部分和路径信息部分。这个 path_info
属性始终包含路径的路径信息部分,无论使用的是哪种Web服务器。用这个来代替 path
可以使您的代码更容易在测试服务器和部署服务器之间移动。
例如,如果 WSGIScriptAlias
因为您的应用程序设置为 "/minfo"
然后 path
可能是 "/minfo/music/bands/the_beatles/"
和 path_info
将是 "/music/bands/the_beatles/"
.
表示请求中使用的HTTP方法的字符串。这保证是大写的。例如::
if request.method == "GET":
do_something()
elif request.method == "POST":
do_something_else()
表示用于解码表单提交数据的当前编码的字符串(或 None
也就是说 DEFAULT_CHARSET
使用设置)。可以写入此属性以更改访问表单数据时使用的编码。任何后续属性访问(例如从 GET
或 POST
)将使用新的 encoding
价值。如果知道表单数据不在 DEFAULT_CHARSET
编码。
表示请求的mime类型的字符串,从 CONTENT_TYPE
标题。
包含在 CONTENT_TYPE
标题。
一个类似字典的对象,包含所有给定的HTTP POST参数,前提是请求包含表单数据。见 QueryDict
文件如下。如果需要访问发布在请求中的原始或非表单数据,请通过 HttpRequest.body
改为属性。
有可能一个请求可以通过一个空邮件进入 POST
字典——例如,如果表单是通过PostHTTP方法请求的,但不包括表单数据。因此,你不应该使用 if request.POST
检查post方法的使用;相反,使用 if request.method == "POST"
(见 HttpRequest.method
)
POST
做 not 包括文件上载信息。见 FILES
.
包含所有cookie的字典。键和值是字符串。
包含所有上载文件的类似字典的对象。每个密钥 FILES
是 name
从 <input type="file" name="">
. 每一个值 FILES
是一个 UploadedFile
.
见 文档管理 更多信息。
FILES
仅当请求方法为post且 <form>
发布到请求中的 enctype="multipart/form-data"
. 否则, FILES
将是类似于空字典的对象。
包含所有可用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_LENGTH
和 CONTENT_TYPE
如上所述,请求中的任何HTTP头都将转换为 META
通过将所有字符转换为大写、用下划线替换任何连字符并添加 HTTP_
名称的前缀。例如,一个名为 X-Bender
将映射到 META
钥匙 HTTP_X_BENDER
.
请注意 runserver
去掉名称中带有下划线的所有标题,这样您就看不到它们了 META
。这防止了基于下划线和破折号之间的歧义的标题欺骗,这两者在WSGI环境变量中都被规范化为下划线。它与Nginx和Apache2.4+等Web服务器的行为相匹配。
HttpRequest.headers
是访问所有HTTP前缀头的简单方法,另外 CONTENT_LENGTH
和 CONTENT_TYPE
.
一个不区分大小写、类似dict的对象,提供对所有HTTP前缀头(加上 Content-Length
和 Content-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 }}
的实例 ResolverMatch
表示解析的URL。此属性仅在URL解析发生后设置,这意味着它在所有视图中都可用,但在URL解析发生前执行的中间件中不可用(您可以在 process_view()
尽管如此。
Django本身不设置这些属性,但如果由应用程序设置,则使用它们。
这将用作当前请求的根urlconf,覆盖 ROOT_URLCONF
设置。见 Django如何处理请求 有关详细信息。
urlconf
可以设置为 None
恢复先前中间件所做的任何更改并返回到使用 ROOT_URLCONF
.
这将用于代替 DEFAULT_EXCEPTION_REPORTER_FILTER
针对当前请求。看到 自定义错误报告 了解更多细节。
这将用于代替 DEFAULT_EXCEPTION_REPORTER
针对当前请求。看到 自定义错误报告 了解更多细节。
Django的contrib应用程序中包含的一些中间件根据请求设置属性。如果在请求上看不到属性,请确保在 MIDDLEWARE
.
从 SessionMiddleware
:表示当前会话的可读和可写的类似字典的对象。
从 CurrentSiteMiddleware
:的实例 Site
或 RequestSite
由返回 get_current_site()
表示当前站点。
从 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()
方法做同样的事情,但可以在异步上下文中使用。
从 AuthenticationMiddleware
:Coroutine。返回 AUTH_USER_MODEL
表示当前登录的用户。如果用户当前未登录, auser
将返回 AnonymousUser
。这类似于 user
属性,但它在异步上下文中工作。
使用来自 HTTP_X_FORWARDED_HOST
(如果 USE_X_FORWARDED_HOST
启用) HTTP_HOST
头,按这个顺序。如果它们不提供值,则该方法使用 SERVER_NAME
和 SERVER_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()
--例如, CommonMiddleware
或 CsrfViewMiddleware
.
使用来自的信息返回请求的起始端口 HTTP_X_FORWARDED_PORT
(如果 USE_X_FORWARDED_PORT
启用) SERVER_PORT
META
变量,按顺序排列。
返回 path
,加上附加的查询字符串(如果适用)。
例子: "/music/bands/the_beatles/?print=true"
喜欢 get_full_path()
但使用 path_info
而不是 path
.
例子: "/minfo/music/bands/the_beatles/?print=true"
返回的绝对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 更多信息。
退货 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
实例。这使得以流式方式使用传入请求成为可能。一个常见的用例是使用迭代解析器处理一个大型XML负载,而不在内存中构建一个完整的XML树。
给定这个标准接口,一个 HttpRequest
实例可以直接传递给XML解析器,例如 ElementTree
::
import xml.etree.ElementTree as ET
for element in ET.iterparse(request):
process(element)
QueryDict
对象¶在一个 HttpRequest
对象 GET
和 POST
属性是的实例 django.http.QueryDict
,一个类似字典的类,它被定制来处理同一个键的多个值。这是必要的,因为有些HTML表单元素,尤其是 <select multiple>
,为同一个键传递多个值。
这个 QueryDict
的AT request.POST
和 request.GET
在正常请求/响应周期中访问时是不可变的。要获得可变版本,需要使用 QueryDict.copy()
.
QueryDict
实现所有标准字典方法,因为它是字典的子类。例外情况概述如下:
实例化A QueryDict
基于对象 query_string
.
>>> QueryDict("a=1&a=2&c=3")
<QueryDict: {'a': ['1', '2'], 'c': ['3']}>
如果 query_string
没有传入,结果 QueryDict
将为空(它将没有键或值)。
大多数 QueryDict
你遇到的,尤其是那些 request.POST
和 request.GET
,将是不可变的。如果您自己正在实例化一个,则可以通过传递使其可变 mutable=True
对其 __init__()
.
用于设置键和值的字符串将从 encoding
到 str
.如果 encoding
未设置,默认为 DEFAULT_CHARSET
.
创建一个新的 QueryDict
密钥来自 iterable
并且每个值都等于 value
。例如:
>>> QueryDict.fromkeys(["a", "a", "b"], value="val")
<QueryDict: {'a': ['val', 'val'], 'b': ['val']}>
返回给定键的值。如果键有多个值,则返回最后一个值。加薪 django.utils.datastructures.MultiValueDictKeyError
如果密钥不存在。(这是Python标准的一个子类) KeyError
所以你可以坚持抓捕 KeyError
)
将给定的键设置为 [value]
(单个元素为 value
)注意,这和其他字典函数一样具有副作用,只能对可变的 QueryDict
(例如通过 QueryDict.copy()
)
返回 True
如果设置了给定的键。这样就可以了,例如, if "foo" in request.GET
.
使用与相同的逻辑 __getitem__()
,如果键不存在则返回默认值。
喜欢 dict.setdefault()
,除非它使用 __setitem__()
内部的。
接受一项 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'
喜欢 dict.items()
,不同之处在于它使用与 __getitem__()
并返回迭代器对象而不是视图对象。例如:
>>> q = QueryDict("a=1&a=2&a=3")
>>> list(q.items())
[('a', '3')]
喜欢 dict.values()
,不同之处在于它使用与 __getitem__()
并返回迭代器而不是视图对象。例如:
>>> q = QueryDict("a=1&a=2&a=3")
>>> list(q.values())
['3']
此外, QueryDict
有以下方法:
使用返回对象的副本 copy.deepcopy()
. 即使原件不是,此副本也将是可变的。
返回具有请求的键的数据列表。如果键不存在,则返回空列表,并且 default
是 None
.保证返回列表,除非提供的默认值不是列表。
将给定的键设置为 list_
(不像 __setitem__()
)
喜欢 setdefault()
,但它采用值列表而不是单个值。
喜欢 items()
,除非它以列表的形式包含字典中每个成员的所有值。例如:
>>> q = QueryDict("a=1&a=2&a=3")
>>> q.lists()
[('a', ['1', '2', '3'])]
返回给定键的值列表并将其从字典中移除。加薪 KeyError
如果密钥不存在。例如:
>>> q = QueryDict("a=1&a=2&a=3", mutable=True)
>>> q.pop("a")
['1', '2', '3']
删除字典的任意成员(因为没有排序的概念),并返回一个包含键和键的所有值的列表的两值数组。加薪 KeyError
当在空词典上调用时。例如:
>>> q = QueryDict("a=1&a=2&a=3", mutable=True)
>>> q.popitem()
('a', ['1', '2', '3'])
返回一个 dict
的代表 QueryDict
。对于中的每个(密钥、列表)对 QueryDict
, dict
将具有(key,Item),其中Item是列表的一个元素,使用与相同的逻辑 QueryDict.__getitem__()
:
>>> q = QueryDict("a=1&a=3&a=5")
>>> q.dict()
{'a': '5'}
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-Control
和 Vary
标题字段,建议使用 patch_cache_control()
和 patch_vary_headers()
方法从 django.utils.cache
,因为这些字段可以有多个逗号分隔的值。“补丁”方法确保不会删除中间件添加的其他值。
HTTP头字段不能包含换行符。试图设置包含换行符(CR或LF)的头字段将引发 BadHeaderError
若要通知浏览器将响应视为文件附件,请将 Content-Type
和 Content-Disposition
标题。例如,您可以通过以下方式返回Microsoft Excel电子表格:
>>> response = HttpResponse(
... my_data,
... headers={
... "Content-Type": "application/vnd.ms-excel",
... "Content-Disposition": 'attachment; filename="foo.xls"',
... },
... )
没有什么特别的 Content-Disposition
头,但很容易忘记语法,所以我们在这里包含了它。
A http.cookies.SimpleCookie
对象,该对象包含响应中包含的Cookie。
不区分大小写的、类似于dict的对象,它提供指向响应上的所有HTTP标头的接口, Set-Cookie
标题。看见 设置标题字段 和 HttpResponse.cookies
。
表示将在其中对响应进行编码的字符集的字符串。如果没有给出 HttpResponse
实例化时间,将从 content_type
如果不成功, DEFAULT_CHARSET
将使用设置。
这个 HTTP status code 以此作为回应。
除非 reason_phrase
显式设置,修改 status_code
在构造函数外部还将修改 reason_phrase
.
响应的HTTP原因短语。它使用 HTTP standard's 默认原因短语。
除非明确规定, reason_phrase
由以下值确定 status_code
.
总是这样 False
.
此属性存在,因此中间件可以不同于常规响应来处理流式响应。
True
如果响应已关闭。
实例化一个 HttpResponse
具有给定页面内容、内容类型和标题的对象。
content
最常见的是迭代器、字节串、 memoryview
,或字符串。其他类型将通过对其字符串表示进行编码来转换为字节串。迭代器应该返回字符串或字节串,这些将被连接在一起以形成响应的内容。
content_type
是可以选择通过字符集编码完成的MBE类型,用于填充HTTP Content-Type
标头如果未指定,则由以下人员组成 'text/html'
以及 DEFAULT_CHARSET
默认情况下,设置: "text/html; charset=utf-8"
。
status
是 HTTP status code 以此作为回应。您可以使用Python的 http.HTTPStatus
对于有意义的别名,例如 HTTPStatus.NO_CONTENT
。
reason
是HTTP响应短语。如果未提供,将使用默认短语。
charset
将在其中对响应进行编码的字符集。如果没有给出,它将从 content_type
如果不成功, DEFAULT_CHARSET
将使用设置。
headers
是一种 dict
响应的HTTP标头。
将给定的头名称设置为给定值。两个 header
和 value
应该是字符串。
删除具有给定名称的头。如果头不存在,则自动失败。不区分大小写。
返回给定头名称的值。不区分大小写。
返回给定标头的值,或 alternate
如果标题不存在。
返回 True
或 False
基于对具有给定名称的头的不区分大小写检查。
作用就像 dict.items()
用于响应上的HTTP标头。
设置一个标题,除非它已经设置。
设置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
如果您希望仅在使用 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。如果密钥不存在,则会自动失败。
因为曲奇的工作方式, path
和 domain
应该与您在中使用的值相同 set_cookie()
--否则不能删除cookie。
这个方法在请求结束时由wsgi服务器直接调用。
此方法使 HttpResponse
实例一个类似文件的对象。
此方法使 HttpResponse
实例一个类似文件的对象。
此方法使 HttpResponse
实例一个类似文件的对象。
返回的值 HttpResponse.content
. 此方法使 HttpResponse
实例一个类似流的对象。
总是 False
. 此方法使 HttpResponse
实例一个类似流的对象。
总是 False
. 此方法使 HttpResponse
实例一个类似流的对象。
总是 True
. 此方法使 HttpResponse
实例一个类似流的对象。
将行列表写入响应。不添加行分隔符。此方法使 HttpResponse
实例一个类似流的对象。
HttpResponse
子类¶Django包括 HttpResponse
处理不同类型HTTP响应的子类。喜欢 HttpResponse
,这些子类生活在 django.http
.
构造函数的第一个参数是必需的——重定向到的路径。这可以是完全限定的URL(例如 'https://www.yahoo.com/search/'
,没有域的绝对路径(例如 '/search/'
或者甚至是相对路径(例如 'search/'
)在最后一种情况下,客户机浏览器将根据当前路径重新构造完整的URL本身。见 HttpResponse
对于其他可选的构造函数参数。请注意,这将返回HTTP状态代码302。
此只读属性表示响应将重定向到的URL(相当于 Location
响应头)。
喜欢 HttpResponseRedirect
但它返回一个永久重定向(HTTP状态代码301),而不是“找到”重定向(状态代码302)。
行为就像 HttpResponse
但使用400状态代码。
行为就像 HttpResponse
但使用404状态代码。
行为就像 HttpResponse
但使用403状态代码。
喜欢 HttpResponse
,但使用405状态代码。构造函数的第一个参数是必需的:允许方法的列表(例如 ['GET', 'POST']
)
行为就像 HttpResponse
但使用410状态代码。
行为就像 HttpResponse
但使用500状态代码。
备注
如果自定义子类 HttpResponse
实现一个 render
方法,Django将其视为模拟 SimpleTemplateResponse
和 render
方法本身必须返回有效的响应对象。
如果您发现自己需要Django不提供的响应类,您可以在 http.HTTPStatus
。例如::
from http import HTTPStatus
from django.http import HttpResponse
class HttpResponseNoContent(HttpResponse):
status_code = HTTPStatus.NO_CONTENT
JsonResponse
对象¶安 HttpResponse
帮助创建JSON编码响应的子类。它从它的超类继承了大多数行为,但有一些不同之处:
其默认 Content-Type
标头设置为 application/json 。
第一个参数, data
应该是 dict
实例。如果 safe
参数设置为 False
(见下文)它可以是任何JSON可序列化对象。
这个 encoder
,默认为 django.core.serializers.json.DjangoJSONEncoder
,将用于序列化数据。见 JSON serialization 有关此序列化程序的详细信息。
这个 safe
布尔参数默认为 True
. 如果它被设置为 False
,可以为序列化传递任何对象(否则仅限于 dict
允许实例)。如果 safe
是 True
一个非“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编码器类,可以将 encoder
构造函数方法的参数:
>>> response = JsonResponse(data, encoder=MyJSONEncoder)
StreamingHttpResponse
对象¶这个 StreamingHttpResponse
类用于将来自Django的响应传输到浏览器。
的用法示例 StreamingHttpResponse
在WSGI下,流内容在生成响应时会花费太长时间或使用太多内存。例如,它对以下方面很有用 generating large CSV files 。
不过,在执行此操作时需要考虑性能问题。在WSGI下的Django是为短期请求设计的。流响应将在响应的整个持续时间内绑定一个工作进程。这可能会导致较差的性能。
一般来说,您将在请求-响应周期之外执行昂贵的任务,而不是求助于流响应。
然而,在ASGI下服务时, StreamingHttpResponse
无需在等待I/O的同时停止服务其他请求。这为长期请求流内容和实现模式(如长轮询和服务器发送的事件)打开了可能性。
即使在ASGI的记录下, StreamingHttpResponse
应该仅在绝对要求在将数据传输到客户端之前不迭代整个内容的情况下使用。由于内容无法访问,很多中间件无法正常工作。例如, ETag
和 Content-Length
无法为流响应生成标头。
这个 StreamingHttpResponse
不是的子类 HttpResponse
因为它的API稍有不同。然而,它几乎是相同的,具有以下显著差异:
它应该被赋予一个产生字节串的迭代器, memoryview
,或将字符串作为内容。当在WSGI下服务时,这应该是一个同步迭代器。当在ASGI下服务时,它应该是一个异步迭代器。
您不能访问其内容,除非通过迭代响应对象本身。这应该只有在响应返回到客户端时才会发生:您不应该自己迭代响应。
在WSGI下,响应将被同步迭代。在ASGI下,响应将被异步迭代。(这就是迭代器类型必须与您正在使用的协议匹配的原因。)
为了避免崩溃,在迭代期间会将不正确的迭代器类型映射到正确的类型,并会引发警告,但要做到这一点,必须完全使用迭代器,这就违背了使用 StreamingHttpResponse
完全没有。
它没有 content
属性。相反,它有一个 streaming_content
属性。这可以在中间件中用来包装可迭代的响应,但不应该使用。
不能使用类似文件的对象 tell()
或 write()
方法。这样做会引发一个例外。
这个 HttpResponseBase
基类在以下方面是常见的 HttpResponse
和 StreamingHttpResponse
。
响应内容的迭代器,字节串根据 HttpResponse.charset
。
这个 HTTP status code 以此作为回应。
除非 reason_phrase
显式设置,修改 status_code
在构造函数外部还将修改 reason_phrase
.
响应的HTTP原因短语。它使用 HTTP standard's 默认原因短语。
除非明确规定, reason_phrase
由以下值确定 status_code
.
总是这样 True
.
布尔值,指示 StreamingHttpResponse.streaming_content
是否为异步迭代器。
这对于需要包装的中间件很有用 StreamingHttpResponse.streaming_content
。
如果客户端在流响应期间断开连接,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
对象¶FileResponse
是的子类 StreamingHttpResponse
针对二进制文件进行了优化。它使用 wsgi.file_wrapper 如果由wsgi服务器提供,否则它会以小块形式将文件流式传输出去。
如果 as_attachment=True
vt.的. Content-Disposition
标头设置为 attachment
,要求浏览器将该文件作为下载提供给用户。否则 Content-Disposition
值为的标头 inline
(the浏览器默认)仅在文件名可用时才会设置。
如果 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"))
文件将自动关闭,因此不要使用上下文管理器打开它。
HttpResponseBase
班级¶这个 HttpResponseBase
类是所有Django响应所共有的。它不应用于直接创建响应,但可用于类型检查。
7月 22, 2024