Я сталкиваюсь с той же проблемой, и, как Вы, я хотел бы, чтобы простой декоратор перенес 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
, как предложено. Я на самом деле не использовал этого декоратора в рабочем коде, поэтому остерегайтесь возможных ошибок.
Походит на шаблонную возможность страницы.
Вы могли передать LINK_VIA
(или что-то), что Вы обеспечиваете как onClick="return popup(this, 'arg')"
или None
. Каждая ссылка была бы <A HREF="link" {{LINK_VIA}}>some text</a>
.
LINK_VIA
имеет значение. LINK_VIA
не Ни один , Вы могли использовать {% if %}
оператор вокруг Вашего <A HREF=...>
теги. Это кажется многословным.
Вы могли записать свой собственный тег с для {% link_via %}
. Я не достаточно знаком с этим, но можно предоставить ссылку и текст как строки, и тег может генерировать один из двух видов ссылок.
Я согласился бы с , S.Lott
Делает регистрацию шаблона, если пользователь зарегистрирован, просто поместите ссылку, как обычно, в противном случае поместите что-то как
<a href="{{link}}" onclick="return login_popup()">
, где login_popup возвратил бы false, если пользователь говорит отмену.
Это могло быть, вероятно, быть сделанным намного легче в Jinja2 через макросы .
, Если шаблон не знает, какие URL требуют, чтобы пользователь вошел в систему, вероятно, необходимо пересмотреть дизайн.
, Если Вы должны, я предполагаю, что можно сделать то же самое, которое django диспетчер URL делает для обнаружения функции представления.
см.: django.core.urlresolvers
, как только Вы захватили функцию представления, которую можно проверить, украшена ли она @login_required.
Это было бы сделано в пользовательском теге, вероятно.
при использовании Jinja2 Вы не будете нуждаться в теге, просто реализовывать функцию и представлять его Среде, это просто, но необходимо будет сделать немного чтения на API Jinja2)