简体   繁体   English

如何在Flask-Restful API中访问api.url_for

[英]How to access api.url_for in big Flask-Restful API

I'm working on a Restful API using Flask-Restful with more resources than I'd like to keep in my app.py. 我正在使用Flask-Restful开发一个Restful API,它提供了比我想保留在app.py中更多的资源。 So I've applied the suggested project structure . 因此,我已经采用了建议的项目结构 Now I'd like to access api.url_for() from a resource to generate some links, but it seems I'd have to from app import api to do that. 现在,我想从资源访问api.url_for()来生成一些链接,但是看来我必须from app import api来做到这一点。

To avoid circular imports, my current solution is to do a lazy import. 为了避免循环导入,我目前的解决方案是进行惰性导入。 But there has be a better way, right? 但是有更好的方法吧?

app.py : 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 respectively): 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

You can move your imports down , to below the api = Api(app) line: 您可以将导入向下移动到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>')

Now the api name has been defined and you can safely import from app import api in your resources modules: 现在已经定义了api名称,您可以在resources模块中from app import api安全地导入:

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

See the Larger Applications pattern in the Flask documentation. 请参阅Flask文档中的“ 较大的应用程序”模式

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM