Почему я не могу выйти из аутентификации пользователя django? - PullRequest
7 голосов
/ 14 июня 2011

Я использую систему управления пользователями django.contrib.auth.

Итак, я получил регистрацию / вставку в таблицу / модель пользователя и логин от django.contrib.auth.views.login upпоэтому я могу войти в систему.

Однако я не могу использовать django.contrib.auth.views.logout для выхода из системы

У меня есть в моем шаблоне

<h1>My Account</h1>
<strong> Welcome, {{ name|capfirst }}!</strong>
<br /><br />
<ul>
    <li>
        {% if user.is_authenticated %}
            <a href="{% url django.contrib.auth.views.logout %}">Logout</a>
        {% else %}
            <a href="{% url register %}">Sign Up</a>
    </li>
    <li>
            <a href="{% url django.contrib.auth.views.login %}">Login</a>
        {% endif %}
    </li>
</ul>

Однако я всегда получаю имя и ссылку выхода из системы, потому что я никогда не выхожу из системы, когда нажимаю кнопку выхода из системы

Вот мой раздел urls.py для этого:

urlpatterns += patterns('django.contrib.auth.views',
    url(r'^login/$', 'login', { 'template_name': 'registration/login.html', 'SSL': settings.ENABLE_SSL }, 'login' ),
    url(r'^my_account/$', 'logout', { 'template_name': 'registration/my_account.html', 'SSL': settings.ENABLE_SSL }, 'logout' ),
)

Что яделать неправильно?Примечание: я также запускаю django через apache2 с mod_wsgi

Спасибо!

Добавлена ​​информация:

Не уверен, поможет ли это, но я напечатал request.session.items в htmlи получил

[('_auth_user_backend', 'django.contrib.auth.backends.ModelBackend'), ('_auth_user_id', 9L)] 

, когда я вошел в систему, а также после того, как я нажал кнопку выхода из системы (django.contrib.auth.views.logout)

Кроме того, я создал:

from django.contrib.auth import logout
def logout_view(request):
    request.session.items = []
    request.session.modified = True
    logout(request)

И связал это со второй ссылкой / кнопкой выхода из системы, и я не вышел из системы, а request.session.items остался прежним после нажатия на ссылку

Я думаю, что закрываюсь в:

В одной из моих функций просмотра я сделал:

request.session["fav_color"] = "blue"
request.session.modified = True

, а затем напечатал в html {{request.session.items}}, который дал мне

    [('_auth_user_backend', 'django.contrib.auth.backends.ModelBackend'), ('_auth_user_id', 9L)] 

и нет ('fav_color', 'blue') кортеж.Я снова что-то сделал не так или это доказательство того, что мой список request.session не изменяется?

K понял:

url(r'^my_account/$', 'logout', { 'template_name': 'registration/my_account.html', 'SSL': settings.ENABLE_SSL }, 'logout' ),

должно быть

url(r'^logout/$', 'logout', { 'template_name': 'registration/my_account.html', 'SSL': settings.ENABLE_SSL }, 'logout' ),

Ответы [ 4 ]

2 голосов
/ 19 февраля 2014

Вам не нужно писать представление для этого, вы можете просто сделать:

(r'^accounts/logout/$', 'django.contrib.auth.views.logout',{'next_page': '/accounts/login'})

Подробнее: https://docs.djangoproject.com/en/dev/topics/auth/default/#django.contrib.auth.views.logout

2 голосов
/ 12 июля 2011

Вы должны иметь вид выхода из системы с URL-адресом, указывающим на это представление.Ничего не должно быть в шаблоне, просто используйте django.contrib.auth.logout () в этом виде выхода из системы.На новых серверах django вы можете легко выйти из системы, но вы должны делать это в представлении, а не в шаблоне.Вот отрывок из книги django:

Этот пример показывает, как вы можете использовать и authenticate (), и login () в функции просмотра:

from django.contrib import auth

def login_view(request):
  username = request.POST.get('username', '')
  password = request.POST.get('password', '')
  user = auth.authenticate(username=username, password=password)
  if user is not None and user.is_active:
      # Correct password, and the user is marked "active"
      auth.login(request, user)
      # Redirect to a success page.
      return HttpResponseRedirect("/account/loggedin/")
  else:
      # Show an error page
      return HttpResponseRedirect("/account/invalid/")

Чтобы выйти из системыиспользуйте django.contrib.auth.logout () в вашем представлении.Он принимает объект HttpRequest и не имеет возвращаемого значения:

from django.contrib import auth

def logout_view(request):
  auth.logout(request)
  # Redirect to a success page.
  return HttpResponseRedirect("/account/loggedout/")

Обращайтесь к книге Джанго с точки зрения всего http://www.djangobook.com/en/2.0/chapter14/, Я узнал все из этой книги.

2 голосов
/ 27 июля 2011

Я столкнулся с этой проблемой, и это глупая головная боль.Вот как я вынужден выйти из системы.Я сохраняю logout(request), чтобы (надеюсь) инициировать сигналы пользователя, вышедшего из системы.

2 голосов
/ 15 июня 2011

Я думаю, что urls.py может выглядеть следующим образом ( представления входа и выхода не принимают параметр SSL ):

from django.core.urlresolvers import reverse
urlpatterns += patterns('django.contrib.auth.views',
        url(r'^login/$', 'login', { 'template_name': 'registration/login.html'}, name='login' ),
        url(r'^logout/$', 'logout', { 'template_name': 'registration/my_account.html', 'next_page':reverse('index') }, name='logout' ),
)

А в шаблоне:

<h1>My Account</h1>
<strong> Welcome, {{ name|capfirst }}!</strong>
<br /><br />
<ul>
    <li>
        {% if user.is_authenticated %}
            <a href="{% url logout %}">Logout</a>
        {% else %}
            <a href="{% url register %}">Sign Up</a>
    </li>
    <li>
            <a href="{% url login %}">Login</a>
        {% endif %}
    </li>
</ul>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...