Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 1.2会话丢失_Django_Apache_Session_Caching_Cookies - Fatal编程技术网

Django 1.2会话丢失

Django 1.2会话丢失,django,apache,session,caching,cookies,Django,Apache,Session,Caching,Cookies,我以前也问过类似的问题,但我做了更多的研究,这次迭代应该有点不同。似乎有几个SO用户在单个视图中注册和登录用户时遇到了问题,但问题并没有得到真正的解决 问题是我在一个Django视图中注册、验证和登录一个用户。对于大多数用户来说,这很好,但是对于其他用户,他们随后的请求(他们单击我网站上的链接)会返回一个匿名用户。不知何故,登录的用户会丢失会话,并被重定向到my sit上不需要身份验证的页面 然后,当他们通过纯登录视图(与注册+登录视图相反)登录时,会话数据保持tact状态。问题似乎真的是在单个

我以前也问过类似的问题,但我做了更多的研究,这次迭代应该有点不同。似乎有几个SO用户在单个视图中注册和登录用户时遇到了问题,但问题并没有得到真正的解决

问题是我在一个Django视图中注册、验证和登录一个用户。对于大多数用户来说,这很好,但是对于其他用户,他们随后的请求(他们单击我网站上的链接)会返回一个匿名用户。不知何故,登录的用户会丢失会话,并被重定向到my sit上不需要身份验证的页面

然后,当他们通过纯登录视图(与注册+登录视图相反)登录时,会话数据保持tact状态。问题似乎真的是在单个视图中注册和登录

有关同一问题,请参阅此帖子:

有人认为这可能是一个线程问题。我还看到有人建议它与缓存会话数据的后端相关

你有没有想过它到底与什么有关?我无法重现这个错误,这真的让我望而却步

编辑——我应该注意,我使用的是默认的数据库支持会话

这是我的注册/登录视图

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飞溅_寄存器(请求):
if request.session.get('beta'):
if request.method==“POST”:
userform=MyUserCreationForm(request.POST)
如果userform.is_有效():

#的用户名不必使用authenticate,在这种情况下,实际上不需要它。您所需要做的就是设置用户记录的后端

因此,类似这样的方法会起作用:

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

这将允许来自www.yourdomain.com或yourdomain.com的用户登录到该网站。

哦,天哪,我感到无比宽慰,也充满了自我厌恶。我不知道Cookies不能在www和非www域名之间转移


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

为了帮助其他人,我遇到了一个问题,在当前视图中,request.user.is_authenticated()为True,但在HttpResponseDirect指向另一个页面后,同一主机request.user变得匿名。我正在使用会话,但结果不是会话。我做了自己的自定义身份验证后端,1.2文档说您必须实现get_user(self,user_id),但我不认为user_id(主键)有什么特别之处,所以我将其实现为get_user(self,username)。。但显然这就是问题的根源

您是否像相关帖子一样使用mod python?当我开始学习python时,我被大量引导到mod_wsgi。不过我不能说这会解决任何问题。嗨,詹姆斯,我正在使用mod_wsgi。我请求有人来帮我…@brendan我想主要的问题是你提到你不能复制它?你确定你能解决它吗?也许在这个阶段彻底解决它很困难,但我希望有一个大致的起点。现在,我认为要么是我的服务器配置(线程)、会话后端(我现在只是使用默认数据库来存储会话数据)有问题,要么是与“beta”会话变量相关的问题(尽管我不明白)。来自那里的任何线索都会非常有用。嗨,Jordan,这是一条关于设置后端的有用信息。我很感激。我不确定它是否能修复这个错误。它会不会少产生一个线程或其他有意义的影响?这里有更多的信息。我正在用apache2运行mod_wsgi。Mod_wsgi配置如下:服务器MPM:Preform,线程:no,forked,yes(可变进程计数)。在我的日志文件中,我一直在模块线程中引发一个KeyError,该错误被忽略。我在网上看了看,似乎这可能是一件无害的事情,不会引起更大的问题,但我想把它放在那里。感谢您指出会话\u COOKIE\u域设置,解决了我的问题!如果这是问题的原因,您希望将会话\u COOKIE\u DOMAIN设置为
.yourdomain.com
。谢谢乔丹的帮助。在这种情况下,分配赏金的礼节是什么?经过几天的困惑,我真诚地回答了自己的问题。有什么线索吗?从技术上讲,你的答案并不完全正确,因为cookies可以在www和非www域之间传输。当然,我有偏见,但考虑到最终原因是会话数据丢失,因为cookie没有绑定到域,并且我的更新答案(和评论)解决了这个特定问题,我想如果你觉得沿着这条路走是解决问题的最佳方法,你可以将它分配给我(我当然认为是!)好吧,这对我来说很公平。谢谢你,乔丹,你帮了我很多忙。
SESSION_COOKIE_DOMAIN = 'yourdomain.com'