如何在api路由处理程序中共享flask-pymongo实例

时间:2018-01-18 15:08:34

标签: python flask flask-restplus flask-pymongo

我正在尝试使用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

我一直在努力解决这个问题很长一段时间,因为我不认为这是一个结构性决定的愚蠢,但我可能错了。 哪种方式,无论是结构方式还是进口方式都可以帮助解决这个问题?

提前谢谢!

1 个答案:

答案 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