1

リクエストメソッドのみを使用したいビュー機能がPOSTです。ここでrequire_POSTデコレータについて知りましたが、メソッドがPOSTでない場合は、を使用してユーザーを別のビューにリダイレクトする必要がありますHttpResponseRedirect。これどうやってするの ?

from django.views.decorators.http import require_POST

@require_POST
def my_view(request):
    # I can assume now that only POST requests make it this far
    # ...

メソッド自体でrequire_POSTリダイレクトを使用せずに、2行のコードを追加することでそれを実行できることを私は知っています

if request.method != 'POST':
    return HttpResponseRedirect(view_url)

しかし、私はデコレータ自体を使用することにもっと興味があり、このデコレータが 405 を上げると、別のビューにリダイレクトします。

4

2 に答える 2

2

カスタムデコレータを使用する必要があります。Django デコレーターのコードは、こちら で確認できます。コードに到達する前にすでに応答が返されているため、ビュー関数で行うことはまったく実行されません。

リクエストが POST でない場合、手動でリダイレクトを返すことに問題はありません。コードのいくつかの異なる場所でこのパターンを使用する場合は、後でデコレータにリファクタリングします。しかし、これがあなたがそれを使用している最初の場所である場合、それはやり過ぎです.

于 2013-04-07T09:04:08.607 に答える
2

カスタム デコレータが最適です。

私自身、必要なものに似たものを使用しており、コードを投稿します。

彼が最初だったので、@aychedeeの回答に賛成票を投じてください。:)

def require_post_decorator(function=None, redirect_url='/'):
    def _decorator(view_function):
        def _view(request, *args, **kwargs):
            if request.method == 'POST':
                #do some before the view is reached stuffs here.
                return view_function(request, *args, **kwargs)
            else:
                return HttpResponseRedirect(redirect_url)

        _view.__name__ = view_function.__name__
        _view.__dict__ = view_function.__dict__
        _view.__doc__ = view_function.__doc__

        return _view

    if function:
        return _decorator(function)
    return _decorator
于 2013-04-07T09:08:39.813 に答える