2017-03-01 24 views
0

我在这个问题上的目标是确保我的API。Python /烧瓶 - 使用flask_restless with flask_httpauth

在我的应用程序中,我正在使用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不作回应对于匿名请求,我在文档中阅读了关于预处理器的一些信息,但也找不到与装饰器使用@auth.login_required的方法。

任何帮助将不胜感激。

回答

1

不幸的是,Flask-Restless目前并没有正式支持将视图装饰器附加到它所管理的路线上。有一个open issue添加此功能,也有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]) 

在你的情况,你会用auth.login_required取代get_cache

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

+0

非常感谢,我不想讨厌,但我得到这个错误,不知道出了什么问题:'app.view_functions [model_route] = auth.login_required(app.view_functions [model_route]) KeyError:'personapi0.personapi'' –

+0

Woops,我弄明白了,显然flask增加了字母s作为类的后缀名,所以'Person' API的注册函数被称为'personsapi0.personsapi',我希望你将此添加到您的答案中,并非常感谢您解决问题。 –

+0

它必须是:'model_route ='{0} sapi0。{0} sapi'.format(model .__ name __。lower())' –

1

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

+0

嗯,我想这是最好的解决方案,谢谢。 –