2011-04-03 70 views
0

我使用允許用戶瀏覽其網站內容的其他人的API來構建應用程序。用戶可以使用其他站點的憑證登錄我的項目,以便從他們的站點「收藏」內容。在Django中使用緩存頁面的會話變量

當他們登錄時,我得到了一個user_token。爲了避免爲他們創造一個用戶文件,我只是此令牌保存爲一個會話變量:

# Set session 
request.session.set_expiry(60 * 60) 
# Save token in session 
request.session['user_token'] = unicode(auth.Message) 

我還使用文件緩存從網站內容:

CACHE_BACKEND =「文件:///..../cache/」

而且使用某些意見前@cache_page命令來緩存數據:

@cache_page(CACHE_TIME) 
def listings_by_cat_page(request, category_id): 
    # view stuff here 

當我遇到的問題是當用戶的意見Ť他主屏幕(它被緩存),點擊登錄,登錄,然後返回到主屏幕,登錄/註銷按鈕不知道切換。我假設這是因爲它是一個緩存頁面,它看不到user_token會話變量。

{% if not request.session.user_token %} 
    <a href="/login{% comment %}?next={{ request.path }}{% endcomment %}" class="login">Login</a> 
{% else %} 
    <a href="/logout/" class="login">Logout</a> 
{% endif %} 

理想情況下,我想緩存內容,但讓頁面識別request.session變量中的更改。

任何想法?

回答

0

修改Vary標題,django將生成一個新的緩存鍵。

更新:我認爲你應該去cookie方法,因爲SessionMiddleware已經設置了適當的Vary頭,這就是爲什麼使用Auth,緩存工作正常。

既然你只想設置一次,cookie方法是我想的方式。

無論哪個視圖處理API方法的登錄,都應該設置一個cookie,它是用戶令牌的安全哈希,其餘的應該可以工作,如果我的想法是正確的話。

0

使用{% cache %}標記來僅緩存與用戶無關的部分頁面。