Python / Flask - 将 flask_restless 与 flask_httpauth 一起使用

Posted

技术标签:

【中文标题】Python / Flask - 将 flask_restless 与 flask_httpauth 一起使用【英文标题】:Python / Flask - Using flask_restless with flask_httpauth 【发布时间】:2017-07-20 20:53:49 【问题描述】:

我在这个问题上的目标是保护我的 API。

在我的应用程序中,我使用 Flask 和 flask_restlessAPIManager 为我的 Person 对象提供 CRUD API。

代码示例:

manager = APIManager(app, flask_sqlalchemy_db=db)
manager.create_api(Person, methods=['GET', 'POST', 'PATCH', 'DELETE'])

并且还使用flask_httpauth 来保护我的其他路线,如下所示:

@app.route('/auth/get-token')
@auth.login_required
def get_auth_token():
    token = g.user.generate_auth_token()
    return jsonify('token': token.decode('ascii'), 'fullname': g.user.fullname)

我无法弄清楚如何将@auth.login_requiredapimanager 一起使用以使其不响应匿名请求,我在文档中阅读了有关预处理器的一些内容,但也找不到将其与@987654329 一起使用的方法@装饰器。

我们将不胜感激。

【问题讨论】:

【参考方案1】:

不幸的是,Flask-Restless 目前似乎不支持将视图装饰器附加到它管理的路由上。有open issue添加这个功能,也有another issue专门要求支持Flask-HTTPAuth。

还有一个third issue,其中用户展示了在 Flask-Restless 创建其端点后手动注入装饰器的技术。该用户示例中添加 get_cache 装饰器的 sn-p 如下:

manager = flask.ext.restless.APIManager(app, flask_sqlalchemy_db=db)
manager.create_api(Person, methods=['GET', 'POST', 'DELETE'])
manager.create_api(Person2, methods=['GET', 'POST', 'DELETE'])

# hackish view decoration:
for model in [Person, Person2]:
    model_route = '0api0.0api'.format(model.__name__.lower())
    app.view_functions[model_route] = get_cache(app.view_functions[model_route])

在您的情况下,您可以将 get_cache 替换为 auth.login_required

更新:正如下面在 cmets 中所讨论的,'0api0.0api' 中的参数是表名,所以上面的代码只有在表名留给 Flask-SQLAlchemy 生成时才有效。如果模型具有自定义表名,则使用该名称而不是 model.__name__.lower()

【讨论】:

非常感谢,我不想烦人,但我遇到了这个错误,不知道出了什么问题:app.view_functions[model_route] = auth.login_required(app.view_functions[model_route]) KeyError: 'personapi0.personapi' 哎呀,我想通了,显然flask添加了字母s作为类名的后缀,所以PersonAPI的注册函数被称为personsapi0.personsapi,希望你把这个添加到您的回答,非常感谢它确实解决了问题。 必须是:model_route = '0sapi0.0sapi'.format(model.__name__.lower()) @MotassemMK 可能是因为您使用的是复数形式的自定义表名吗? ops.. 是的,就是这样【参考方案2】:

我建议您使用Flask-Security。有一个tutorial 介绍如何使用它来保护您的 API 接口。

【讨论】:

以上是关于Python / Flask - 将 flask_restless 与 flask_httpauth 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

python之路_flask框架_框架入门

python基础===将Flask用于实现Mock-server

python自动化自动化测试平台开发:3.flask技术讲解上

python16_day38flask

python3-flask-3将信息写入日志

python自动化自动化测试平台开发:2.flask技术讲解上