flask-login:is_authenticated不一致

时间:2018-06-04 16:05:31

标签: python flask flask-login

我的印象是使用来自flask_login的is_authenticated无法正常工作。提供我在测试环境中获得的以下日志:

False
2018-06-05 15:20:22,416 - root - INFO - GET - /ngin/api/v2/menu/main? - 200 OK
False
2018-06-05 15:20:45,543 - root - INFO - GET - /ngin/api/v2/menu/lvgo? - 200 OK
False
2018-06-05 15:20:48,605 - root - INFO - GET - /ngin/api/v2/menu/main? - 200 OK
False
2018-06-05 15:20:51,120 - root - INFO - GET - /ngin/api/v2/menu/lpgp? - 200 OK
user_id
True
2018-06-05 15:20:51,219 - root - INFO - GET - /ngin/static/media/ngin_gas.svg? - 200 OK
False
2018-06-05 15:20:52,865 - root - INFO - GET - /ngin/api/v2/menu/main? - 200 OK
False
2018-06-05 15:20:55,173 - root - INFO - GET - /ngin/api/v2/menu/lpgp? - 200 OK
False

带有url的日志行位于after_request块中,因此在末尾打印。用户名('user_id')来自login_manager.user_loader;而真或假来自current_user.is_authenticated。 似乎并不总是调用user_loader。当它发生时,用户会显示已验证的,但是当调用未发生时,is_authenticated将返回false。

我的代码结构如下:

class usrmgmr():

  def __init__(self, app):
    self.login_manager = fl.LoginManager()
    self.login_manager.init_app(app)
    self.login_manager.session_protection = 'strong'

    @self.login_manager.user_loader
    def load_user(user_id):
      print(user_id)
      return User(user_id)

  #Function to check if a user is authenticated.
  # returns True or False
  def is_loggedin(self):
    return fl.current_user.is_authenticated

  #only for debug purposes!
  def do_debug_login(self):
    user = User('user_id')
    fl.login_user(user, remember=True, duration=datetime.timedelta(seconds=7200)) 

代码在run.py中使用如下:

usrmgmr = login.usrmgmr(app)
@app.before_request
def before_every_request():
  #check if for this endpoint a login is required.
  #if yes, and the user is not logged in, force the login method.
  #else we can just move on. Also the user probably is logged in then.
  if msec.needs_login(page_security):
    print(usrmgmr.is_loggedin())
    if usrmgmr.is_loggedin() == False:
       usrmgmr.do_debug_login()

因此,对于每个请求,我们都会检查用户是否需要登录才能查看端点,然后检查用户是否已登录。

奇怪的是,有时候我会变成'真',有时我会变'假'。所以这似乎不太一致。奇怪的是,当调用/ ngin / api / v2 / ...时它似乎永远不会返回True,但是当调用statick文件时,它确实有效。

有谁知道如何解决这个问题,或者这种行为的原因是什么?

1 个答案:

答案 0 :(得分:1)

我在Heroku上面对Flask的同样问题。 在Procfile上添加-preload 的修复方法 网站:gunicorn app:app --preload

相关问题