我试图了解Django请求处理。
我的目标是在用户登录后立即重定向用户,但是当我运行此代码时,我看到我的数据库尚未填充我想要的条目,重定向会引发DoesNotExist
异常。
当我用HttpResponseRedirect()
替换HttpResponse()
时,相同的代码可以正常运行。
要么我缺少一些代码,要么Django正在考虑重定向先前请求的一部分并进行重定向而不是更新。
以前有人遇到过这个问题吗?
Django版本 - 1.4
注册视图(不更新数据库) -
try:
email_id = request.GET.__getitem__('email_id')
name = request.GET.__getitem__('name')
try:
Person.objects.create(email_id=email_id, name=name)
request.session['email_id'] = email_id
return HttpResponseRedirect('/myaccount/')
except IntegrityError:
return render_to_response('signup.html')
except MultiValueDictKeyError:
return render_to_response('signup.html')
注册视图(正确更新数据库) -
try:
email_id = request.GET.__getitem__('email_id')
name = request.GET.__getitem__('name')
try:
Person.objects.create(email_id=email_id, name=name)
request.session['email_id'] = email_id
return HttpResponse('This Works!!')
except IntegrityError:
return render_to_response('signup.html')
except MultiValueDictKeyError:
return render_to_response('signup.html')
Myaccount视图 -
# Custom function that decodes the email_id from the session
email_id = return_email_id(request)
user = Person.objects.get(email_id=email_id)
name = user.name
return render_to_response('myaccount.html', {'name': name})
编辑:
return_email_id()的代码:
def return_email_id(request):
try:
check_session(request)
session_cookie = request.COOKIES['sessionid']
session_object = Session.objects.get(pk=session_cookie)
get_email_id = session_object.get_decoded()['email_id']
return HttpResponse(get_email_id)
except PermissionDenied:
raise PermissionDenied()
def check_session(request):
if request.session.get('email_id'):
return True
else:
raise PermissionDenied()
答案 0 :(得分:0)
你似乎决心以艰难的方式做事。
您的return_email_id
功能正在做很多不必要的工作。该会话直接在request.session
中提供,因此无需获取cookie,查询会话存储,解码它等等。
实际问题可能是你从该函数返回一个HttpResponse,而视图实际上是期望一个可以用来查询Person模型的电子邮件。但是我会摆脱整个函数,只是在视图中做最简单的事情:
email_id = request.session.get('email_id')
if email_id:
user = Person.objects.get(email_id=email_id)
name = user.name
return render_to_response('myaccount.html', {'name': name})
else:
# return something else if email doesn't exist
(尽管您可能还应该处理Person调用引发DoesNotExist异常的情况,因为db中没有匹配的电子邮件)。