2011-06-14 14 views
7

Estoy usando el sistema de gestión de usuarios django.contrib.auth.¿Por qué no puedo cerrar sesión en django user auth?

Y compré el registro/insertar en la tabla de usuario/modelo y el inicio de sesión de django.contrib.auth.views.login para que yo pueda conectarse.

Sin embargo, no puedo usar Django .contrib.auth.views.logout cerrar la sesión

que tengo en mi plantilla

<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> 

Sin embargo siempre me dan el nombre y el enlace de desconexión porque en realidad nunca cierre de sesión al hacer clic en el botón de cierre de sesión

Aquí es mi sección urls.py para esto:

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'), 
) 

¿Qué estoy haciendo mal? Nota: También estoy ejecutando django a través de apache2 con mod_wsgi

¡Gracias!

Agregado Info:

No estoy seguro si esto ayuda pero request.session.items impreso en el html y se

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

cuando estaba inscrito y también después de que hace clic en el botón de cierre de sesión (django.contrib.auth.views.logout)

Además, he creado:

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

Y vinculado que a un botón de enlace segunda cierre de sesión/y no cerrar la sesión y los request.session.items se mantuvo igual que el anterior después de hacer clic en el enlace

Creo que estoy cerrando en:

En una de mis funciones de vista que lo hice:

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

y luego imprimir en html {{}} request.session.items que me dio

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

y sin ('fav_color', 'azul') tupla ¿He hecho algo mal otra vez, o es una prueba de que mi lista request.session no está siendo modificada?

K lo descubrió:

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

debería ser

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

Esto me parece correcto. Es posible que desee instalar la barra de herramientas de depuración de django y ver qué dice el objeto de usuario. Esto podría ayudarlo a determinar si la variable de usuario es correcta, etc. – Hutch

+0

agregó algo de información adicional, ¿tal vez esto podría ayudar a determinar cuál es el problema? – Derek

Respuesta

2

creo que urls.py podría ser como este (login and logout views do not accept SSL parameter):

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'), 
) 

Y en la plantilla :

<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> 
2

Debe tener una vista de cierre de sesión con la url apuntando a esa vista.No tiene que haber nada en la plantilla, solo tiene django.contrib.auth.logout() en esa vista de cierre de sesión. En los nuevos servidores django puede cerrar la sesión, pero debe hacer esto dentro de una vista, no de una plantilla. He aquí un extracto del libro de Django:

Este ejemplo muestra cómo se puede utilizar tanto la autenticación() y login() dentro de una función de vista:

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/") 

Para finalizar la sesión de un usuario, utilice django.contrib .auth.logout() dentro de su vista. Se necesita un objeto HttpRequest y no tiene ningún valor de retorno:

from django.contrib import auth 

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

consulte el libro de Django en cuanto a todo lo http://www.djangobook.com/en/2.0/chapter14/, he aprendido todo de este libro.

1

He encontrado este problema y es un estúpido dolor de cabeza. Así es como obligo a cerrar la sesión. Conservo a logout(request) (con suerte) desencadenar el usuario registra señales .:

def logout_view(request): 

    logout(request) 
    request.session.flush() 
    request.user = AnonymousUser 

    return HttpResponseRedirect('accounts/loggedout/') 
Cuestiones relacionadas