8
2012
此处的上游层次可能定义不是太准确,指ISP,代理,或者web浏览器提供的缓存
在此类缓存情况下,django1.3之后通过url和query(查询条件)来使用缓存,这种情况对于安全性有隐患
可能需要使用变量(vary)头部来处理
使用方式如下:
from django.views.decorators.vary import vary_on_headers
@vary_on_headers('User-Agent') #使用user-agent区分不同的cache,也可以使用response['Vary']='user-agent'
def my_view(request):
...
@vary_on_headers('User-Agent', 'Cookie') #此种方式将对user-agent和cookie都基于判断,类似于&
def my_view(request):
由于cookie常用于判断,有修饰器vary_on_cookie,以下2中方式等效
@vary_on_cookie
def my_view(request):
# ...
@vary_on_headers('Cookie')
def my_view(request):
另一种方法是设置response
from django.utils.cache import patch_vary_headers
def my_view(request):
# ...
response = render_to_response('template_name', context)
patch_vary_headers(response, ['Cookie']) #第一参数为response,后面为参数序列
return response
安全性缓存
from django.views.decorators.cache import cache_control
@cache_control(private=True)
def my_view(request):
同一视图,分情况缓存,如共享内容和非共享内容的情况
from django.views.decorators.cache import patch_cache_control
from django.views.decorators.vary import vary_on_cookie
@vary_on_cookie
def list_blog_entries_view(request):
if request.user.is_anonymous():
response = render_only_public_entries()
patch_cache_control(response, public=True)
else:
response = render_private_and_public_entries(request.user)
patch_cache_control(response, private=True)
cache_control处理
from django.views.decorators.cache import cache_control
@cache_control(must_revalidate=True, max_age=3600)
def my_view(request):
# ...
cache-control可设置参数
- public=True
- private=True
- no_cache=True
- no_transform=True
- must_revalidate=True
- proxy_revalidate=True
- max_age=num_seconds
- s_maxage=num_seconds
取消缓存的方法:
from django.views.decorators.cache import never_cache
@never_cache
def myview(request):
# ...
settings.py中Middleware常用设置顺序
SessionMiddleware # Cookie
GZipMiddleware #Accept-Encoding
LocaleMiddleware #Accept-Language
FetchFromCacheMiddleware
本文连接地址: http://www.fresker.com/old2/archives/557 (转载注明出处)
目前暂无评论