16

モバイル プラットフォームに使用されている Flask で API を作成していますが、Web コンテンツをレンダリングするために、アプリケーション自体が API を消化することも必要です。Flask 内の API リソース メソッドにアクセスする最善の方法は何だろうか? たとえば、次のクラスをリソースとして追加したとします。

class FooAPI(Resource):
    def __init__(self):
        # Do some things
        super(FooAPI, self).__init__()
    def post(self, id):
        #return something
    def get(self):
        #return something

api = Api(app)
api.add_resource(FooAPI, '/api/foo', endpoint = 'foo')

次に、コントローラーで次のようにします。

@app.route("/bar")
def bar():
   #Get return value from post() in FooAPI

FooAPI から post() の戻り値を取得するにはどうすればよいですか? api変数を介して何とかできますか?または、コントローラーで FooAPI のインスタンスを作成する必要がありますか? これを行うには、私が理解していない簡単な方法が必要なようです...

4

3 に答える 3

1

私はこれを達成することができました.APIが醜くなることがあります.私の場合、アプリケーションには非常に再帰的な性質(ツリー)があるため、関数を再帰的に呼び出す必要があります. 再帰関数自体は非常に高価であり、再帰的な HTTP リクエストはメモリと CPU の浪費の世界になります。

スニペットは次のとおりです。3 番目の for ループを確認してください。

class IntentAPI(Resource):
    def get(self, id):
        patterns = [pattern.dict() for pattern in Pattern.query.filter(Pattern.intent_id == id)]
        responses = [response.dict() for response in Response.query.filter(Response.intent_id == id)]
        return jsonify ( { 'patterns' : patterns, 'responses' : responses } )

    def delete(self, id):
        for pattern in Pattern.query.filter(Pattern.intent_id == id):
            db.session.delete(pattern)

        for response in Response.query.filter(Response.intent_id == id):
            db.session.delete(response)

        for intent in Intent.query.filter(Intent.context == Intent.query.get(id).set_context):
            self.delete(intent.id) #or IntentAPI.delete(self, intent.id)

        db.session.delete(Intent.query.get(id))
        db.session.commit()
        return jsonify( { 'result': True } )
于 2017-10-04T02:53:35.247 に答える