Как получить доступ к api.url_for в большом API Flask-Restful

Я работаю над Restful API, используя Flask-Restful с большим количеством ресурсов, чем я хотел бы сохранить в своем app.py. Поэтому я применил предложенную структуру проекта. Теперь я хочу получить доступ к api.url_for( ) из ресурса, чтобы сгенерировать несколько ссылок, но, похоже, мне придется from app import api сделать это.

Чтобы избежать кругового импорта, мое текущее решение — сделать ленивый импорт. Но должен же быть лучший способ, верно?

app.py:

from flask import Flask
from flask_restful import Api
from myapi.resources.foo import Foo
from myapi.resources.bar import Bar
from myapi.resources.baz import Baz

app = Flask(__name__)
api = Api(app)

api.add_resource(Foo, '/Foo', '/Foo/<str:id>')
api.add_resource(Bar, '/Bar', '/Bar/<str:id>')
api.add_resource(Baz, '/Baz', '/Baz/<str:id>')

resource/foo.py (bar.py соответственно):

from flask_restful import Resource
from bar import Bar

class Foo(Resource):
    def get(self):
        from app import api
        related = api.url_for(Bar, foo=self.id)
        return {'Foo':self.id, 'related_bar':related}, 200

    def post(self):
        pass

person Jonathan    schedule 22.05.2015    source источник


Ответы (1)


Вы можете переместить импорт вниз ниже строки api = Api(app):

from flask import Flask
from flask_restful import Api

app = Flask(__name__)
api = Api(app)

from myapi.resources.foo import Foo
from myapi.resources.bar import Bar
from myapi.resources.baz import Baz

api.add_resource(Foo, '/Foo', '/Foo/<str:id>')
api.add_resource(Bar, '/Bar', '/Bar/<str:id>')
api.add_resource(Baz, '/Baz', '/Baz/<str:id>')

Теперь имя api определено, и вы можете безопасно импортировать from app import api в свои resources модули:

from flask_restful import Resource
from app import api
from bar import Bar

class Foo(Resource):
    def get(self):
        related = api.url_for(Bar, foo=self.id)
        return {'Foo':self.id, 'related_bar':related}, 200

    def post(self):
        pass

См. шаблон Большие приложения в документации Flask. .

person Martijn Pieters    schedule 22.05.2015