我正在尝试使用flask,flask-restplus和flask-pymongo设计一个简单的api,但是我面对一个结构设计,基于导入和变量共享,我无法以任何方式访问数据库
这是我的主引擎文件中的代码:
app = Flask(__name__)
db = PyMongo(app)
api = Api(app)
from auth import namespace as ns1
api.add_namespace(registerNamespace.api)
if __name__ == '__main__':
api.run()
但与此同时,我想在实际的api实现中访问db实例:
from engine import engine
api = Namespace('register', description="Registration")
db = engine.db
@api.route('/whatever')
Class Whatever():
def get(self):
db.doSomething();
return "Simple getter"
我收到以下错误。
ImportError: cannot import name engine
我一直在努力解决这个问题很长一段时间,因为我不认为这是一个结构性决定的愚蠢,但我可能错了。 哪种方式,无论是结构方式还是进口方式都可以帮助解决这个问题?
提前谢谢!
答案 0 :(得分:2)
有许多方法可以构建您的烧瓶应用程序,以便轻松共享资源。但是我喜欢将资源绑定到通常的应用程序包,以便其他模块可以从该包中导入资源。
假设我们有一个名为demo的虚构项目,其结构如下:
.
├── api
│ ├── __init__.py
│ └── namespace1.py
└── demo
├── __init__.py
├── main.py
└── setup.py
请注意我们将api作为自己的包分开。
以下是单个模块内容的简要说明。
<强>演示/ __初始化__。PY 强>
db = None # initials package level name to None.
<强>演示/ setup.py 强>
from flask import Flask
from flask_pymongo import PyMongo
import demo
app = Flask('demo')
demo.db = PyMongo(app) # Here is where we bind the shared resource to the package level name.
<强>演示/ main.py 强>
from demo.setup import app
from api import register_api
register_api(app)
if __name__ == '__main__':
app.run()
我们的API可以轻松地从demo
导入:
<强> API / namespace1.py 强>
from flask_restplus import Namespace, Resource, fields
from demo import db # Look ma!, it's easy to share resources.
...
@ns.route('/')
class CatList(Resource):
@ns.doc('list_cats')
@ns.marshal_list_with(cat)
def get(self):
'''List all cats'''
print(db)
return CATS
您可以查看complete sample here。