我有一个中间件,可以为每个新用户自动创建一个用户帐户并重定向:
class LogNewUser(object):
def process_request(self, request):
user_id = request.session.get('uid', None)
if not user_id:
user = User.objects.create(username=generate_name())
request.session['uid'] = user.pk
return redirect(request.path)
else:
request.user = User.objects.get(pk=user_id)
当然,如果浏览器禁用cookie,则会创建无限重定向循环。
我想测试用户是否启用了cookie,如果是,则执行我的操作,如果没有,则创建一个特定的用户对象,对于所有非cookie用户都是相同的。
我尝试了request.session.set_test_cookie()
和request.session.test_cookie_worked()
的不同组合,但我无法找到符合我想要的方法。
答案 0 :(得分:1)
我意识到挑战是找到一种方式来说你已经尝试过设置测试cookie。由于HTTP是无状态的,唯一的方法是将信息封装到我们重定向到的URL中并在中间件中再次捕获它:
class LogNewUser(object):
def process_request(self, request):
if 'testcookie' in request.path:
next = request.GET.get('next', '/')
if not request.session.test_cookie_worked():
return render(request, 'cookie_error.html')
request.session.delete_test_cookie()
user = User.objects.create(username=generate_name())
request.session['uid'] = user.pk
return redirect(request.GET.get('next', '/'))
if not request.user.is_authenticated():
user_id = request.session.get('uid', None)
if not user_id:
request.session.set_test_cookie()
return redirect('/testcookie/?next=%s' % request.path)
request.user = User.objects.get(pk=uid)
在此代码中,我们无法为所有非cookie用户创建User对象。这是因为如果没有在每个请求上进行重定向,这种技术就不可能实现,这会导致POST请求中断。但是: