Flask应用程序中@login_required问题

我已经创建了一个处理身份验证的蓝图。此蓝图使用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也可以在蓝图中而不在应用程序中工作?

回答:

你必须更改装饰器的顺序。引用Flask文档:

那么,你现在将如何使用该装饰器?将其作为最里面的装饰器应用到视图函数。当应用其他装饰器时,请始终记住route()装饰器是最外面的:

@app.route('/secret_page') 

@login_required

def secret_page():

pass

以上是 Flask应用程序中@login_required问题 的全部内容, 来源链接: utcz.com/qa/435272.html

回到顶部