1

で始まるPOSTリクエストのみを処理することを目的としたビューがあります

user = User.objects.get(username=request.POST['name'])

ビューがGETリクエストで呼び出されないようにする必要がありますか?私が良い習慣/セキュリティタイプのものについて考えているのか、それともOCDであることを考えているのかわかりません。

@require_POSTGETを使用してビューを呼び出す"Key 'name' not found in <QueryDict: {}>と、500エラーが発生するため、デコレータを使用しています。

これが発生する唯一の可能性は、ユーザーがページのHTMLを見て、何らかの理由actionでアドレスバーのフォームの属性を試してみようと思った場合です。これはありそうもないようです。

私はいくつかのサイトでこれを自分で試しましたが、405エラーのある空白のページではなくエラーページが表示され@require_POSTました。

テンプレート設計者が誤って私のビューへのハイパーリンクを作成したり、忘れたりした場合に備えて、GETリクエストを防ぐことをお勧めしmethod="post"ます。(その場合、私はget_object_or_404上記を使用する必要があると思います)

@require_GETGETリクエストを処理するためだけに設計されたビューに追加する必要はないと思いますか?

4

2 に答える 2

2

を使用する理由が理解できたようです@requirePOST。でエラーを発生させたくない場合の別のオプションは、GET次の行に沿って何かを使用することです。

def view(request):
    if request.method == 'POST':
        ..code for post..
    else:
        *redirect, or other code*

を使用する必要があるかどうかについては、 と の両方を@requireGET実行するビューが必要な場合にのみ問題が発生する可能性があります。つまり、 でアクションを起こすが、 でユーザーに表示されるだけのフォームです。ただし、必要な場合は、.GETPOSTPOSTGETGETPOST

于 2013-01-22T20:57:09.963 に答える
1

ビューが GET 要求で呼び出されないようにする必要がありますか? グッドプラクティス/セキュリティタイプのことを考えているのか、それともOCDであるのかはわかりません.

はい。あなたは自分の質問に答えることに触れていると思います。ビューにはrequest.POSTget リクエスト エラーが必要です。バグのないコードを作成したい場合は、get リクエストがこのビューにアクセスしないようにします。Django には、これを行うための便利な pythonic デコレータが用意されています。あなたは強迫性障害ではないと思います。また、本番環境でエラーをトリガーする (メールを送信する、ログに記録するなど) のコストがどれくらいかかるかはわかりませんが、それは考慮すべきことです。

これが起こる唯一の可能性は、ユーザーがページの HTML を見て、何らかの理由でアドレス バーのフォームのアクション属性を試してみようと考えた場合だと思います。

ユーザーがこれに対してGETリクエストを行う方法は問題ではないと思います。このビューが投稿リクエストでなければならないことだけが重要だと思います。

テンプレートの設計者が誤ってビューへのハイパーリンクを作成したり、method="post" を忘れたりした場合に備えて、GET 要求を防ぐことをお勧めします。(その場合、上記の get_object_or_404 を使用する必要があると思います)

この場合、このビューに対して get リクエストを行うことができる多くの方法について考えることが重要だとは思いません。重要な部分は、Post リクエストが必要なことです。ツールを自由に使用して、関数に入るすべてのリクエストがポスト リクエストであることを確認できます。

一つは、name想定されていないことです。あなたはまだ得ることができますKeyError。リクエストが POST であることを確認していても、投稿リクエストにパラメーターがあることを確認することはできませんname

そのgetため、頻繁に使用されます

if not request.POST.get('name'):
  # raise some sort of error?
user = User.objects.get(username=request.POST['name'])
于 2013-01-22T23:59:09.390 に答える