3

ルールをチェックする関数を呼び出そうとしましたが、ルールが満たされていない場合は、残りのビュー コードをスキップして HttpResponse エラーを返したいと思います。

プロジェクト全体のいくつかのポイントで必要になるため、すべてのエスケープ ロジックを関数に入れたいと思います。

私はこのようなことをしようとしました:

def myView(request):

    checkFunction()

と:

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

しかし、それはうまくいきません(当然のことです)...

これを正しく行う方法はありますか?

ありがとう

ロン

4

2 に答える 2

5

あなたの間違いは、myView関数で を呼び出しますcheckFunctionが、 の戻り値を使用しないため、 の戻り値checkFunctioncheckFunction 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。応答を返すと、ビューはその応答を返します (あなたの状況では)...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返します...

また、そこに応答を作成したいので、requestobject を yourに渡す必要があるかもしれません。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 に答える