Python FastAPI 在 PyCharm 中以调试模式运行并在 Docker 上运行,但在运行时不运行

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

我目前使用 PyCharm 开发的 API 有一些奇怪的行为。 我已经使用 Python FastAPI 成功开发了许多 REST-API。但这一次,我的应用程序遇到了一些非常奇怪的行为。

为了在本地进行测试,我在 main.py 脚本中添加了以下行,这对于我开发过的所有其他应用程序都适用:

if __name__ == "__main__":
    logger.info("starting server with dev configuration")
    uvicorn.run(app, host="127.0.0.1", port=5000)

当我在第

uvicorn.run(...)
行设置断点时,代码就会运行,然后从那里恢复。

当我构建 docker 映像,然后使用以下 dockerfile 在 docker 上运行它时,代码也会运行:

FROM python:3.10-slim

...

EXPOSE 80

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

但是当我正常运行时,uvicorn 似乎无法启动,因为没有像我期望的那样记录消息:

INFO:     Started server process [6828]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:5000 (Press CTRL+C to quit)

在添加 Azure 应用程序洞察处理程序后出现问题。

应用洞察的配置:

import logging

from fastapi import Request
from opencensus.ext.azure.trace_exporter import AzureExporter
from opencensus.trace import attributes_helper, samplers
from opencensus.trace.span import SpanKind
from opencensus.trace.tracer import Tracer
from starlette.types import ASGIApp

HTTP_HOST = attributes_helper.COMMON_ATTRIBUTES["HTTP_HOST"]
HTTP_METHOD = attributes_helper.COMMON_ATTRIBUTES["HTTP_METHOD"]
HTTP_PATH = attributes_helper.COMMON_ATTRIBUTES["HTTP_PATH"]
HTTP_ROUTE = attributes_helper.COMMON_ATTRIBUTES["HTTP_ROUTE"]
HTTP_URL = attributes_helper.COMMON_ATTRIBUTES["HTTP_URL"]
HTTP_STATUS_CODE = attributes_helper.COMMON_ATTRIBUTES["HTTP_STATUS_CODE"]
STACKTRACE = attributes_helper.COMMON_ATTRIBUTES["STACKTRACE"]

_logger = logging.getLogger(__name__)


class AzureApplicationInsightsMiddleware:
    def __init__(self, app: ASGIApp, azure_exporter: AzureExporter) -> None:
        self._app = app
        self._sampler = samplers.AlwaysOnSampler()
        self._exporter = azure_exporter

    async def __call__(self, request: Request, call_next):
        tracer = Tracer(exporter=self._exporter, sampler=self._sampler)
        with tracer.span("main") as span:
            span.span_kind = SpanKind.SERVER

            response = await call_next(request)
            # does not seem to return a response

            span.name = "[{}]{}".format(request.method, request.url)
            tracer.add_attribute_to_current_span(HTTP_HOST, request.url.hostname)
            tracer.add_attribute_to_current_span(HTTP_METHOD, request.method)
            tracer.add_attribute_to_current_span(HTTP_PATH, request.url.path)
            tracer.add_attribute_to_current_span(HTTP_URL, str(request.url))
            try:
                tracer.add_attribute_to_current_span(HTTP_STATUS_CODE, response.status_code)
            except Exception:
                tracer.add_attribute_to_current_span(HTTP_STATUS_CODE, "500")
        return response

添加为中间件:

from fastapi import FastAPI
from opencensus.ext.azure.trace_exporter import AzureExporter

from app.startup.middleware.application_insights import AzureApplicationInsightsMiddleware
from app.startup.middleware.cors import add_cors
from config import app_config


def create_middleware(app: FastAPI) -> FastAPI:
    if app_config.appinsights_instrumentation_key is not None:
        azure_exporter = AzureExporter(connection_string=app_config.appinsights_instrumentation_key)
        app.middleware("http")(AzureApplicationInsightsMiddleware(app=app, azure_exporter=azure_exporter))
    app = add_cors(app)
    return app

向记录器添加处理程序:

import logging
import sys
from logging import StreamHandler

from opencensus.ext.azure.log_exporter import AzureLogHandler

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

formatter = logging.Formatter(fmt="%(asctime)s %(levelname)-8s %(name)-15s %(message)s",
                              datefmt="%Y-%m-%d %H:%M:%S")

handler = StreamHandler(stream=sys.stdout)
handler.setLevel(logging.DEBUG)
handler.setFormatter(formatter)
logger.addHandler(handler)

handler = AzureLogHandler(connection_string=connection_string)
handler.setLevel(logging.INFO)
handler.setFormatter(formatter)
logger.addHandler(handler)

我使用标准模板,它适用于我的所有其他应用程序,但这次显然不适用于。我想知道,我在

requirements.txt
中使用的某些已安装模块可能存在问题:

fastapi
uvicorn
azure-servicebus
pymongo[srv]
pandas
numpy
jinja2
svgwrite
matplotlib

有人遇到同样的问题吗?

将主机更改为

localhost
--> uvicorn 服务器仍未启动

python pycharm fastapi uvicorn
1个回答
0
投票

如果你是Windows用户,请尝试使用wsl路径,因为它对我有帮助

例如

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