Django 视图装饰器

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_cookievary_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模块,用于设置服务器端和客户端缓存。

  1. cache_control(**kwargs)
    设置浏览器响应的Cache-Control头,可选参数包括以下几种,如表所示。
    Django 视图装饰器

代码示例:

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)
  1. 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,如图所示。
Django 视图装饰器

关于更多cache-directive介绍可参阅RFC 2616:https://tools.ietf.org/html/rfc2616#section-14.9

酷客教程相关文章:

赞(0)

评论 抢沙发

评论前必须登录!