Django - 是否可以从视图中的函数进行重定向?

时间:2012-06-21 11:38:04

标签: django view return decorator httpresponse

我尝试调用一个检查规则的函数,如果规则未满足,我想跳过其余的视图代码,只返回一个HttpResponse错误。

我想将所有转义逻辑放在一个函数中,因为我需要在整个项目的几个点上使用它。

我试着这样做:

def myView(request):

    checkFunction()

def checkFunction():
    #do stuff
    return HttpResponse(status=403)

但它只是不起作用(难怪)......

任何想法如何做到这一点?

由于

罗恩

2 个答案:

答案 0 :(得分:5)

您的错误是,在myView函数中,您调用了checkFunction,但是您没有使用checkFunction的返回值,因此您的返回值为checkFunction {{ 1}}迷失了,永远不会在return HttpResponse(status=403)内返回。

可能就像:

myView

因此,如果没有任何问题,那么def myView(request): result = checkFunction() if result: return result #if no problem, keep running on... def checkFunction(): #do stuff if something_goes_wrong: return HttpResponse(status=403) # you do not need to return anything if no error occured... 将不会返回任何内容,checkFunctionresult并且None块将不会被执行。如果您返回回复,则视图会返回该回复(在您的情况下,if result:)...

更新:然后你可以这样做....

HttpResponse(status=403)
这样,您的视图就会返回def checkFunction(request): #do stuff if something_goes_wrong: return HttpResponse(status=403) elif some_other_issue: return HttpResponse(....) else: #no problems, everything is as expected... return render_to_response(...) # or any kind of response you want def myView(request): return checkFunction(request) 返回的内容......

此外,将checkFunction对象传递给request可能是必要的,因为您希望在那里传达您的回复。你可能需要它。

答案 1 :(得分:4)

您可以使用装饰器将逻辑应用于具有可能重定向的视图(如果您真的可以将逻辑放在视图之外)。

def check_my_logic(view):
    def wrap(request, *args, **kwargs):
        # do some logic here
        if all_ok:
             return view(request, *args, **kwargs)
        else:
            return HttpResponse(status=403)
  return wrap

然后在views.py中:

 from mydecorators import check_my_logic

 @check_my_logic
 def some_view(request):
     ....