5

アプリで認証を処理するために Flask-HTTPAuth を使用しています。login_required私には多くのビューがあり、それらすべてに追加したくありません。デフォルトでログインを必須にするにはどうすればよいですか?

from flask.ext.httpauth import HTTPBasicAuth
auth = HTTPBasicAuth()

@auth.verify_password
def verify_password(username, password):
    return username == '111' and password == '222'

@app.route('/')
@app.route('/home/')
@auth.login_required
def index():
    return 'Hello'

@app.route('/route2/')
def route2():
    return 'route2'

app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
4

1 に答える 1

13

before_requestデフォルトでログインを要求する関数を追加し、login_exemptそれを必要としないいくつかのルート用の単純なデコレータを作成できます。

静的ファイルを必ず除外してください。そうしないと、認証されていないユーザーに対して読み込まれません。

Flask-HTTPAuthlogin_requiredには、require ロジックをビュー デコレータから分離する方法がありません。ビューを実行せずに認証を要求するには、少し手間がかかる必要があります。

def login_exempt(f):
    f.login_exempt = True
    return f

# a dummy callable to execute the login_required logic
login_required_dummy_view = auth.login_required(lambda: None)

@app.before_request
def default_login_required():
    # exclude 404 errors and static routes
    # uses split to handle blueprint static routes as well
    if not request.endpoint or request.endpoint.rsplit('.', 1)[-1] == 'static':
        return

     view = current_app.view_functions[request.endpoint]

     if getattr(view, 'login_exempt', False):
         return

     return login_required_dummy_view()

# for example, the login page shouldn't require login
@app.route('/login', methods=['GET', 'POST'])
@login_exempt
def login():
    pass
于 2015-06-10T16:02:49.860 に答える