3

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

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

我试图做这样的事情:

def myView(request):

    checkFunction()

和:

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

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

任何想法如何正确地做到这一点?

谢谢

罗恩

4

2 回答 2

5

你的错误是,在myView函数中,你调用了你的checkFunction,但是你没有使用的返回值,checkFunction所以你的返回值 checkFunction 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...

因此,如果没有出错,则checkFunction不会返回任何内容,并且将result不会执行 block。如果您返回响应,那么您的视图将返回该响应(在您的情况下,)...Noneif 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对象传递给您,因为您希望在那里创建响应。checkFunction你可能需要它。

于 2012-06-21T12:50:56.320 回答
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):
     ....
于 2012-06-21T12:31:46.250 回答