codecamp

Django4.0 处理HTTP请求-视图装饰器

Django 提供很多装饰器,它们可以为视图支持多种 HTTP 特性。

允许的HTTP方法

在 ​django.views.decorators.http​ 中的装饰器可以用来根据请求方法来限制对视图的访问。如果条件不满足,这些装饰器将返回 ​django.http.HttpResponseNotAllowed​ 。

require_http_methods(request_method_list)

装饰器可以要求视图只接受特定的请求方法。用法如下:

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()

装饰器可以要求视图只接受 GET 方法。

require_POST()

装饰器可以要求视图只接受 POST 方法。

require_safe()

装饰器可以要求视图只接收 GET 和 HEAD 方法。这些方法通常被认为是安全的,因为它们除了检索请求的资源外,没有特别的操作。

注解:Web 服务器自动删除对 ​HEAD ​请求的相应内容,并保持头部不变,所以你可以像处理视图里的 ​GET ​请求一样处理 ​HEAD ​请求。因为一些软件依赖 ​HEAD ​请求(比如链接检测器),因此你需要使用 ​require_safe ​而不是 ​require_GET ​。

条件视图处理

下面 ​django.views.decorators.http​ 的装饰器被用来控制特殊视图中的缓存行为。

  • condition(etag_func=None, last_modified_func=None)
  • etag(etag_func)
  • last_modified(last_modified_func)

这些装饰器被用来生成 ​ETag ​和 ​Last-Modified​ 头部

GZip压缩

django.views.decorators.gzip​ 里的装饰器控制基于每个视图的内容压缩。

gzip_page()

如果浏览器允许 ​gzip ​压缩,这个装饰器会压缩内容。 它相应地设置 ​Vary ​表头,以便缓存将其存储基于 ​Accept-Encoding​ 表头。

Vary表头

django.views.decorators.vary​ 中的装饰器可用于控制基于特定请求标头的缓存。

  • vary_on_cookie(func)
  • vary_on_headers(*headers)

Vary ​表头定义了缓存机制在构建其缓存键时应考虑哪些请求表头。

缓存

django.views.decorators.cache​ 中的装饰器控制服务器及客户端的缓存。

cache_control(**kwargs)

这个装饰器通过添加所有关键字参数来修补响应的 ​Cache-Control​ 头。

never_cache(view_func)

此装饰器将 ​Expires ​表头添加到当前日期/时间。

这个装饰器在响应中添加一个 ​Cache-Control: max-age=0, no-cache, no-store, must-revalidate, private​ 表头,以指示永远不应该缓存页面。

每个表头仅在尚未设置时才添加。


Django4.0 编写视图-异步视图
Django4.0 文件上传-简单文件上传
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Django4.0 模型和数据库

Django4.0 处理HTTP请求

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }