¿Por qué no puedo cerrar sesión en django user auth?

Estoy utilizando el sistema de gestión de usuarios django.contrib.auth.

Así que obtuve el registro / inserción en la tabla de usuario / modelo y el inicio de sesión de django.contrib.auth.views.login para poder iniciar sesión.

Sin embargo, no puedo usar django.contrib.auth.views.logout para cerrar sesión

Tengo en mi plantilla

My Account

Welcome, {{ name|capfirst }}!

Sin embargo, siempre obtengo el nombre y el enlace de cierre de sesión porque nunca cierro la sesión cuando hago clic en el botón de cierre de sesión

Aquí está 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!

Información añadida:

No estoy seguro de si esto ayuda, pero imprimí request.session.items en el html y obtuve

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

cuando inicié sesión y también después de hacer 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 lo vinculé a un segundo enlace / botón de cierre de sesión y no cerré mi sesión y request.session.items se mantuvo igual que arriba después de hacer clic en el enlace

Creo que me estoy acercando

En una de mis funciones de vista hice:

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

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

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

y ninguna tupla (‘fav_color’, ‘azul’). ¿He vuelto a hacer algo incorrecto o esto prueba que mi lista de sesiones de solicitud no se está modificando?

K lo descubrió:

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

debiera ser

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

Debe tener una vista de cierre de sesión con la URL que apunta a esa vista. Nada tiene que estar en la plantilla, solo django.contrib.auth.logout () en esa vista de cierre de sesión. En los nuevos servidores django puede cerrar sesión de manera rápida, pero debe hacer esto dentro de una vista, no una plantilla. Aquí hay un extracto del libro de django:

Este ejemplo muestra cómo puede usar autenticar () e iniciar sesión () dentro de una función de visualización:

 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 cerrar la sesión de un usuario, use django.contrib.auth.logout () dentro de su vista. Toma un objeto HttpRequest y no tiene 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 términos de todo http://www.djangobook.com/en/2.0/chapter14/ , aprendí todo de este libro.

Me he encontrado con este problema, y ​​es un dolor de cabeza estúpido. Así es como fuerzo a cerrar la sesión. logout(request) para (con suerte) activar las señales de logout(request) del usuario .:

 def logout_view(request): logout(request) request.session.flush() request.user = AnonymousUser return HttpResponseRedirect('accounts/loggedout/') 

No tienes que escribir una vista para eso, solo puedes hacer:

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

Más información: https://docs.djangoproject.com/en/dev/topics/auth/default/#django.contrib.auth.views.logout

Creo que urls.py podría ser así (las vistas de inicio y cierre de sesión no aceptan el parámetro 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' ), ) 

Y en la plantilla:

 

My Account

Welcome, {{ name|capfirst }}!