繁体   English   中英

@login_required 烧瓶应用程序中的麻烦

[英]@login_required trouble in flask app

我创建了一个处理身份验证的蓝图。 此蓝图使用 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 提供了装饰器。

@app.route("/welcome")
@login_required  # If the user is not logged in then it will redirected to unauthorized_handler
def welcome_page():
     return """<h1> welcome user</h1>"""

@login_manager.unauthorized_handler     # In unauthorized_handler we have a callback URL 
def unauthorized_callback():            # In call back url we can specify where we want to 
       return redirect(url_for('login')) # redirect the user in my case it is login page!

我希望你的问题得到解决!!!

@login_manager.unauthorized_handler
def unauthorized_callback():
    return redirect(url_for('website.index'))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM