I我面臨着同樣的問題,並且像你一樣,我想要一個簡單的裝飾器來包裝Django ajax視圖,以便像處理其他視圖一樣處理身份驗證。對我來說,看起來很有前途的一種方法是將這樣的裝飾器與JavaScript結合使用,在響應中尋找特定的值。
這裏是第一修訂裝飾的草案:
from functools import wraps
def ajax_login_required(view_func):
@wraps(view_func)
def wrapper(request, *args, **kwargs):
if request.user.is_authenticated():
return view_func(request, *args, **kwargs)
json = simplejson.dumps({ 'not_authenticated': True })
return HttpResponse(json, mimetype='application/json')
return wrapper
這裏是視圖:
@ajax_login_required
def ajax_update_module(request, module_slug, action):
# Etc ...
return HttpResponse(json, mimetype='application/json')
這裏是JavaScript(jQuery的):
$.post('/restricted-url/', data, function(json) {
if (json.not_authenticated) {
alert('Not authorized.'); // Or something in a message DIV
return;
}
// Etc ...
});
編輯:我試圖按照建議使用functools.wraps
。我實際上並沒有在工作代碼中使用這個裝飾器,所以要小心可能的錯誤。
什麼我不知道是怎麼從模板的角度確定鏈接導致的視圖是否用@login_required裝飾或不... – kender 2008-11-23 22:07:05
該模板沒有隨機鏈接。它具有您在模板中專門設計和編碼的特定鏈接。我建議你改變你在模板中專門放置的每個鏈接。 – 2008-11-23 22:27:21