Django请求流程

时间:2015-01-27 11:36:15

标签: django

我试图了解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()

1 个答案:

答案 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中没有匹配的电子邮件)。