Django提供了几种装饰器,以支持一些HTTP特性
Allowed HTTP methods
位于django.views.decorators.http模块下的require_http_methods(request_method_list)装饰器,将返回一个 django.http.HttpResponseNotAllowed如果条件没有满足的话。
<pre>
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 只有POST或者GET方式的请求才能够进入函数内
# ...
pass
</pre>
相类似的还有
require_GET()、require_POST()、require_safe()(只接受GET和HEAD请求)
Conditional view processing
位于 django.views.decorators.http模块下的condition(etag_func=None, last_modified_func=None)、
etag(etag_func)、last_modified(last_modified_func)
用于控制特定视图的缓存情况。
<pre>
import datetime
from django.db import models
class Blog(models.Model):
...
class Entry(models.Model):
blog = models.ForeignKey(Blog)
published = models.DateTimeField(default=datetime.datetime.now)
...
def latest_entry(request, blog_id):
return Entry.objects.filter(blog=blog_id).latest("published").published
</br>
from django.views.decorators.http import condition
@condition(last_modified_func=latest_entry)
def front_page(request, blog_id):
...
front_pages视图显示最近上传的博文。只有当有新的博文上传自后front_pages才用的上更新。可以计算最后修改的时间。conditon可以提供一个最早期的检测,如果没有更新可以提供cache中查找。
</pre>
Vary headers
位于 django.views.decorators.vary下的vary_on_cookie(func)和vary_on_headers(*headers)装饰器用于控制特定请求头的缓存情况
<pre>
from django.views.decorators.vary import vary_on_headers
@vary_on_headers('User-Agent')
def my_view(request):
...
这种情况下,缓存机制将会为每一个user-agent建立一个单独的缓存
</pre>