Conditional View Processing
def latest_entry(request, blog_id):
return Entry.objects.filter(blog=blog_id).latest("published").published
@condition(last_modified_func=latest_entry)
def front_page(request, blog_id):
...
ref:
https://docs.djangoproject.com/en/dev/topics/conditional-view-processing/
Cache Middlewares
如果有啟用 Django 的 cache middleware(就是 UpdateCacheMiddleware
和 FetchFromCacheMiddleware
)
每一個 request 都會被標上 Cache-Control: max-age=600
那個 600 是根據 CACHE_MIDDLEWARE_SECONDS
設定的值
只要設置了 max-age > 0
response header 中就會被自動加入 Cache-Control
、Expires
和 Last-Modified
兩個欄位
ref:
https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-CACHE_MIDDLEWARE_SECONDS
Never Cache Decorator
from django.views.decorators.cache import never_cache
@never_cache
def myview(request):
pass
如果你單純的就是不希望被 cache
就使用這種方式
@never_cache
只會設置 Cache-Control: max-age=0
(max-age=0
是馬上過期)
Cache Control Decorator
from django.views.decorators.cache import cache_control
class SongDetail(SVAPIDetailView):
serializer_class = api_serializers.SongDetailSerializer
@cache_control(no_store=True, no_cache=True, max_age=0)
def get(self, request, song_id):
do_something()
return Response(data)
不知道為什麼,只設置 no-store 和 no-cache 的話
iOS 的 AFNetworking 還是會 cache
照道理說 no-store 的優先權應該是最高的
目前的解法是使用 Cache-Control: max-age=0
ref:
https://docs.djangoproject.com/en/dev/topics/cache/#controlling-cache-using-other-headers