5

これは私の URLs.py です:

url(r'^api-auth/', include('rest_framework.urls',
                               namespace='rest_framework')),

ホームページに、ユーザーがユーザー名とパスワードを入力できるフォームがあります。送信ボタンがクリックされると、AngularJS は POST リクエストをユーザー オブジェクト (ユーザー名とパスワード) と共に「api-auth/login/」に送信します。

$http.post("/api-auth/login/", self.loginuser)
    .error(function(data, status, headers, config) {
        console.log(data);
     });

ユーザーが間違ったユーザー名とパスワード (ユーザー名とパスワードが存在しないか一致しない) を送信すると、Django Rest Framework は 204 No Content、404 または 401 Unauthorized ではなく 200 OK を返します (この投稿では、401 と表示されます)。は、返される正しいステータス コードです:ユーザーが間違ったユーザー名/パスワードでログインしようとしたが、正しい形式でログインしようとした場合に返される適切な HTTP ステータス コードは何ですか? )。

ここによると: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.htmlのセクション 9.5 POST には、「この場合、200 (OK) または 204 (No Content) のいずれかが適切な応答です。結果を説明するエンティティが応答に含まれているかどうかによって異なります。」

エラーを処理し、データが存在する場合はデータをログに記録します (JS で console.log(data) を実行しました)。結果。

では、なぜ DjangoRestFramework は 204 No Content (または 404 または 401、私がリンクした他の SO 投稿によると返されるべきもの) ではなく 200 を返すのでしょうか?

4

3 に答える 3

6
于 2015-10-01T22:26:54.933 に答える
4

私の謙虚な意見では、ここではビジネスの概念とプロトコルの問題を混同しています.

ログイン メソッドは 401 (未承認) を返すべきではありません。これは、ユーザーが (明らかに) まだ承認/認証されていないことが前提条件であるためです。したがって、要求が正しい方法 (構文的に言えば) で行われた場合、ユーザー資格情報が正しくなくても (ビジネス コンセプト)、応答は 200 (プロトコル) になるはずです。つまり、要求は受け入れられ、適切に処理されました。そしてもちろん、ログインが成功したかどうかはレスポンスボディによって判断されます。

つまり、アプリケーション エラーが実際にはビジネス レイヤー エラーである場合に、アプリケーション エラーをログに記録しようとしているのです (ユーザーがデータベースに応じて間違った値を入力した)。それを得る?

于 2015-09-28T17:39:31.350 に答える
2

DRF のソースを見ると、Django 独自のログイン/ログアウト ビューを使用していることがわかります。したがって、これは Django のフォーム処理自体に関連する質問です。これは、 Django自体に関連する質問です。

于 2015-09-28T12:42:43.453 に答える