проблемы с инициализацией tortoise orm с помощью fastapi

У меня проблема с черепахой и фастапи

у меня есть следующий код от app.py; я пропустил несколько строк, чтобы сделать это кратким

app.py

from fastapi import FastAPI, HTTPException
from app.models import User_Pydantic, UserIn_Pydantic, Users
from app.utils import cryptoUtil
from app.auth import auth as auth_router
from tortoise.contrib.fastapi import HTTPNotFoundError, register_tortoise


app = FastAPI()

@app.post("/users", response_model=User_Pydantic)
async def create_user(user: UserIn_Pydantic):
    user.password = cryptoUtil.hash_password(user.password)
    user_obj = Users(email=user.email, password=user.password, fullname=user.fullname, status=user.status)
    await user_obj.save()

    return await User_Pydantic.from_tortoise_orm(user_obj)




register_tortoise(
    app,
    db_url=config.DATABASE_URL,
    modules={"models": ["app.models"]},
    generate_schemas=True,
    add_exception_handlers=True,
)


app.include_router(auth_router.router, tags=["Auth"])

if __name__ == '__main__':
    app.run()

это отлично работает и может создавать пользователей

но теперь я пытаюсь сделать то же самое из другого файла

auth.py

from fastapi import APIRouter, Depends, HTTPException
from app.auth import crud
from app.utils import cryptoUtil
from app.models import User_Pydantic, UserIn_Pydantic, Users


router = APIRouter()


@router.post("/auth/register", response_model=User_Pydantic)
async def register(user: UserIn_Pydantic):
    result = await crud.find_exist_user(user.email)
    
    if result:
        raise HTTPException(status_code=404, detail="user already exists!")
    
    user.password = cryptoUtil.hash_password(user.password)
    user_obj = Users(email=user.email, password=user.password, fullname=user.fullname, status=user.status)
    await user_obj.save()

    return await User_Pydantic.from_tortoise_orm(user_obj)

но это не работает, и я получаю это в ответе об ошибке 404

{
  "detail": "Object does not exist"
}

я думаю, проблема в том, что from_tortoise_orm(user_obj) в

return await User_Pydantic.from_tortoise_orm(user_obj)

не может работать в auth.py файле, потому что по какой-то причине я не могу запустить его за пределами app.py файла, в котором инициализируется черепаха

что мне делать, чтобы это исправить? часть проблемы, с которой я сталкиваюсь, заключается в том, как вызвать инициализацию черепахи извне app.py, где существует register_tortoise

ОБНОВЛЕНИЯ:

структура папок

├── app
│   ├── app.py
│   ├── models.py
│   ├── config.py
│   │
│   ├── auth
│   │   ├── auth.py
│   │   ├── crud.py
│   │      
│   └── utils
│       ├── cryptoUtil.py
│       

person uberrebu    schedule 22.03.2021    source источник
comment
Если вы не показываете также структуру папок, предполагается, что все находится в одной папке (что, я думаю, нет). Кроме того, я думаю, вам не хватает Tortoise.init_models (models_list, models) перед register_tortoise   -  person lsabi    schedule 22.03.2021
comment
я добавил структуру папок ... у меня нет этого Tortoise.init_models(models_list, "models") в моем коде ... где мне это добавить? а в чем польза?   -  person uberrebu    schedule 22.03.2021


Ответы (1)


Как я уже сказал в комментариях, вам нужно вставить

Tortoise.init_models(models_list, "models")

перед следующей строкой

register_tortoise(
    app,
    db_url=config.DATABASE_URL,
    modules={"models": ["app.models"]},
    generate_schemas=True,
    add_exception_handlers=True,
)

Конечно, вам придется изменить папку и имя модели в соответствии с вашей конфигурацией.

Вначале это тоже было проблемой для меня, но следующая проблема с github решила проблему

https://github.com/tortoise/tortoise-orm/issues/444

Также в документации дается объяснение

https://tortoise-orm.readthedocs.io/en/latest/search.html?q=early%20init

ОБНОВЛЕНИЕ

Tortoise.init_models(models_list, "models")

models_list - это список (строки) путей рассматриваемых моделей. В вашем случае это будет app.models.

Идея состоит в том, чтобы инициализировать и начать подготовку моделей перед подключением к базе данных. Это шаг, необходимый для того, чтобы сделать отношения доступными в пидантических моделях.

Здесь документы API

https://tortoise-orm.readthedocs.io/en/latest/setup.html?highlight=init#tortoise.Tortoise.init_models

person lsabi    schedule 22.03.2021
comment
Не могли бы вы объяснить, что делает эта строка Tortoise.init_models(models_list, "models")? также я получаю эту ошибку, когда добавляю ее в app.py файл, вот ошибка, которую я получаю File "/usr/src/app/app/app.py", line 73, in <module> Tortoise.init_models(models_list, "models") NameError: name 'models_list' is not defined - person uberrebu; 22.03.2021
comment
даже после прочтения этого tortoise-orm.readthedocs.io/ ru / latest / я до сих пор не знаю, что это за 2 параметра .. второй, я полагаю, это имя файла модели, поэтому для меня это будет models, но первый параметр - загадка - person uberrebu; 22.03.2021
comment
больше нет помощи ??? - person uberrebu; 24.03.2021
comment
Я обновил ответ. Думал, вы получили уведомление - person lsabi; 24.03.2021
comment
не получил уведомление ... так оно и должно быть? Tortoise.init_models(["app.models"], "models") - person uberrebu; 24.03.2021
comment
да. Он инициализирует модели черепах, объявленные в app.models под общим именем models. Затем при инициализации Tortoise эти модели будут использоваться ормом. Это должно сработать, так как я не тестировал ваш код, нелегко сказать - person lsabi; 24.03.2021
comment
по-прежнему не работает .. мне нужно добавить Tortoise.init_models(["app.models"], "models") в auth.py файл? потому что помните, что это тот же точный код для создания пользователя в app.py, но тот, что в auth.py, не работает ... и тот же код ... все еще появляется сообщение об ошибке `деталь: объект не существует` - person uberrebu; 24.03.2021
comment
Нет, достаточно вставить Tortoise.init_models ([app.models], models) перед регистрацией черепахи. Укажите в вопросе информацию о вашей ошибке. Вы получаете общую ошибку, которая также возвращается клиенту без раскрытия важной информации. - person lsabi; 24.03.2021
comment
ошибка трассировки TRACE:uvicorn.asgi:10.10.19.7:45086 - ASGI [4] Completed TRACE: 10.10.19.7:45086 - Connection lost TRACE:uvicorn.error:10.10.19.7:45086 - Connection lost - person uberrebu; 24.03.2021
comment
Я понятия не имею, что это. Можете ли вы контекстуализировать это в своем ответе и предоставить полную трассировку ошибок? Из того, что написано, единственное, что я могу сказать, это то, что ваш сервер вышел из строя, но не знаю, какой именно - person lsabi; 24.03.2021
comment
то есть от включения регистрации ошибок трассировки для uvicorn, как мне получить полную ошибку трассировки, которую вы хотите? также это то, что возвращается, когда я делаю запрос POST, имеющий проблемы с auth.py - person uberrebu; 24.03.2021
comment
Что вы видите на терминале. Это результат команды python - person lsabi; 24.03.2021
comment
приложение dockerized, и я включил ведение журнала трассировки от uvicorn, и я только что отправил вам, какую ошибку я получаю в терминале ... он возвращает это каждый раз, когда запрос POSt не выполняется вместе с общим сообщением об ошибке, которое я отправил изначально ... так что ничего не отображается много - person uberrebu; 25.03.2021
comment
Тогда не подключайте его и не вводите через ssh и не запускайте команду вручную. В противном случае я не могу помочь - person lsabi; 25.03.2021