2017-03-01 81 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

嗯,我想這是最好的解決方案,謝謝。 –