我是 fastapi 的新手,到目前为止它确实很棒,但我很难找到一种干净的方法将我的应用程序配置导入到另一个模块中。
编辑:我需要能够在运行单元测试时更改配置
这是我的目录树:
/app
| __init__.py
| /router
| | __init__.py
| | my_router.py
| /test
| | test_api.py
| config.py
| main.py
Run Code Online (Sandbox Code Playgroud)
这是我的main.py文件:
from functools import lru_cache
from fastapi import FastAPI
from .router import my_router
from . import config
app = FastAPI()
app.include_router(
my_router.router,
prefix="/r",
tags=["my-router"],
)
@lru_cache()
def get_setting():
return config.Settings(admin_email="admin@domain.com")
@app.get('/')
def hello():
return 'Hello world'
Run Code Online (Sandbox Code Playgroud)
这里是router.py:
from fastapi import APIRouter
from ..main import get_setting
router = APIRouter()
@router.get('/test')
def get_param_list(user_id: …Run Code Online (Sandbox Code Playgroud) 使用 Pydantic,如何指定输入类型与其实际类型不同的属性?
例如,我有一个systems包含系统列表(因此是字符串列表)的字段,用户可以将此系统列表作为逗号分隔的字符串提供(例如"system1,system2");然后我使用验证器将该字符串拆分为字符串列表。
下面的代码正在执行此操作并且它有效,但类型提示是错误的,因为系统字段实际上是字符串列表,而不是字符串;验证器将原始字符串拆分为字符串列表。
我怎样才能解决这个问题?
import typing
from pydantic import BaseSettings, Field, validator
class Config(BaseSettings):
systems: str = Field([], description="list of systems as a comma separated list (e.g. 'sys1,sys2')")
@validator("systems")
def set_systems(cls, v) -> typing.List[str]:
if v == "":
return []
systems = list(filter(None, v.split(",")))
return systems
if __name__ == "__main__":
c = Config(**{"systems": "foo,bar"})
print(c)
Run Code Online (Sandbox Code Playgroud)