Django: is_authenticated и is_anonymous возвращают true после выхода из системы - PullRequest
5 голосов
/ 28 ноября 2010

Я использую django-регистрацию и просто настроил ее.

{{user.is_authenticated }}

- правда, хотя я уже зашел в / account / logout / и вышел из системы.

{{user.is_anonymous }} 

также возвращает true. Согласно Django Docs, эти два должны быть разными:

is_anonymous: всегда возвращает False. Это способ различения объектов User и AnonymousUser. Как правило, вы должны предпочесть использование is_authenticated () этому методу.

и

is_authenticated: всегда возвращает True. Это способ определить, был ли пользователь аутентифицирован. Это не подразумевает каких-либо разрешений и не проверяет, активен ли пользователь - это только означает, что пользователь предоставил действительное имя пользователя и пароль.

Я использую стандартные представления, которые идут с django-регистрацией, и еще не коснулся их. В шаблоне у меня есть следующий код:

{% if user.is_authenticated %}
{% user }}
{% if user.is_anonymous %}
    is anonymous
{% endif $}
{% else %}
    gotta login
{% endif %}

Где будет проблема? Я буду очень благодарен!

UPDATE: я заметил, что на домашней странице is_authenticated и id_anonymous возвращают значение True, в то время как если я захожу в / account / login перед входом в систему, только is_anonymous возвращает значение true, как и должно быть. А также, на главной странице, у меня есть следующий вид, если это помогает:

def home(request):
    return render_jinja(request, 'index.html', blah = 'ga')

ОБНОВЛЕНИЕ 2: print (request.user.is_authenticated ()) выдает False. Тогда у меня есть:

return render_jinja(request, 'index.html', blah = 'ga')

и в шаблоне user.is_authenticated возвращает FALSE.

ОБНОВЛЕНИЕ 3: Если я использую render_to_response, вместо render_jinja, все хорошо. все еще не знаю, как это исправить: (

Ответы [ 2 ]

11 голосов
/ 29 ноября 2010

Кажется, вы пытаетесь понять две вещи одновременно; как правильно использовать шаблоны jinja и как обстоят дела с User / AnonymousUser. Может быть, попытаться выяснить эти проблемы по одному.

У меня нет опыта работы с jinja, но вы можете проверить и убедиться, что вы принимаете во внимание различия между синтаксисом шаблонов jinja и django . Самое большое различие, о котором я знаю, состоит в том, что вызов метода требует явных скобок. Поэтому вызовы is_authenticated и is_anonymous в вашем примере требуют скобок.

Jinja style {{ user.is_authenticated() }}
Django style {{ user.is_authenticated }} 

Если это не решит проблему, попробуйте установить django-debug-toolbar и взгляните на контекст вашего шаблона. Проверьте и посмотрите, является ли user None или объектом (User или AnonymousUser).

Вы также можете прочитать AnonymousUser и посмотреть пример проверки для аутентифицированного пользователя в документации. В двух словах, для объекта AnonymousUser is_anonymous () всегда возвращает True вместо False, а is_authenticated () всегда возвращает False вместо True.

4 голосов
/ 29 ноября 2010

чмок по голове.Я где-то читал:

, если user.is_authenticated: .... # Всегда верно, поскольку это метод!

И так, вместо {{user.is_authenticated}} в шаблоне, он должен быть {{user.is_authenticated ()}}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...