来自函数的django HttpResponseRedirect

时间:2014-10-22 09:09:59

标签: django

我有这样的代码

def checkLogin(request)
    if request.user.is_authenticated:
        return None
    else:
        return HttpResponseRedirect(reverse(login))

def somePage(request)
    checkLogin(request)  #kicks the user out if not login

    #do other things here if not kick out

我想在我的许多视图中检查登录,所以我想把它放在一个易于使用的函数中。

但是由于某些原因,HttpResponseRedirect无法正常工作。我可以使用渲染而不是httpresponseredirect。

2 个答案:

答案 0 :(得分:3)

有内置的Django解决方案from django.contrib.auth.decorators import login_required你需要把装饰器放在上面:

@login_required
def somFunc():

或者如果它是通用视图而不是函数from django.utils.decorators import method_decorator

@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):

答案 1 :(得分:0)

对于您的用例,您可以使用login_required装饰器https://docs.djangoproject.com/en/1.7/topics/auth/default/#the-login-required-decorator

一般情况下,只有视图函数的返回值作为HttpResponse返回,你可以这样做:

def checkLogin(request)
    if request.user.is_authenticated:
        return None
    else:
        return HttpResponseRedirect(reverse(login))

def somePage(request)
    needs_login = checkLogin(request)  #kicks the user out if not login
    if needs_login:
        return needs_login

    #do other things here if not kick out

唯一的例外是当你想要返回404时。你可以引发一个404异常,它会冒泡到视图中。

def checkLogin(request)
    if not request.user.is_authenticated:
        raise Http404

def somePage(request)
    checkLogin(request)  #kicks the user out if not login

    #do other things here if not kick out