@login_required麻烦在烧瓶的应用程序 [英] @login_required trouble in flask app
问题描述
在蓝图中,我有以下内容:
<$从flask.ext.login导入LoginManager
从flask.ext.login导入UserMixin
从flask.ext.login导入current_user $ b $从flask.ext中导入p $ p> .login导入login_required
from flask.ext.login导入login_user $ b $ from flask.ext.login导入logout_user
$ b auth_print = Blueprint('auth_print',__name__)
login_manager = LoginManager()
login_manager.login_view ='/ login'
$ b $ class User(UserMixin):
$ b user_store = {}#存储已经存在的用户登录。
def __init __(self,user_id):
self.user_store [user_id] = self#将用户添加到user_store
self.username = user_id#user_id实际上是用户名
self.id = unicode(user_id)
def sign_out(self):
logout_user()
try:
del self .user_store [self.id]
除了KeyError:
传递
@classmethod
def get(cls,user_id):
返回cls.user_store.get(user_id)
@ login_manager.user_loader
def load_user(user_id):
return User.get(user_id)
$ b $ get get_current_user():
return current_user
@login_required
@ auth_print.route('/')
def user():
return欢迎,并感谢登录。
然后我有一个小应用程序,我想添加身份验证。
小应用程序
导入the_above_module
$现在我知道了蓝图的@login_required正在工作,因为如果我打开浏览器并转到本地主机:8000 /我必须登录。$ b $
app.register_blueprint(the_above_module.auth_print)#寄存器蓝图
@ the_above_module.login_required
@ app.route('/ profile')
def protected():
name = the_above_module.get_current_user()。username
返回感谢您登录
$ b $ if if __name__ =='__main__':
app.run(host ='0.0.0.0',port = 8000)
$ b然而,如果我去localhost:8000 / profile,login_required装饰器永远不会被触发。因此,我得到一个错误,因为没有当前的用户。
为什么@login_required工作在蓝图,而不是在应用程序,即使当确保保持相同的名称空格?解决方案你必须改变装饰器的顺序。引用 Flask文档:
那你现在怎么使用这个装饰器?将它作为最内层的
装饰器应用于视图函数。当应用更多的装饰器时,总是
记住route()装饰器是最外层的:
@ app.route '/ secret_page')
@login_required
def secret_page():
pass
I have created a blueprint that handles authenticating. This blue print uses Flask-Login. And has the following, as well as more code not shown.
In the blueprint I have the following:
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."
Then I have a small app I would like to add authentication to.
Small App
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)
Now I know the blueprint's @login_required is working because if I open the browser and go to localhost:8000/ I have to sign in.
However if I go to localhost:8000/profile the login_required decorator never gets triggered. I thus get an error because there is no current user.
Why would @login_required work in the blueprint and not in the app, even when im sure to maintain the same name spaces?
解决方案You have to change the order of the decorators. Quoting the Flask documentation:
So how would you use that decorator now? Apply it as innermost decorator to a view function. When applying further decorators, always remember that the route() decorator is the outermost:
@app.route('/secret_page') @login_required def secret_page(): pass
这篇关于@login_required麻烦在烧瓶的应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!