2

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

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

先感谢您!

4

1 回答 1

3

有无数种方法可以构建您的烧瓶应用程序以便于资源共享。然而,我倾向于将资源绑定到一个公共包,通常是应用程序包,以便其他模块可以从该包中导入资源。

假设我们有一个名为 demo 的虚构项目,其结构如下:

.
├── api
│   ├── __init__.py
│   └── namespace1.py
└── demo
    ├── __init__.py
    ├── main.py
    └── setup.py

请注意,我们将 api 单独作为其自己的包。

这里简单介绍一下各个模块的内容。

演示/__init__.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/命名空间1.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

您可以在此处查看完整的示例

于 2018-01-20T19:53:40.020 回答