1

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

在我的应用程序中,我使用 Flask 和flask_restless'sAPIManager为我的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来不让它响应匿名请求,我在文档中阅读了一些关于预处理器的内容,但也找不到将它与@auth.login_required装饰器一起使用的方法。

任何帮助将不胜感激。

4

2 回答 2

2

不幸的是,Flask-Restless 目前似乎不支持将视图装饰器附加到它管理的路由上。添加此功能有一个未解决的问题,还有另一个问题专门要求支持 Flask-HTTPAuth。

还有第三个问题,其中用户展示了在 Flask-Restless 创建其端点之后手动注入装饰器的技术。该用户示例中添加get_cache装饰器的片段如下:

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 = '{0}api0.{0}api'.format(model.__name__.lower())
    app.view_functions[model_route] = get_cache(app.view_functions[model_route])

在您的情况下,您将替换get_cacheauth.login_required.

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

于 2017-03-02T16:01:52.160 回答
1

我建议你使用Flask-Security. 有一个关于如何使用它来保护您的 API 接口的教程。

于 2017-03-01T16:45:15.947 回答