python fastapi tips

集成prometheus

from prometheus_fastapi_instrumentator import Instrumentator

instrumentator = Instrumentator()
instrumentator.instrument(app)

@app.on_event("startup")
async def _startup():
    instrumentator.expose(app,endpoint="/healthz/metrics",tags=["healthz"])

过滤health check 日志

import logging

class EndpointFilter(logging.Filter):
    def filter(self, record: logging.LogRecord) -> bool:
        return record.getMessage().find("/healthz") == -1
logging.getLogger("uvicorn.access").addFilter(EndpointFilter())

sqlmodel自定义postgres schema

from sqlmodel import SQLModel, Field

class Item(SQLModel, table=True):
    __table_args__ = {'schema': 'myschema'}

sqlmodel自定义postgres 列名

from sqlmodel import SQLModel, Field

class Item(SQLModel, table=True):
       id: int | None = Field(default=None, primary_key=True,sa_column_kwargs={"name": "myId"})

fastapi docker ci

bitbucket pipeline里需要先cd到根目录

FROM python:3.13 AS base
WORKDIR /app
EXPOSE 80

COPY ./requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir --upgrade -r  /app/requirements.txt

COPY ./app /app/app

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]

部署到k8s swagger报错

ingress带path导致, 设置root_path,增加一个环境变量ROOT_PATH,本地设为空,其它环境则设为域名后面的path

app = FastAPI(
    docs_url="/swagger",
    root_path= settings.ROOT_PATH
)
posted @ 2025-03-20 16:55  马行空的博客  阅读(17)  评论(0)    收藏  举报