python - @login_required Flask 应用程序中的问题

标签 python flask flask-login 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 在蓝图中工作而不在应用程序中工作,即使我确定要维护相同的 namespace ?

最佳答案

您必须更 retrofit 饰器的顺序。引用 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

关于python - @login_required Flask 应用程序中的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28575234/

相关文章:

python - pexpect:如何转储子 "as is"的所有内容?

python - Pygame:谁能帮我实现双跳?

python - 是否可以在运行 flask 应用程序的 uwsgi 进程之间共享内存?

javascript - Flask+AJAX+Jquery+JINJA动态更新HTML Table

python - 为什么我一直收到 'ImportError: cannot import name db' ?

mysql - UserMixin 破坏 mySQL 连接器

python - 我可以在 Python 的函数中声明一个类吗?

python - 如何创建一个简单的梯度下降算法

Python/Flask/MongoDB - 错误消息 : BadRequestKeyError: 400 - Get list

python - flask-login 仅在 get_id() 返回 self.email 时有效