请求的登陆校验是个常见的需求,如果使用 Flask 框架,一般会使用 flask-login 这个库,说说使用遇到几点问题
- 怎么全局禁用login检查呢?
flask-login 提供了一个配置项 LOGIN_DISABLED
, 开发和mock的时候有时候有这个需求。
app = Flask(__name__)
app.secret_key = "session secret key. TODO: store it securely"
app.config['LOGIN_DISABLED'] = True
- how to handle
view
andblueprint
login check ?
flask-login 提供了一个 view 级别的 decorator,login_required
, 基本和 django 提供的类似
def login_required(func):
@wraps(func)
def decorated_view(*args, **kwargs):
if request.method in EXEMPT_METHODS:
return func(*args, **kwargs)
elif current_app.login_manager._login_disabled:
return func(*args, **kwargs)
elif not current_user.is_authenticated:
return current_app.login_manager.unauthorized()
return func(*args, **kwargs)
return decorated_view
那么要对 blueprint
做 loing check呢? blueprint 中提供了一个 before_request
的 hook,这里可以利用上
def bp_login_required():
"""
usage:
apibp = Blueprint('api', 'api_bp')
apibp.before_request(bp_login_required)
"""
if current_app.login_manager._login_disabled:
pass
# ajax not 302
elif not current_user.is_authenticated:
if request.is_xhr:
abort(401)
else:
return current_app.login_manager.unauthorized()