Python / Flask - 使用 flask_restless 和 flask_httpauth
Python / Flask - Using flask_restless with flask_httpauth
我的objective这个问题是为了保护我的API.
在我的应用程序中,我使用 Flask 和 flask_restless
的 APIManager
为我的 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_required
与 apimanager
一起使用以使其不响应匿名请求,我在文档中阅读了有关预处理器的内容,但也找不到方法与 @auth.login_required
装饰器一起使用。
任何帮助将不胜感激。
我推荐你使用Flask-Security
。 tutorial 关于如何使用它来保护您的 API 界面。
不幸的是,Flask-Restless 目前似乎不正式支持将视图装饰器附加到它管理的路由。有一个 open issue to add this feature, and there is also another issue 专门请求支持 Flask-HTTPAuth。
还有一个 third issue,其中用户展示了在 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_cache
替换为 auth.login_required
。
更新:正如下面评论中所讨论的,'{0}api0.{0}api'
中的参数是 table 名称,因此只有 table 名称留给 Flask 时,以上代码才有效- SQLAlchemy 生成。如果模型有自定义 table 名称,则使用该名称代替 model.__name__.lower()
.
我的objective这个问题是为了保护我的API.
在我的应用程序中,我使用 Flask 和 flask_restless
的 APIManager
为我的 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_required
与 apimanager
一起使用以使其不响应匿名请求,我在文档中阅读了有关预处理器的内容,但也找不到方法与 @auth.login_required
装饰器一起使用。
任何帮助将不胜感激。
我推荐你使用Flask-Security
。 tutorial 关于如何使用它来保护您的 API 界面。
不幸的是,Flask-Restless 目前似乎不正式支持将视图装饰器附加到它管理的路由。有一个 open issue to add this feature, and there is also another issue 专门请求支持 Flask-HTTPAuth。
还有一个 third issue,其中用户展示了在 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_cache
替换为 auth.login_required
。
更新:正如下面评论中所讨论的,'{0}api0.{0}api'
中的参数是 table 名称,因此只有 table 名称留给 Flask 时,以上代码才有效- SQLAlchemy 生成。如果模型有自定义 table 名称,则使用该名称代替 model.__name__.lower()
.