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/')
您不必使用身份验证,在这种情况下,它是不是真的需要。您只需设置用户记录的后端即可。
因此,像这样的工作:
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进来登录到该网站。
嗨,乔丹,这是关于设置后端的有用信息。我很感激。我不确定它是否能解决这个错误。它会产生一个较少的线程还是其他有意义的影响? – Ben 2011-04-30 16:10:18
这是一些更多信息。我使用apache2运行mod_wsgi。 Mod_wsgi配置如下:SERVER MPM:预制,螺纹:否,分叉,是(可变进程数)。在我的日志文件中,我一直在模块线程中引发一个KeyError,忽略它。我在网上看了一下,似乎这可能是一件无害的事情,并不会导致更大的问题,但我想把它放在那里。 – Ben 2011-04-30 17:57:31
感谢您指出SESSION_COOKIE_DOMAIN设置,解决了我的问题! – joshcartme 2011-08-30 21:08:49
哦,男人,我都非常放心,也充满了自我厌恶。我不知道Cookies在www和非www域名之间是不可转让的。
我的一组用户来到www,然后被重定向到非www,杀死他们的会话。我现在正在设置mod_rewrite来解决这个问题。
如果这是您的问题的原因,您希望将SESSION_COOKIE_DOMAIN设置为'.yourdomain.com'。查看http://docs.djangoproject.com/zh/dev/ref/settings/?from=olddocs#session-cookie-domain – 2011-05-01 12:59:44
感谢乔丹的这一切以及您的其他帮助。在这种情况下分配赏金的礼仪是什么?经过几天的困惑,我真的回答了我自己的问题。任何线索? – Ben 2011-05-01 15:31:33
从技术上讲,您的答案并不完全正确,因为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)..但显然这是问题的根源!
你是否像使用相关文章一样使用mod python?当我开始学习python时,我深深地被引导到了mod_wsgi。我不能说这会解决任何问题。 – 2011-04-27 05:31:41
嗨,詹姆斯,我正在使用mod_wsgi。 – Ben 2011-04-27 12:55:27
我乞求有人帮我在这里... – Ben 2011-04-29 02:28:28