如何在 api 路由处理程序中共享 flask-pymongo 实例
How to share a flask-pymongo instance in the api routes handler
我正在尝试使用 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 实现中访问数据库实例:
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
很长一段时间以来,我一直在努力解决这个问题,因为我不认为这是一个结构性决定的愚蠢行为,但我可能错了。
哪些方式,无论是结构上的还是导入上的,都可以帮助解决这个问题?
提前致谢!
有无数种方法可以构建您的 Flask 应用程序以实现轻松的资源共享。然而,我赞成将资源绑定到一个公共包,通常是应用程序包,这样其他模块就可以从该包中导入资源。
假设我们有一个名为 demo 的虚构项目,其结构如下:
.
├── api
│ ├── __init__.py
│ └── namespace1.py
└── demo
├── __init__.py
├── main.py
└── setup.py
请注意, 我们将 api 作为自己的包分开。
这里简单介绍一下各个模块的内容。
demo/__init__.py
db = None # initials package level name to None.
demo/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.
demo/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。
我正在尝试使用 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 实现中访问数据库实例:
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
很长一段时间以来,我一直在努力解决这个问题,因为我不认为这是一个结构性决定的愚蠢行为,但我可能错了。 哪些方式,无论是结构上的还是导入上的,都可以帮助解决这个问题?
提前致谢!
有无数种方法可以构建您的 Flask 应用程序以实现轻松的资源共享。然而,我赞成将资源绑定到一个公共包,通常是应用程序包,这样其他模块就可以从该包中导入资源。
假设我们有一个名为 demo 的虚构项目,其结构如下:
.
├── api
│ ├── __init__.py
│ └── namespace1.py
└── demo
├── __init__.py
├── main.py
└── setup.py
请注意, 我们将 api 作为自己的包分开。
这里简单介绍一下各个模块的内容。
demo/__init__.py
db = None # initials package level name to None.
demo/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.
demo/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。