Шаблон django может знать, имеет ли представление, от которого он вызывается, @login_required декоратора?

Если я упросту то, что у вас есть, и уберу вызов mysqli_escape - по сути, это то, что вы оставили:

 Если я упросту то, что у вас есть, и уберу вызов mysqli_escape - по сути, это то, что вы оставили: 

[110]

Теперь вышеприведенное условие всегда должно выполняться (внимательно) и отображать Проверено».

Логика имеет недостатки в приведенном выше коде.

Исправление: вы хотите получить хеш-код ранее сохраненного пароля из базы данных, а затем убедиться в этом (НЕ в хеш-коде пароля, который вы только что отправили / опубликовали).

Выше демонстрация логически ошибочного подхода: https://3v4l.org/C88H2

.POST['password'], password_hash(

Если я упросту то, что у вас есть, и уберу вызов mysqli_escape - по сути, это то, что вы оставили:

[110]

Теперь вышеприведенное условие всегда должно выполняться (внимательно) и отображать Проверено».

Логика имеет недостатки в приведенном выше коде.

Исправление: вы хотите получить хеш-код ранее сохраненного пароля из базы данных, а затем убедиться в этом (НЕ в хеш-коде пароля, который вы только что отправили / опубликовали).

Выше демонстрация логически ошибочного подхода: https://3v4l.org/C88H2

.POST['password'], PASSWORD_BCRYPT) ) ) { echo 'Verified'; } else { echo 'Not verified.'; }

Теперь вышеприведенное условие всегда должно выполняться (внимательно) и отображать Проверено».

Логика имеет недостатки в приведенном выше коде.

Исправление: вы хотите получить хеш-код ранее сохраненного пароля из базы данных, а затем убедиться в этом (НЕ в хеш-коде пароля, который вы только что отправили / опубликовали).

Выше демонстрация логически ошибочного подхода: https://3v4l.org/C88H2

.

5
задан Krystian Cybulski 29 March 2009 в 19:49
поделиться

4 ответа

Да, это возможно, но не ужасно просто. Усложняющий фактор то, что Django login_required декоратор на самом деле проходит через 2 уровня абстракции (одна динамическая функция и еще один декоратор), для окончания в django.contrib.auth.decorators. _ CheckLogin, который является классом с a __call__ метод.

Скажем, у Вас есть non-django, разнообразие сада украшенная функция, которая похожа на это:

def my_decorator(func):
    def inner():
        return func()
    return inner

@my_decorator
def foo():
    print foo.func_name

# results in: inner

Проверка, чтобы видеть, если функция foo был перенесен может быть столь же простым как проверка имени функционального объекта. Можно сделать эту внутреннюю часть функция. Имя на самом деле будет названием последней функции обертки. Для более сложных случаев можно использовать inspect модуль для хождения по внешним кадрам от текущего кадра, если Вы ищете что-то в частности.

В случае Django, однако, то, что декоратор является на самом деле экземпляром _CheckLogin класс означает, что функция не является действительно функцией и поэтому имеет нет func_name свойство: попытка вышеупомянутый код повысит Исключение.

Рассмотрение исходного кода для django.contrib.auth.decorators._CheckLogin, однако, шоу, что _CheckLogin экземпляр будет иметь a login_url свойство. Это - довольно простая вещь протестировать на:

@login_required
def my_view(request):
    is_private = hasattr(my_view, 'login_url')

Поскольку _CheckLogin также используется для реализации других подлинных декораторов, этот подход будет также работать на permission_required, и т.д. У меня на самом деле никогда не было потребности использовать это, однако, таким образом, я действительно не могу прокомментировать то, что необходимо искать, если у Вас есть несколько декораторов вокруг единственного представления... осуществление, оставленное читателю, я предполагаю (осмотрите стопку кадра?).

Как нетребуемый редакционный совет, однако, я сказал бы, что проверка самой функции, чтобы видеть, было ли это перенесено как это, кажется мне немного трудный. Можно, вероятно, вообразить все виды непредсказуемого поведения неизбежными, когда новый разработчик присоединяется к проекту как удары на некотором другом декораторе. На самом деле Вы также подвергнуты изменениям в самой django платформе... неизбежная угроза безопасности.

Я рекомендовал бы подход Van Gale по этой причине как что-то, что явно, и поэтому намного больше устойчивой реализации.

5
ответ дан 14 December 2019 в 01:17
поделиться

Я передал бы дополнительную переменную контекста в шаблон.

Так, представление, которое имеет @login_required, передало бы переменную как private: True и другие представления передали бы private: False

3
ответ дан 14 December 2019 в 01:17
поделиться

Почему Ваш шаблон должен знать это? Если @login_required декоратор используется, само представление предотвращает людей, которые не зарегистрированы от когда-либо достижения страницы и поэтому никогда наблюдения шаблона для начала.

1
ответ дан 14 December 2019 в 01:17
поделиться

Шаблоны являются иерархическими итак, почему бы не a @login_required версия и "нет @login_required"версия, оба из которых наследовались тому же родителю?

Это сохранило бы шаблоны намного более чистыми и легче поддержать.

0
ответ дан 14 December 2019 в 01:17
поделиться
Другие вопросы по тегам:

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