flask-login有时候会莫名地出现无限重定向问题。
- 确认 user_load 回调函数一定要正确
- 如果都感觉没什么问题,那么问题有可能出现在login_user()函数上面。
postman调试可以正常返回结果,但是浏览器不行。
那么有可能是刚刚login就马上过期了,令remember为True就行了。但是这里在本质上是让浏览器保存了长时间保持cookie,相当于关闭了浏览器之后依然可以登录。
login_user(user, remember=True)
还有一个就是初始化顺序问题。
正确的初始化顺序:
login_manager.init_app(app)
db.init_app(app) # db is SQLAlchemy()
2022.9.19更新
确认了,这就是一个flask-login的bug,尤其是在使用next参数的时候会莫名出现问题。建议使用flask原生的session来进行登录状态,可以自定义很多字段,session其实就是一个存储会话数据的字典,用来进行一系列操作完全没有问题,原生的flask确实好用。
再次吐槽!!不要使用flask-login!!!真的没有必要!原生的session想要啥就有啥,不必担心库出错。在这里我提供下面的两个我自己项目里面写的装饰器。
# 登录装饰器
def login_required(func):
@wraps(func)
def wrapper(*args, **kwargs):
if session.get('user_id'):
return func(*args, **kwargs)
else:
raise Unauthorized(description='没有权限访问')
return wrapper
# 实名认证装饰器
def verify_required(func):
@wraps(func)
def wrapper(*args, **kwargs):
if session.get('is_verified'):
return func(*args, **kwargs)
else:
raise Unauthorized(description='没有权限访问')
return wrapper
基于python的装饰器,那么就可以根据session字段进行相对应的操作,非常的灵活。并且可以在视图函数里面直接调用session,就像一个字典一样。