2017-03-01 13 views
0

この質問の私の目的は私のAPIを保護することです。Python/Flask - flask_httpauthとflask_restlessを使用

私のアプリケーションでは、PersonオブジェクトにFlaskとflask_restlessAPIManagerを使用して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}) 

私はそれが応答しないためにapimanager@auth.login_requiredを使用する方法を見つけ出すことができませんでした匿名の要求には、私はプリプロセッサについてのドキュメントを読みましたが、@auth.login_requiredデコレータで使用する方法も見つけられませんでした。

ご協力いただきますようお願い申し上げます。

答えて

1

残念ながら、Flask-Restlessは現在、管理しているルートにビューデコレータを接続することを公式にはサポートしていません。この機能を追加するにはopen issueがあり、具体的にはFlask-HTTPAuthのサポートを要求するanother issueもあります。

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_requiredget_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

私はそれを理解しました。明らかに、フラスコは、クラス名の接尾辞として文字sを追加するので、 'Person' APIの登録された関数は' personsapi0.personsapi'と呼ばれます。あなたの答えにこれを加えて、問題を解決してくれてありがとう、ありがとう。 –

+0

'' model_route = '{0} sapi0。{0} sapi'.format(model .__ name __。lower()) ' –

1

Flask-Securityをお勧めします。 APIインターフェイスのセキュリティを使用する方法については、tutorialがあります。

+0

私はそれが最高のソリューションだと思います。ありがとうございます。 –

関連する問題