Flask Web开发入门(三)之使用 Request Loader 定制登录

在上一章中,我们介绍了使用Flask-Login进行会话管理,实现基本的登入、登出功能,在实际的业务运用中,不仅要求基本的登录登出授权管理,还要求对外暴漏API接口服务,当然暴漏的服务接口不可能随意访问,还需要一定的授权信息,这时,我们需要Request Loader来进行定制登录,简单期间,我们使用HTTP Header中的Authorization作为查询参数的API密钥,只有请求Header中包括Authorization才允许访问

  • 定义API接口如下,使用login_required装饰器授权访问
@app.route('/api', methods=['GET'])
@flask_login.login_required
def api():
    return jsonify({'value': random.random(), 'timestamp': int(time.time())})

  • 使用request_loader的自定义登录
# 使用request_loader的自定义登录, 同时支持url参数和和使用Authorization头部的基础认证的登录:
@login_manager.request_loader
def request_loader(req):
    logger.debug("request_loader url is %s, request args is %s" % (req.url, req.args))
    authorization = request.headers.get('Authorization')
    logger.debug("Authorization is %s" % authorization)
    # 模拟api登录
    if authorization:
        # get user from authorization
        user = User()
        user.id = 'admin'
        logger.debug("user is %s" % user)
        return user
    return None

注意,简单期间,我们仅判断请求Header中是否包含Authorization,实际应用中应校验Authorization信息,并获取用户信息,具体根据实际业务场景处理

  • 我们通过Fiddler模拟请求,没有提供Authorization的请求得到HTTP302信息,要求用户登录认证
    Flask Web开发入门(三)之使用 Request Loader 定制登录_第1张图片

  • 而包含Authorization信息的请求得到了正确的响应报文
    Flask Web开发入门(三)之使用 Request Loader 定制登录_第2张图片

源码参考:https://github.com/ypmc/flask-sqlalchemy-web

你可能感兴趣的:(架构,Python,前端,综合)