Django 1.2会话丢失

Ben*_*Ben 5 apache django cookies session caching

我以前曾问过类似的问题,但我做了一些研究,这次迭代应该有点不同.似乎有几个SO用户在单个视图中注册和登录用户时遇到了问题,但实际上并没有得到回答.

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

然后,当他们通过纯登录视图(而不是注册+登录视图)登录时,会话数据保持不变.问题实际上似乎是在单个视图中注册和登录.

有关同一问题,请参阅此文章:https: //stackoverflow.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/')        
Run Code Online (Sandbox Code Playgroud)

Jor*_*ter 18

您不必使用身份验证,在这种情况下,它并不是真正需要的.您需要做的就是设置用户记录的后端.

所以像这样的东西会起作用:

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/')
Run Code Online (Sandbox Code Playgroud)

更新

我在评论中提到了这一点,但就"回答"而言,解决方案是将其添加到您的设置文件中:

SESSION_COOKIE_DOMAIN = 'yourdomain.com'
Run Code Online (Sandbox Code Playgroud)

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