2015-05-22 20 views
0

我正在使用Flask-Restful來處理Restful API,其資源比我想要保留在我的app.py中更多。所以我應用了建議的project structure。現在我想從資源訪問api.url_for()來生成一些鏈接,但似乎我不得不from app import api來做到這一點。如何訪問大Flask-Restful API中的api.url_for

爲了避免循環導入,我目前的解決方案是做一個懶導入。但是有更好的方法,對吧?

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.pybar.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 

回答

4

您可以將您的進口,在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名已被定義,你可以放心地在你的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 

Larger Applications pattern的瓶文檔。