我尝试调用一个检查规则的函数,如果规则未满足,我想跳过其余的视图代码,只返回一个HttpResponse错误。
我想将所有转义逻辑放在一个函数中,因为我需要在整个项目的几个点上使用它。
我试着这样做:
def myView(request):
checkFunction()
和
def checkFunction():
#do stuff
return HttpResponse(status=403)
但它只是不起作用(难怪)......
任何想法如何做到这一点?
由于
罗恩
答案 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...
将不会返回任何内容,checkFunction
将result
并且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):
....