当使用烧瓶或FastAPI创建web应用程序时,会有一个基本上实例化并运行所有内容的main.py文件。我认为这也是数据库连接和初始化的合适位置。因此,理想情况下,我希望有一个单独的model.py文件,它基本上只有对象文档映射定义,而没有其他任何内容。
在乌龙戈有可能做这样的事吗?
我的意思是,我们需要在每个对象文档映射类之上调用@instance.register。但是,如果这是在一个单独的文件中,而DB不是在那里初始化的,那么在该文件中就没有实例。实例将在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下面的main.py文件使用FastAPI -
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)发布于 2020-11-18 12:58:19
您可以在导入时实例化实例,但在app init传递它一个DB连接。
common.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。)
https://stackoverflow.com/questions/64879897
复制相似问题