我刚刚使用 Poetry 创建了一个新的 Python 项目。这很简单,这是我的 pyproject.toml:
[tool.poetry]
name = "my-app"
version = "0.1.0"
description = ""
authors = ["me"]
readme = "README.md"
[tool.poetry.dependencies]
python = "^3.12"
fastapi = "^0.104.1"
supabase = "^2.0.3"
uvicorn = "^0.24.0.post1"
pydantic = {extras = ["dotenv"], version = "^1.10.2"}
[tool.poetry.group.dev.dependencies]
mypy = "^1.5.1"
pre-commit = "^3.5.0"
pytest = "^7.4.3"
pytest-cov = "^4.1.0"
这是我的项目结构:入口点是
web_server.py
。
web_server.py
import uvicorn
from app.config.rest.api import create_fastapi_app
app = create_fastapi_app()
if __name__ == "__main__":
uvicorn.run(app)
api.py
from fastapi import FastAPI
from app.config.rest.endpoints.router import api_router
def create_fastapi_app() -> FastAPI:
app = FastAPI(title="My API")
app.include_router(api_router, prefix="/api")
return app
和
router.py
:
from fastapi import Header, APIRouter, Depends
from app.config.rest.endpoints.meta import router as meta_router
def custom_headers(
user_id: str = Header(examples=["postman"], convert_underscores=False),
):
return
no_headers_router = APIRouter()
headers_router = APIRouter(dependencies=[Depends(custom_headers)])
no_headers_router.include_router(meta_router, tags=["meta"])
api_router = APIRouter()
api_router.include_router(no_headers_router)
api_router.include_router(headers_router)
我可以通过在控制台中运行
poetry run uvicorn --app-dir ./src app.web_server:app --reload
来启动我的 Web 服务器。我还可以使用以下配置从 PyCharm 启动 Web 服务器:
这按预期工作:
如果我调试而不是运行相同的配置,它也可以工作。但是,如果我添加断点(无论在哪里),PyCharm 不会启动 API 并永远挂在那里。端点也无法访问,因为我猜启动过程尚未完成。例如,在
uvicorn.run(app)
中添加断点会导致应用程序永远挂起:
如果调试配置无法启动服务器,我会认为调试配置存在问题,但只有当我在代码中设置任何断点时才会发生这种情况。如果没有断点,配置将按预期启动应用程序。
这里可能发生什么?
尝试将 Python 降级到 3.11,我遇到了同样的问题,对我来说它有帮助。