Аутентификация Django и Ajax - URL, которые требуют входа в систему

49
задан Peter Mortensen 11 December 2009 в 04:55
поделиться

3 ответа

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

56
ответ дан Eric Walker 7 November 2019 в 11:50
поделиться

Походит на шаблонную возможность страницы.

  1. Вы могли передать LINK_VIA (или что-то), что Вы обеспечиваете как onClick="return popup(this, 'arg')" или None. Каждая ссылка была бы <A HREF="link" {{LINK_VIA}}>some text</a>.

    • Для анонимных сессий, LINK_VIA имеет значение.
    • Для зарегистрированных сессий, LINK_VIA не Ни один
  2. , Вы могли использовать {% if %} оператор вокруг Вашего <A HREF=...> теги. Это кажется многословным.

  3. Вы могли записать свой собственный тег с для {% link_via %}. Я не достаточно знаком с этим, но можно предоставить ссылку и текст как строки, и тег может генерировать один из двух видов ссылок.

5
ответ дан S.Lott 7 November 2019 в 11:50
поделиться

Я согласился бы с , S.Lott

Делает регистрацию шаблона, если пользователь зарегистрирован, просто поместите ссылку, как обычно, в противном случае поместите что-то как

<a href="{{link}}" onclick="return login_popup()"> 

, где login_popup возвратил бы false, если пользователь говорит отмену.

Это могло быть, вероятно, быть сделанным намного легче в Jinja2 через макросы .

, Если шаблон не знает, какие URL требуют, чтобы пользователь вошел в систему, вероятно, необходимо пересмотреть дизайн.

, Если Вы должны, я предполагаю, что можно сделать то же самое, которое django диспетчер URL делает для обнаружения функции представления.
см.: django.core.urlresolvers

, как только Вы захватили функцию представления, которую можно проверить, украшена ли она @login_required.

Это было бы сделано в пользовательском теге, вероятно.
при использовании Jinja2 Вы не будете нуждаться в теге, просто реализовывать функцию и представлять его Среде, это просто, но необходимо будет сделать немного чтения на API Jinja2)

5
ответ дан Community 7 November 2019 в 11:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: