赞
踩
Django使用请求和响应对象来通过系统传递状态。
当请求页面时,Django创建一个HttpRequest包含有关请求的元数据的对象。然后Django加载适当的视图,将HttpRequest第一个参数传递给view函数。每个视图都负责返回一个HttpResponse对象。
属性
HttpRequest.scheme
表示请求方案(http或https 通常)的字符串。
HttpRequest.body
原始HTTP请求主体作为字节串。这对于以不同于传统HTML表单的方式处理数据非常有用:二进制映像,XML有效负载等。对于处理传统表单数据,请使用 HttpRequest.POST。
HttpRequest.path
表示所请求页面的完整路径的字符串,例: “/music/bands/the_beatles/”
HttpRequest.path_info
在某些Web服务器配置下,主机名后面的URL部分被分成脚本前缀部分和路径信息部分。path_info无论使用何种Web服务器,该属性始终包含路径的路径信息部分。使用它代替path可以使您的代码更容易在测试和部署服务器之间移动。
HttpRequest.method
表示请求中使用的HTTP方法的字符串。这必须是大写的。
if request.method == 'GET':
do_something()
elif request.method == 'POST':
do_something_else()
HttpRequest.encoding
示用于解码表单提交数据的当前编码的字符串(或者None,表示使用该DEFAULT_CHARSET设置)。您可以写入此属性以更改访问表单数据时使用的编码。任何后续属性访问(例如从GET或读取POST)都将使用新encoding值。
HttpRequest.content_type
表示请求的MIME类型的字符串,从CONTENT_TYPE标头解析 。
HttpRequest.content_params
CONTENT_TYPE 标题中包含的键/值参数字典。
HttpRequest.GET
类似字典的对象,包含所有给定的HTTP GET参数。
HttpRequest.POST
类似字典的对象,包含所有给定的HTTP POST参数,前提是请求包含表单数据。如果需要访问请求中发布的原始或非表单数据,则通过该HttpRequest.body属性访问该数据 。POST它不包含文件上传信息。
HttpRequest.COOKIES
包含所有cookie的字典。键和值是字符串。
HttpRequest.FILES
包含所有上传文件的类字典对象。每个键 FILES都name来自。每个值都是FILESUploadedFile。<input type="file" name="">
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_LENGTH和之外CONTENT_TYPE,如上所述,请求中的任何HTTP头都将转换为META键,方法是将所有字符转换为大写,用下划线替换任何连字符并HTTP_在名称中添加前缀。因此,例如,调用的标头X-Bender将映射到META密钥 HTTP_X_BENDER。
请注意,runserver在名称中删除带有下划线的所有标题,因此您将看不到它们META。这可以防止基于下划线和短划线之间的歧义的标头欺骗都在WSGI环境变量中对下划线进行规范化。它匹配Nginx和Apache 2.4+等Web服务器的行为。
HttpRequest.headers是一种更简单的方法来访问所有HTTP加前缀的标题,CONTENT_LENGTH和CONTENT_TYPE。
HttpRequest.headers
Django 2.2中的新功能:
一个不区分大小写的类似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本身不设置这些属性,但如果由应用程序设置,则使用它们。
HttpRequest.current_app
该url模板标签将使用它的值作为current_app 参数reverse()。
HttpRequest.urlconf
这将用作当前请求的根URLconf,覆盖ROOT_URLCONF设置。
urlconf可以设置为None还原以前的中间件所做的任何更改并返回使用ROOT_URLCONF。
Django的contrib应用程序中包含的一些中间件在请求中设置了属性。如果在请求中没有看到该属性,请确保列出了相应的中间件类MIDDLEWARE。
HttpRequest.session
来自SessionMiddleware:一个可读写的,类似字典的对象,代表当前会话。
HttpRequest.site
来自CurrentSiteMiddleware: 表示当前站点返回的实例Site或 RequestSite返回 的实例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.
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()
此中间件应位于依赖于其值的任何其他中间件之前- 例如, CommonMiddleware或 CsrfViewMiddleware。
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()
Django 2.1中的新功能:
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/'
例如:
>>> 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
HttpRequest.is_secure()
如果请求是安全的,则返回True; 也就是说,如果它是用HTTPS制作的。
HttpRequest.is_ajax()
如果请求被经由制成XMLHttpRequest返回True,通过检查HTTP_X_REQUESTED_WITH的字符串标题 ‘XMLHttpRequest’。大多数现代JavaScript库都会发送此标头。如果您编写自己的XMLHttpRequest呼叫(在浏览器端),如果您想要is_ajax()工作,则必须手动设置此标头。
如果响应是否通过AJAX请求并且您正在使用某种形式的缓存(如Django),则应该修改视图, 以便正确缓存响应。cache middlewarevary_on_headers(‘X-Requested-With’)
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实现所有标准字典方法,因为它是字典的子类。例外情况如下:
QueryDict.init(query_string = None,mutable = False,encoding = None)[source]
QueryDict基于实例化对象query_string。
>>> QueryDict('a=1&a=2&c=3')
<QueryDict: {'a': ['1', '2'], 'c': ['3']}>
如果query_string未传入,则结果QueryDict将为空(它将没有键或值)。
用于设置键和值的字符串将从转换encoding 为str。如果encoding未设置,则默认为 DEFAULT_CHARSET。
用法
>>> 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用作类文件对象:
>>> 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该类。
设置headers字段
要在响应中设置或删除标题字段,请将其视为字典:
>>> response = HttpResponse()
>>> response['Age'] = 120
>>> del response['Age']
请注意,与字典不同,如果标题字段不存在del不会引发KeyError。
对于设置Cache-Control和Vary头字段,建议使用patch_cache_control()和 patch_vary_headers()方法 django.utils.cache,因为这些字段可以有多个以逗号分隔的值。“补丁”方法确保不移除其他值,例如由中间件添加的值。
HTTP标头字段不能包含换行符。尝试设置包含换行符(CR或LF)的标题字段将会引发BadHeaderError
>>> response = HttpResponse(my_data, content_type='application/vnd.ms-excel')
>>> response['Content-Disposition'] = 'attachment; filename="foo.xls"'
关于Content-Disposition标题没有Django特有的,但很容易忘记语法,所以我们在这里包含它。
属性
HttpResponse.content
表示内容的字节字符串,如果需要,从字符串编码。
HttpResponse.charset
一个字符串,表示将在其中编码响应的字符集。如果未在HttpResponse实例化时间给出,则将从中提取 content_type,如果不成功,DEFAULT_CHARSET则将使用该 设置。
HttpResponse.status_code
该 响应的 HTTP状态代码。
除非reason_phrase明确设置,否则修改 status_code构造函数外部的值也会修改值 reason_phrase。
HttpResponse.reason_phrase
响应的HTTP原因短语。它使用了HTTP标准的默认原因短语。
除非明确设置,否则reason_phrase由值确定 status_code。
HttpResponse.streaming
默认False。
此属性存在,因此中间件可以不同于常规响应处理流式响应。
HttpResponse.closed
如果回复已经结束。返回True。
方法
HttpResponse.init(content = b’’,content_type = None,status = 200,reason = None,charset = None)
HttpResponse使用给定的页面内容和内容类型实例化对象。
content最常见的是迭代器,字节串或字符串。其他类型将通过编码其字符串表示形式转换为bytestring。迭代器应返回字符串或字节串,并将它们连接在一起以形成响应的内容。
content_type是可选的字符集编码完成的MIME类型,用于填充HTTP Content-Type标头。如果未指定,则默认情况下由DEFAULT_CONTENT_TYPE和 DEFAULT_CHARSET设置形成:“ text / html; charset = utf-8 “。
status 是个 响应的 HTTP状态代码。
reason是HTTP响应短语。如果未提供,将使用默认短语。
charset是编码响应的字符集。如果没有给出,它将从中提取content_type,如果不成功,DEFAULT_CHARSET将使用该设置。
HttpResponse.setitem
将给定的标题名称设置为给定值。双方header并 value应弦。
HttpResponse.delitem
删除具有给定名称的标头。如果标头不存在,则静默失败。不区分大小写。
HttpResponse.getitem
返回给定标头名称的值。不区分大小写。
HttpResponse.has_header
返回True或False基于对具有给定名称的标头的不区分大小写的检查。
HttpResponse.setdefault
除非已设置标头,否则设置标头。
HttpResponse.set_cookie(key,value =’’,max_age = None,expires = None,path =’/’,domain = None,secure = None,httponly = False,samesite = None)
设置一个cookie。参数Morsel与Python标准库中的cookie对象相同 。
max_age应该是几秒钟,或者None(默认)如果cookie应该只持续客户端的浏览器会话。如果expires未指定,则将进行计算。
expires应该是格式的字符串 或UTC中的对象。如果是对象, 则将计算。"Wdy, DD-Mon-YY HH:MM:SS GMT"datetime.datetimeexpiresdatetimemax_age
使用domain,如果你想设置一个跨域的cookie。例如, domain="example.com"将设置域www.example.com,blog.example.com等可读的cookie。否则,cookie只能由设置它的域读取。
使用httponly=True,如果你想阻止客户端的JavaScript有机会接触到cookie。
HttpOnly是Set-Cookie HTTP响应头中包含的标志。这是其中的一部分用于cookie的 RFC 6265标准,可以是一种有用的方法,可以降低客户端脚本访问受保护cookie数据的风险。
在执行跨源请求时,使用samesite='Strict’或samesite='Lax’告诉浏览器不要发送此cookie。 并非所有浏览器都支持SameSite,因此它不能替代Django的CSRF保护,而是深度防御措施。
在Django 2.1中更改:
这个samesite论点被添加了。
HttpResponse.set_signed_cookie(key,value,salt =’’,max_age = None,expires = None,path =’/’,domain = None,secure = None,httponly = False,samesite = None)¶
比如set_cookie(),但 在设置之前对cookie进行加密签名。与…一起使用HttpRequest.get_signed_cookie()。您可以使用可选salt参数来增加键强度,但是您需要记住将其传递给相应的 HttpRequest.get_signed_cookie()调用。
HttpResponse.delete_cookie(key,path =’/’,domain = None)
使用给定密钥删除cookie。如果密钥不存在,则默认失败。
由于Cookie的工作方式的,path并且domain应该是你所使用的相同的值set_cookie()-否则的cookie可能不会被删除。
HttpResponse.write
此方法使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
将响应列表写入响应。不添加行分隔符。此方法使HttpResponse实例成为类似流的对象。
Django包含许多HttpResponse处理不同类型HTTP响应的子类。就像HttpResponse,这些子类存在 django.http。
class HttpResponseRedirect
构造函数的第一个参数是必需的 - 重定向到的路径。这可以是完全限定的URL(例如’JsonResponse对象
classJsonResponse(data,encoder = DjangoJSONEncoder,safe = True,json_dumps_params = None,** kwargs)[source] ¶
HttpResponse有助于创建JSON编码响应的子类。它从其超类继承了大多数行为,但存在一些差异:
其默认Content-Type标头设置为application/json。
第一个参数data应该是一个dict实例。如果 safe参数设置为False(见下文),则它可以是任何JSON可序列化对象。
encoder,缺省值为 django.core.serializers.json.DjangoJSONEncoder,将用于序列化的数据。
该safe布尔参数默认为True。如果设置为 False,则可以传递任何对象以进行序列化(否则仅 dict允许实例)。如果safe是,True并且非dict 对象作为第一个参数传递,TypeError则将引发a。
该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,TypeError将提出一个。
在第5版ECMAScript 之前,可能会破坏JavaScript Array构造函数。因此,Django JsonResponse默认情况下不允许将非dict对象传递给 构造函数。但是,大多数现代浏览器都实现了EcmaScript 5,它可以删除此攻击媒介。因此,可以禁用此安全预防措施。
>>> response = JsonResponse(data, encoder=MyJSONEncoder)
性能考虑因素
Django专为短期请求而设计。流响应将在整个响应期间将工作进程联系起来。这可能导致性能不佳。
一般来说,您应该在请求 - 响应周期之外执行昂贵的任务,而不是诉诸流式响应。
本StreamingHttpResponse就不是一个子类HttpResponse,因为它的功能略有不同的API。但是,它几乎相同,但有以下显着差异:
它应该被赋予一个迭代器,它产生字符串作为内容。
除非通过迭代响应对象本身,否则无法访问其内容。只有在将响应返回给客户端时才会发生这种情况。
它没有content属性。相反,它有一个 streaming_content属性。
您不能使用类文件对象tell()或write()方法。这样做会引发异常。
StreamingHttpResponse只应在绝对需要在将数据传输到客户端之前不迭代整个内容的情况下使用。由于无法访问内容,许多中间件无法正常运行。例如,无法为流式响应生成ETag和 Content-Length标头。
属性
StreamingHttpResponse.streaming_content
表示内容的字符串迭代器。
StreamingHttpResponse.status_code
该 响应的 HTTP状态代码。
除非reason_phrase明确设置,否则修改 status_code构造函数外部的值也会修改值 reason_phrase。
StreamingHttpResponse.reason_phrase
响应的HTTP原因短语。它使用了HTTP标准的默认原因短语。
除非明确设置,否则reason_phrase由值确定 status_code。
StreamingHttpResponse.streaming
这总是如此True。
classFileResponse(open_file,as_attachment = False,filename =’’,** kwargs)[source]
FileResponse是StreamingHttpResponse 针对二进制文件优化的子类。如果由wsgi服务器提供,它使用wsgi.file_wrapper,否则它将文件以小块的形式流出。
如果设置as_attachment=True了Content-Disposition标题,则要求浏览器将文件作为下载提供给用户。
如果open_file没有名称或名称open_file不合适,请使用filename 参数提供自定义文件名。
Content-Length,Content-Type和Content-Disposition 当他们可以从内容猜测头部被自动设定 open_file。
Django 2.1中的新功能:
在as_attachment和filename关键字参数添加。此外,如果它可以猜测它们,FileResponse设置Content标题。
FileResponse 接受任何具有二进制内容的类文件对象,例如以二进制模式打开的文件,如下所示:
>>> from django.http import FileResponse
>>> response = FileResponse(open('myfile.png', 'rb'))
该文件将自动关闭,因此不要使用上下文管理器打开它。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。