フラスコでは、次の スニペット を使用してHTTP認証を有効にしています。
def authenticate():
return Response('<Why access is denied string goes here...>', 401, {'WWW-Authenticate':'Basic realm="Login Required"'})
さて、Flaskでの私の過去の経験では、誰かの資格情報が正しくなく、私がただ電話できることを彼らに知らせたい場合:
abort(401)
これにより、基本的なApache401応答が得られます。上記のスニペットでそれを実装する方法を知っている人はいますか?
ありがとう
Flaskでは、カスタムエラー応答は非常に簡単です。引数がHTTPエラーステータスコードのみである関数を作成し、flask.Responseインスタンスを返すようにして、 @ app.errorhandler で装飾します。
_@app.errorhandler(401)
def custom_401(error):
return Response('<Why access is denied string goes here...>', 401, {'WWW-Authenticate':'Basic realm="Login Required"'})
_
その後、abort(401)
を心ゆくまで使用できます。
Flaskのabort
はWerkzeugから直接来ています。これは呼び出し可能なオブジェクトであり、オンデマンドでさまざまな事前定義されたHTTP例外(HTTPException
のサブクラス)を発生させます。詳細については、コード ここ を確認してください。
事前定義されたUnauthorized
(401にマップされます)は、コードとメッセージのみを定義し、ブラウザでログインポップアップをトリガーするために必要な_WWW-Authenticate
_ヘッダーは定義しません。 HTTPException
のヘッダーは、_HTTPException.get_headers
_の[('Content-Type', 'text/html')]
としてハードコードされています。
したがって、_WWW-Authenticate
_ヘッダーを追加するには、独自のUnauthorized
サブクラスを作成し、_get_headers
_関数を上書きして、最後に_abort.mapping
_ディクショナリを更新します。
_from flask import abort
from werkzeug.exceptions import Unauthorized
class MyUnauthorized(Unauthorized):
description = '<Why access is denied string goes here...>'
def get_headers(self, environ):
"""Get a list of headers."""
return [('Content-Type', 'text/html'),
('WWW-Authenticate', 'Basic realm="Login required"')]
abort.mapping.update({401: MyUnauthorized})
_
これで、すべてのabort(401)
呼び出しでカスタム例外が発生します。