如何在 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