ste*_*eve 8 python flask login-required flask-login
我创建了一个处理身份验证的蓝图.此蓝图使用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."
Run Code Online (Sandbox Code Playgroud)
然后我有一个小应用程序,我想添加身份验证.
小应用程序
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)
Run Code Online (Sandbox Code Playgroud)
现在我知道蓝图的@login_required正在工作,因为如果我打开浏览器并转到localhost:8000 /我必须登录.
但是,如果我转到localhost:8000/profile,则login_required装饰器永远不会被触发.因此,我得到一个错误,因为没有当前用户.
为什么@login_required会在蓝图中而不是在应用程序中工作,即使我确定要保持相同的名称空间?
syn*_*nym 18
您必须更改装饰器的顺序.引用Flask文档:
那么你现在如何使用那个装饰器呢?将它作为最里面的装饰器应用于视图功能.在应用其他装饰器时,请始终记住route()装饰器是最外层的:
Run Code Online (Sandbox Code Playgroud)@app.route('/secret_page') @login_required def secret_page(): pass
| 归档时间: |
|
| 查看次数: |
8458 次 |
| 最近记录: |