Django 视图装饰器,视图装饰器是一系列视图方法的属性,用于提供对HTTP请求报文的设置。
HTTP方法装饰器
HTTP方法装饰器用于约束访问视图的请求类型,该装饰器位于django.views.decorators.http
模块。当访问视图的请求类型不正确时,HTTP方法装饰器将会返回django.http.HttpResponseNotAllowed
异常错误。
代码示例:
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
需要注意的是,HTTP请求类型必须使用大写字母。
如果仅允许使用GET、POST或者其他安全类型(如GET和HEAD方法)的话,可以使用django.views.decorators.http
模块下面的其他装饰器:
require_GET()
require_POST()
require_safe()
GZip压缩
GZip是目前Internet上非常流行的数据压缩格式,对于纯文本文件来说,GZip压缩效果非常明显,大约可以压缩文件60%至70%。当用户访问网页时,Web服务器使用GZip算法对网页内容进行压缩,然后将压缩后的内容传输到客户端浏览器。由于需要传递的字节数大大减少,所以网页的访问速度也会得到改善。
Django中的GZip视图装饰器位于django.views.decorators.gzip
模块。GZip装饰器还会相应地设置HTTP Vary头信息。
Vary
Vary是一个HTTP响应头部信息,它决定了对于未来的一个请求头,应该用一个缓存的回复(response)还是向源服务器请求一个新的回复。它被服务器用来表明在content negotiationalgorithm(内容协商算法)中选择一个资源代表的时候应该使用哪些头部信息(headers)——来自mozilla.org。
通俗地讲,Vary决定了哪些HTTP Header会被用来检验页面是否被缓存的标准。例如同一个网址分别为桌面浏览器和移动浏览器设置了不同内容,并且在Vary中设置了User-Agent,那么即使用户使用移动浏览器访问过网页并生成了缓存,但是如果此时用户改用桌面浏览器访问网页时,也不会使用移动端的缓存。
Django中关于Vary可用的装饰器包括vary_on_cookie
和vary_on_headers
。
代码示例:
@vary_on_headers('User-Agent', 'Cookie')
def my_view(request):
...
将cookie设置为Vary:
@vary_on_cookie
def my_view(request):
...
@vary_on_headers('Cookie')
def my_view(request):
...
除了直接为视图添加装饰器外,还可以使用patch_vary_headers()
方法设置HttpResponse对象,例如:
# www.coolcou.com
from django.shortcuts import render
from django.utils.cache import patch_vary_headers
def my_view(request):
...
response = render(request, 'template_name', context)
patch_vary_headers(reponse, {'Cookie'})
return response
Caching
Caching装饰器位于django.views.decorators.cache
模块,用于设置服务器端和客户端缓存。
- cache_control(**kwargs)
设置浏览器响应的Cache-Control头,可选参数包括以下几种,如表所示。
代码示例:
from django.views.decorators.cache import cache_control
@cache_control(private=True, max_age=3600)
def Index(request):
blogs = Blog.objects.all()
context = {
"blogs" : blogs
}
rendered = render_to_string("index.html", context)
return HttpResponse(rendered)
- never_cache(view_func)
禁用缓存,使用never_cache装饰器将会为视图方法添加以下cache_control:max(-?)age=0, no-cache, no-store, must-revalidate
。
代码示例:
from django.views.decorators.cache import never_cahce
@never_cahce
def Index(request):
blogs = Blog.objects.all()
context = {
"blogs" : blogs
}
rendered = render_to_string("index.html", context)
return HttpResponse(rendered)
使用浏览器调试工具查看Response Headers,如图所示。
关于更多cache-directive介绍可参阅RFC 2616:https://tools.ietf.org/html/rfc2616#section-14.9
酷客教程相关文章:
评论前必须登录!
注册