Я сталкиваюсь с той же проблемой, и, как и вы, я бы хотел, чтобы простой декоратор обернул представление Ajax Django, чтобы обрабатывать аутентификацию так же, как и другие представления. Один из подходов, который мне кажется многообещающим, заключается в использовании такого декоратора в сочетании с 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
, как было предложено. На самом деле я не использовал этот декоратор в рабочем коде, поэтому остерегайтесь возможных ошибок.