从不同地方运行命令时,Pydantic BaseSettings 找不到 .env

问题描述 投票:0回答:1

所以,我尝试使用 FastAPI 设置 Alembic,但 Pydantic 的 BaseSettings 出现问题,我收到验证错误(未找到变量),因为它找不到 .env 文件(?)

可以通过将

env_file = ".env"
env_file = "../.env"
中的
BaseSettings
更改为
class Config
来解决,但这会在运行 main.py 时发生错误,我尝试使用
env_file = os.path.abspath("../../.env")
将其设置为绝对路径,但这不起作用.

我该怎么办?

配置.py:

import os
from functools import lru_cache

from pydantic_settings import BaseSettings

abs_path_env = os.path.abspath("../../.env")


class Settings(BaseSettings):
    APP_NAME: str = "AppName"
    SQLALCHEMY_URL: str
    ENVIRONMENT: str

    class Config:
        env_file = ".env"  # Works with uvicorn run command from my-app/project/
        # env_file = "../.env"  Works with alembic command from my-app/alembic
        # env_file = abs_path_env

@lru_cache()
def get_settings():
    return Settings()

项目文件夹:

my-app
├── alembic
│   ├── versions
│   ├── alembic.ini
│   ├── env.py
│   ├── README
│   └── script.py.mako
├── project
│   ├── core
│   │   ├── __init__.py
│   │   └── config.py
│   └── __init__.py
├── __init__.py
├── .env
└── main.py
python fastapi pydantic alembic
1个回答
0
投票

pydantic 2.4.2

这对我有用:

config.py

from pydantic_settings import BaseSettings, SettingsConfigDict
from dotenv import find_dotenv, load_dotenv

load_dotenv(find_dotenv(".env"))

class Config(BaseSettings):
    ...
    
    model_config = SettingsConfigDict(case_sensitive=True)

我必须将

python-dotenv
load_env
find_dotenv
结合起来。

.env
文件位于
config.py
的父目录中。

© www.soinside.com 2019 - 2024. All rights reserved.