Django 1.2 session 丢失

标签 django apache session caching cookies

我之前问过一个类似的问题,但我做了更多的研究,这次迭代应该有点不同。似乎有几个 SO 用户在单个 View 中注册和登录用户时遇到了问题,但尚未真正得到解答。

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

当他们然后通过纯登录 View (而不是注册 + 登录 View )登录时, session 数据保持原样。问题似乎确实是在单个 View 中注册和登录。

有关相同问题,请参阅此帖子:https://stackoverflow.com/questions/1693726/problem-with-combined-authentication-login-view .

有人建议这可能是一个线程问题。我还看到它表明它与缓存 session 数据的后端有关。

关于它真正相关的任何想法?我无法重现该错误,这真的让我退缩了。

编辑 - 我应该注意我使用的是默认数据库支持的 session 。

这是我的注册/登录 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 的用户登录到该网站。

关于Django 1.2 session 丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5775268/

相关文章:

mysql - 获取 Django 中对象的后代

带有 ssl 的 slim3 的 Apache 配置

apache - mod_rewrite 转换为小写并将 + 替换为 -

node.js - 重新启动服务器时 Express 4 session 不持久

php - WordPress session 在 Mozilla Firefox 中丢失

django - 安装 django-CMS 后 .iPython 的权限被拒绝

python - Django:对 (\d+) 的解释

android - html5 视频标签无法在 android 上播放 mp4 视频

c# - 在网络场场景中工作时,我可以使用什么作为通用 session ID?

python - 如何配置 Django、PostgreSQL、Apache 和 Python?