cyl*_*n86 6 python python-import python-3.x fastapi
我是 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: int):
config = get_setting()
return 'Import Ok'
Run Code Online (Sandbox Code Playgroud)
这是配置文件
from pydantic import BaseSettings
class Settings(BaseSettings):
param_folder: str = "param"
result_folder: str = "output"
class Config:
env_prefix = "APP_"
Run Code Online (Sandbox Code Playgroud)
然后运行uvicorn app.main:app --reload我得到:ERROR: Error loading ASGI app. Could not import module "app.main".
我猜是因为一种循环导入。但我不知道如何将我的配置传递到我的路由器?
感谢您的帮助 :)
如何直接在config.py.
from functools import lru_cache
from pydantic import BaseSettings
class Settings(BaseSettings):
admin_email: str = "admin@example.com"
param_folder: str = "param"
result_folder: str = "output"
class Config:
env_prefix = "APP_"
@lru_cache()
def get_setting():
return Settings()
Run Code Online (Sandbox Code Playgroud)
和my_router.py
from fastapi import APIRouter, Depends
from ..config import Settings, get_setting
router = APIRouter()
@router.get('/test')
def get_param_list(config: Settings = Depends(get_setting)):
return config
Run Code Online (Sandbox Code Playgroud)
和test.py
from fastapi.testclient import TestClient
from . import config, main
client = TestClient(main.app)
def get_settings_override():
return config.Settings(admin_email="testing_admin@example.com")
main.app.dependency_overrides[config.get_settings] = get_settings_override
def test_app():
response = client.get("/r/test")
data = response.json()
assert data == config.Settings(admin_email="testing_admin@example.com")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10861 次 |
| 最近记录: |