decorators(装饰器)
1. require_http_methods
在django.views.decorators.http中,可以用来限制请求的权限。
require_http_methods(request_method_list), 这样只有request_method_list中的方法可以得到结果,否则view不会接受请求。看下面官方例子,@require_http_methods(["GET","POST"]),结果是只有GET,POST的请求会被接受。注意,“GET”,"POST"需要大写。
from django.views.decorators.http import require_http_methods
@require_http_methods(["GET", "POST"])
def my_view(request):
# I can assume now that only GET or POST requests make it this far
# ...
pass
同样还可以单读要求只接受某一特定类型如,require_GET(), require_POST(),require_safe().
require_GET(), require_POST()好理解,那么这个require_safe()是怎么回事呢?注意safe没有大写。
事实上 http 定义了多个与服务器交互的方法,主要有:
OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。
HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
GET:向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。
POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT:向指定资源位置上传其最新内容。
DELETE:请求服务器删除Request-URI所标识的资源。
TRACE:回显服务器收到的请求,主要用于测试或诊断。
CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
那么,哪些被认为是safe的呢?答案是:GET, HEAD 主要是它们不会对请求数据进行修改。
2.控制缓存动作的装饰器:
condition(etag_func=None, last_modified_func=None)
etag(etag_func)
last_modified(last_modified_func)
Etag主要适用多次请求相同资源,如果已经缓存了一次,通过Etag返回状态来确认资源是否改变,需不需要再次缓存。
last_modified_func,返回标准datetime 值指定最后一次修改的时间,当资源不存在时返回None
3 压缩数据
这些装饰器在django.view.decorators.gzip中
gzip_page(), 根据浏览器的Accept-Encoding header,来确认是否支持压缩内容,如果允许,内容会被压缩。需要参考vary header
4 缓存
此装饰器在django.views.decorators.cache中
never_cache(view_func)
这个装饰器会添加一个包含:Cache-Control: max-age=0, no-cache, no-store,must-revalidate 的header来指定该资源永不缓存
注:在django 1.9 之前则发送:Cache-Control: max-age=0,并不能保证在所有浏览器可靠。