Django 1.2会话丢失

问题描述:

我已经问过类似的问题,但我已经做了一些更多的研究,并且这个迭代应该有点不同。似乎好几个SO用户在单一视图中注册和登录用户时遇到了问题,但并未真正得到答案。Django 1.2会话丢失

问题是我在单个Django视图中注册,验证和登录用户。对于大多数用户来说没问题,但对于其他用户,他们的后续请求(他们点击我网站上的链接)会返回匿名用户。不知何故,登录的用户会失去他们的会话,并被重定向到我坐下的一个页面,并且不需要认证。

当他们然后通过纯登录视图(而不是注册+登录视图)登录时,会话数据保持完整。这个问题似乎是注册并登录到一个视图。

看到这个职位相同的问题:https://*.com/questions/1693726/problem-with-combined-authentication-login-view

有人提出这可能是一个线程问题。我也看到它建议它与用于缓存会话数据的后端相关。

关于它与真正相关的想法?我无法重现错误,这真的让我失望。

编辑 - 我应该注意到我正在使用默认的数据库支持的会话。

这里是我的注册/登录查看

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

你是否像使用相关文章一样使用mod python?当我开始学习python时,我深深地被引导到了mod_wsgi。我不能说这会解决任何问题。 – 2011-04-27 05:31:41

+0

嗨,詹姆斯,我正在使用mod_wsgi。 – Ben 2011-04-27 12:55:27

+0

我乞求有人帮我在这里... – Ben 2011-04-29 02:28:28

您不必使用身份验证,在这种情况下,它是不是真的需要。您只需设置用户记录的后端即可。

因此,像这样的工作:

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

更新

我的评论中提到这一点,但在一个“答案”的解决办法是添加到您的设置文件方面:

SESSION_COOKIE_DOMAIN = 'yourdomain.com' 

这将允许用户从www.yourdomain.com yourdomain.com进来登录到该网站。

+0

嗨,乔丹,这是关于设置后端的有用信息。我很感激。我不确定它是否能解决这个错误。它会产生一个较少的线程还是其他有意义的影响? – Ben 2011-04-30 16:10:18

+0

这是一些更多信息。我使用apache2运行mod_wsgi。 Mod_wsgi配置如下:SERVER MPM:预制,螺纹:否,分叉,是(可变进程数)。在我的日志文件中,我一直在模块线程中引发一个KeyError,忽略它。我在网上看了一下,似乎这可能是一件无害的事情,并不会导致更大的问题,但我想把它放在那里。 – Ben 2011-04-30 17:57:31

+0

感谢您指出SESSION_COOKIE_DOMAIN设置,解决了我的问题! – joshcartme 2011-08-30 21:08:49

哦,男人,我都非常放心,也充满了自我厌恶。我不知道Cookies在www和非www域名之间是不可转让的。

我的一组用户来到www,然后被重定向到非www,杀死他们的会话。我现在正在设置mod_rewrite来解决这个问题。

+1

如果这是您的问题的原因,您希望将SESSION_COOKIE_DOMAIN设置为'.yourdomain.com'。查看http://docs.djangoproject.com/zh/dev/ref/settings/?from=olddocs#session-cookie-domain – 2011-05-01 12:59:44

+0

感谢乔丹的这一切以及您的其他帮助。在这种情况下分配赏金的礼仪是什么?经过几天的困惑,我真的回答了我自己的问题。任何线索? – Ben 2011-05-01 15:31:33

+0

从技术上讲,您的答案并不完全正确,因为Cookie *可在www和非www域之间转移。当然,我有偏见,但考虑到最终的原因是会话数据的丢失,因为cookie与域没有关系,并且我的更新答案(和评论)解决了这个特定问题,我会说你可以分配给我,如果你觉得沿着这条道路是你的问题的最佳解决方案(我当然认为这是!) – 2011-05-01 16:40:13

只是柜面这可以帮助别人,我有这个问题,其中在目前看来,request.user.is_authenticated()是真实的,但经过HttpResponseRedirect到另一个页面,同一台主机,request.user成为匿名的。我正在使用会话,但事实证明这不是会话。我做了我自己的自定义身份验证后端,1.2文档说你必须实现get_user(self,user_id),但我不认为user_id(主键)是什么特殊的,所以我实现它作为get_user(self,username)..但显然这是问题的根源!