之前我曾问过类似的问题,但我做了一些研究,这次迭代应该有点不同。似乎有几个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/')
答案 0 :(得分: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/')
我在评论中提到了这一点,但就“答案”而言,解决方案是将其添加到您的设置文件中:
SESSION_COOKIE_DOMAIN = 'yourdomain.com'
这将允许来自www.yourdomain.com 或 yourdomain.com的用户登录该网站。
答案 1 :(得分:3)
哦,伙计,我既放心又松懈,也充满了自我厌恶。我不知道Cookies不能在www和非www域名之间转让。
我的一组用户来到www,然后被重定向到非www,杀死了他们的会话。我现在正在设置mod_rewrite来解决这个问题。
答案 2 :(得分:1)
只是这有助于其他任何人,我遇到了这个问题,在当前视图中,request.user.is_authenticated()为True,但在HttpResponseRedirect到另一个页面后,同一个主机,request.user变为匿名。我正在使用会话,但事实证明它不是会话。我做了我自己的自定义身份验证后端,1.2文档说你必须实现get_user(self,user_id),但我不认为user_id(主键)是特别的,所以我把它实现为get_user(self,username)..但是显然这是问题的根源!