9

認証を処理するブループリントを作成しました。このブルー プリントでは、Flask-Login を使用しています。また、次のコードと、表示されていないコードがあります。

設計図には次のものがあります。

from flask.ext.login import LoginManager
from flask.ext.login import UserMixin
from flask.ext.login import current_user
from flask.ext.login import login_required
from flask.ext.login import login_user
from flask.ext.login import logout_user

auth_print = Blueprint('auth_print', __name__)
login_manager = LoginManager()
login_manager.login_view = '/login'

class User(UserMixin):

  user_store = {}  # Stores the users that are already logged in.

  def __init__(self, user_id):
    self.user_store[user_id] = self  # add the user to the user_store
    self.username = user_id  # the user_id is in fact the username
    self.id = unicode(user_id)

  def sign_out(self):
    logout_user()
    try:
      del self.user_store[self.id]
    except KeyError:
      pass

  @classmethod
  def get(cls, user_id):
    return cls.user_store.get(user_id)

@login_manager.user_loader
def load_user(user_id):
  return User.get(user_id)

def get_current_user():
  return current_user

@login_required
@auth_print.route('/')
def user():
  return "Welcome, and thanks for logging in."

次に、認証を追加したい小さなアプリがあります。

小さなアプリ

import the_above_module
app.register_blueprint(the_above_module.auth_print) # register the blueprint

@the_above_module.login_required
@app.route('/profile')
def protected():
    name = the_above_module.get_current_user().username
    return "Thank you for logging in."

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)

これで、青写真の @login_required が機能していることがわかります。ブラウザーを開いて localhost:8000/ にアクセスすると、サインインする必要があるからです。

ただし、localhost:8000/profile に移動すると、login_required デコレーターはトリガーされません。現在のユーザーがいないため、エラーが発生します。

@login_required がブループリントでは機能するのに、アプリでは機能しないのはなぜですか? 同じ名前空間を維持することが確実な場合でも?

4

3 に答える 3

22

デコレータの順序を変更する必要があります。Flaskのドキュメントを引用:

では、そのデコレータを今どのように使用しますか? ビュー関数の最も内側のデコレーターとして適用します。さらにデコレーターを適用するときは、 route() デコレーターが最も外側にあることを常に覚えておいてください。

@app.route('/secret_page') 
@login_required 
def secret_page():
    pass
于 2015-02-18T03:12:11.767 に答える
0
@login_manager.unauthorized_handler
def unauthorized_callback():
    return redirect(url_for('website.index'))
于 2016-07-05T11:10:43.367 に答える