2011-04-25 9 views
5

He hecho una pregunta similar anteriormente, pero he hecho más investigación y esta iteración debería ser un poco diferente. Parece que varios usuarios de SO han tenido un problema con el registro e inicio de sesión de los usuarios en una sola vista y realmente no se ha respondido.Pérdida de sesión de Django 1.2

El problema es que me registro, autentico e inicio de sesión de un usuario en una sola vista de Django. Para la mayoría de los usuarios está bien, pero para otros usuarios, su solicitud posterior (hacen clic en un enlace en mi sitio) devuelve un usuario anónimo. De alguna manera, el usuario conectado pierde su sesión y es redirigido a una página en mi sitio que no requiere autenticación.

Cuando inician sesión a través de una vista de inicio de sesión pura (a diferencia de la vista de registro + inicio de sesión), los datos de la sesión permanecen intactos. El problema parece ser el registro y el inicio de sesión en una sola vista.

Ver esta publicación para el mismo tema: https://stackoverflow.com/questions/1693726/problem-with-combined-authentication-login-view.

Se ha sugerido que esto es potencialmente un problema de enhebrado. También lo he visto sugiriendo que se relaciona con el back-end de los datos de la sesión de caché.

¿Alguna idea de lo que realmente se relaciona? No puedo reproducir el error, lo que realmente me detiene.

EDITAR - Debo señalar que estoy usando las sesiones respaldadas por la base de datos predeterminadas.

Aquí está mi punto de vista registro/login

def splash_register(request): 
    if request.session.get('beta'): 

    if request.method=='POST': 
     userform=MyUserCreationForm(request.POST) 
     if userform.is_valid(): 
      #username of <30 char is required by Django User model. I'm storing username as a hash of user email 

      user=userform.save(commit=False) 
      user.username=hash(user.email) 
      user.save() 



      username=user.username 
      password=str(userform.cleaned_data['password']) 
      user=auth.authenticate(username=username, password=password) 
      if user is not None: 
       auth.login(request,user) 
       request.session['first_visit']=True 
       return HttpResponseRedirect("/") 
      else: 
       return HttpResponseRedirect('/splash/register/') 
     else: 
      userform=MyUserCreationForm(request.POST) 
      return render_to_response("website/splash_register.html", {'userform':userform}, context_instance=RequestContext(request)) 
    return render_to_response("website/splash_register.html", context_instance=RequestContext(request))  
else: 
    return HttpResponseRedirect('/splash/')   
+0

¿Está utilizando mod python como la publicación relacionada? Cuando comencé a aprender Python fui fuertemente dirigido en mod_wsgi.No puedo decir que esto solucionará ningún problema. –

+0

Hola James, estoy usando mod_wsgi. – Ben

+0

Le ruego a alguien que me ayude aquí ... – Ben

Respuesta

18

Usted no tiene que utilizar autenticar y, en este escenario, no es realmente necesario. Todo lo que necesita hacer es establecer el backend del registro del usuario.

así que algo como esto funcionaría:

def splash_register(request): 
    if request.session.get('beta'): 

    if request.method=='POST': 
     userform=MyUserCreationForm(request.POST) 
     if userform.is_valid(): 
      #username of <30 char is required by Django User model. I'm storing username as a hash of user email 

      user=userform.save(commit=False) 
      user.username=hash(user.email) 
      user.backend='django.contrib.auth.backends.ModelBackend' 
      user.save() 


      username=user.username 
      password=str(userform.cleaned_data['password']) 
      auth.login(request, user) 
      request.session['first_visit']=True 
      return HttpResponseRedirect("/") 
     else: 
      userform=MyUserCreationForm(request.POST) 
      return render_to_response("website/splash_register.html", {'userform':userform}, context_instance=RequestContext(request)) 
    return render_to_response("website/splash_register.html", context_instance=RequestContext(request))  
else: 
    return HttpResponseRedirect('/splash/') 

actualización

he mencionado esto en un comentario, pero en términos de una "respuesta" la solución es añadir esto a su archivo de configuración:

SESSION_COOKIE_DOMAIN = 'yourdomain.com' 

Esto permitirá a los usuarios que vienen de www.yourdomain.com o yourdomain.com para iniciar sesión en el sitio web.

+0

Hola Jordan, esa fue una información útil sobre cómo configurar el back-end. Soy consciente de que. No estoy seguro de si solucionará el error. ¿Generaría un hilo menos o algún otro impacto significativo? – Ben

+0

Aquí hay algo más de información. Estoy ejecutando mod_wsgi con apache2. La configuración de Mod_wsgi es la siguiente: SERVER MPM: Preforma, enhebrado: no, bifurcado, sí (conteo variable del proceso). En mis archivos de registro, sigo planteando un KeyError en el módulo de subprocesamiento, que se ignora. He buscado en línea y parece que esto es probablemente algo inocuo y no causa el problema más grande, pero quería ponerlo allí. – Ben

+0

gracias por señalar las configuraciones de SESSION_COOKIE_DOMAIN, ¡eso resolvió mi problema! – joshcartme

3

Oh, hombre, estoy increíblemente aliviado y también lleno de auto-odio. No tenía idea de que las cookies no eran transferibles entre los nombres de dominio www y no www.

Un conjunto de mis usuarios venían a www y luego eran redirigidos a no-www, lo que acababa con su sesión. Estoy configurando mod_rewrite ahora para resolver la situación.

+1

Si esa fue la causa de su problema, desea establecer SESSION_COOKIE_DOMAIN en '.sudominio.com'. Consulte http://docs.djangoproject.com/en/dev/ref/settings/?from=olddocs#session-cookie-domain –

+0

Gracias Jordan por esto y por el resto de su ayuda. ¿Cuál es la etiqueta para asignar una recompensa en este caso? Realmente respondí mi propia pregunta después de días de confusión. ¿Cualquier pista? – Ben

+0

Técnicamente su respuesta no es del todo correcta, ya que las cookies * son * transferibles entre dominios www y no www. Y soy parcial, por supuesto, pero considerando que la causa principal fue una pérdida de datos de la sesión porque la cookie no estaba vinculada al dominio, y que mi respuesta actualizada (y comentario) resuelve este problema específico, te diría Puede asignarlo si siente que seguir este camino es la mejor solución para su problema (¡Ciertamente creo que lo es!) –

1

Solo en caso de que esto ayude a alguien más, tuve este problema donde en la vista actual, request.user.is_authenticated() es True, pero después de HttpResponseRedirect a otra página, el mismo host, request.user se convirtió en anónimo. Estoy usando sesiones, pero resulta que no fue la sesión. Hice mi propio backend de autenticación personalizado, y los 1.2 documentos dicen que debe implementar get_user (self, user_id) pero no creo que user_id (clave principal) sea algo especial, así que lo implementé como get_user (self, username) .. pero aparentemente esa fue la fuente del problema!

Cuestiones relacionadas