2016-11-02 61 views
0

我使用redis在django應用中進行緩存。我也使用Django Rest Framework,這是我的問題。如果內容在緩存TTL過期之前發生更改,則更新緩存

我使用的緩存系統是這樣的:

from django.views.decorators.cache import cache_page 

urlpatterns = [ 
... 
    url(r'^some_url/$', cache_page(CACHE_TTL)(SomeView.as_view()) 
... 
] 

這裏,SomeView是從APIView繼承的類。

現在想象一下,我們向這個url發出一個請求,並且我們收到一個包含這個url返回的一個實例的json對象。

然後我們繼續刪除(使用django的管理界面)該對象,並再次發出請求。預期的結果是一個空的json對象,但是我收到的是同一個對象不變,同樣的情況發生在添加一個新對象時,響應仍然只有一個對象。

經過一段時間(緩存中的請求的TTL),結果是正確的。

那麼,我該如何告訴django緩存條目無效呢?

+0

可能重複[在Django中過期視圖緩存?](http://stackoverflow.com/questions/2268417/expire-a-view-cache-in-django) – alazaro

+1

@alzaro,它是不一樣的問題是真的,你所引用的問題的答案解決了我的問題,但最初的問題是不一樣的。我不想讓**過期緩存**,我希望**緩存得到更新**。 –

回答

0

Django’s cache framework

還有一些其他的方法來控制緩存參數。例如,HTTP允許應用程序執行以下操作:

  • 定義頁面應該被緩存的最長時間。

  • 指定緩存是否應該始終檢查較新的版本,只在沒有更改時傳遞緩存的內容。一些緩存可遞送即使服務器頁面更改緩存的內容,只因爲緩存拷貝沒有過期。

在Django中,可使用cache_control視圖修飾器指定這些緩存參數。 在這個例子中,cache_control告訴緩存重新驗證在每次訪問緩存和存儲緩存版本,最多3600秒時:

from django.views.decorators.cache import cache_control 

@cache_control(must_revalidate=True, max_age=3600) 
def my_view(request): 
    # ... 

如果你緩存頁面頻繁變化,你想要立即顯示這些更改(並且緩存不會自動檢測或檢查更改)而不等待緩存TTL,請使用cache_control