gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:34:14 24 4
gpt4 key购买 nike

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

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

提前致谢!

最佳答案

有无数种方法可以构建您的 Flask 应用程序以实现轻松的资源共享。然而,我赞成将资源绑定(bind)到一个公共(public)包(通常是应用程序包),这样其他模块就可以从该包导入资源。

假设我们有一个名为 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 .

关于python - 如何在 api 路由处理程序中共享 flask-pymongo 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48324405/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com