如何将umongo的对象文档模型与主web应用程序分开,或者如何避免在定义文档模型的位置调用@instance.register?

2024-04-28 11:28:46 发布

您现在位置:Python中文网/ 问答频道 /正文

在使用Flask或FastAPI创建web应用程序时,会有一个基本上实例化并运行所有内容的main.py文件。我认为这也是数据库连接和初始化的正确位置。因此,理想情况下,我希望有一个单独的model.py文件,基本上只有对象文档映射定义,没有其他内容

在乌蒙戈有可能做这样的事情吗

我的意思是我们需要在每个对象文档映射类上面调用@instance.register。但是如果它在一个单独的文件中,并且数据库没有在那里初始化,那么在该文件中就没有实例。实例将在main.py文件中声明

例如,当您使用Tortoise时,它允许您将整个model.py文件作为模块传递,并使用FastAPI注册它,如下所示-

register_tortoise(
    app,
    db_url=os.environ.get("DATABASE_URL"),
    modules={"models": ["models.model"]}, #model -> model.py which has all the class definitions
    generate_schemas=True
)

对于演示,您可以将以下内容作为model.py文件内容-

from umongo import Document
from umongo.fields import StringField, URLField, DateTimeField
from datetime import datetime

class WebData(Document):
    url = URLField()
    summary = StringField()
    created_at = DateTimeField(missing=datetime.now)

    def __str__(self):
        return self.url

以及以下使用FastAPI的main.py文件-

from fastapi import FastAPI
from pymongo import MongoClient
from umongo import Instance

#db = MongoClient().test
#instance = Instance(db)

app = FastAPI()

@app.get('/ping')
async def pong():
    return {'ping': 'pong'}


if __name__ == "__main__":
    import uvicorn
    uvicorn.run("app.main:app", host="0.0.0.0", port=8000, reload=True)

Tags: 文件实例frompyimport数据库appurl
1条回答
网友
1楼 · 发布于 2024-04-28 11:28:46

您可以在导入时实例化该实例,但在app init时将DB连接传递给它

普通的.py

from umongo.frameworks import PyMongoInstance


instance = PyMongoInstance()

model.py

from umongo import Document

from .common import instance


@instance.register
class MyDocument(Document)

init.py

from .common import .instance
import .model


def create_app():
    database = MongoClient().test
    instance.init(database)
    ...

(注意:在umongo 3 beta中,instance.init被重命名为instance.set_db。)

相关问题 更多 >