相关疑难解决方法(0)

如何在 Python FastAPI 中记录原始 HTTP 请求/响应?

我们正在使用 Python FastAPI 编写一个 Web 服务,该服务将托管在 Kubernetes 中。出于审计目的,我们需要保存特定路由的request/的原始 JSON 正文。JSON的主体大小约为1MB,最好这不应该影响响应时间。我们怎样才能做到这一点?responserequestresponse

python logging audit-logging python-logging fastapi

25
推荐指数
2
解决办法
3万
查看次数

如何获取具有不同结构和不同字段的 JSON 格式的 FastAPI 应用程序控制台日志?

我有一个 FastAPI 应用程序,我希望将默认日志写入 STDOUT,并使用 JSON 格式的以下数据:

应用程序日志应如下所示:

{
 "XYZ": {
   "log": {
     "level": "info",
     "type": "app",
     "timestamp": "2022-01-16T08:30:08.181Z",
     "file": "api/predictor/predict.py",
     "line": 34,
     "threadId": 435454,
     "message": "API Server started on port 8080 (development)"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

访问日志应如下所示:

{
 "XYZ": {
   "log": {
     "level": "info",
     "type": "access",
     "timestamp": "2022-01-16T08:30:08.181Z",
     "message": "GET /app/health 200 6ms"
   },
   "req": {
     "url": "/app/health",
     "headers": {
       "host": "localhost:8080",
       "user-agent": "curl/7.68.0",
       "accept": "*/*"
     },
     "method": "GET",
     "httpVersion": "1.1",
     "originalUrl": "/app/health",
     "query": {}
   },
   "res": {
     "statusCode": 200,
     "body": …
Run Code Online (Sandbox Code Playgroud)

python logging gunicorn fastapi uvicorn

8
推荐指数
1
解决办法
2万
查看次数

如何初始化全局对象或变量并在每个 FastAPI 端点中重用它?

我正在上一堂发送通知的课。初始化时,它涉及到与通知服务器的连接,这非常耗时。我在 FastAPI 中使用后台任务来发送通知,因为我不想因通知而延迟响应。下面是示例代码。

file1.py:
noticlient = NotificationClient()

@app.post("/{data}")
def send_msg(somemsg: str, background_tasks: BackgroundTasks):
    result = add_some_tasks(data, background_tasks, noticlient)
    return result

file2.py:
def add_some_tasks(data, background_tasks: BackgroundTasks, noticlient):
    background_tasks.add_task(noticlient.send, param1, param2)
    result = some_operation
    return result
Run Code Online (Sandbox Code Playgroud)

这里,通知客户端是全局声明的。我可以在file2.pyunder中初始化它add_some_tasks,但每次请求到达时它都会被初始化,这需要一些时间。有什么办法可以使用中间件在每次请求到达时重新使用它,这样就不需要每次都进行初始化。

或方法二:在类 def 中初始化通知

file1.py:
class childFastApi(FastAPI):
    noticlient = NotificationClient()

app = childFastApi()

@app.post("/{data}")
def send_msg(somemsg: str, background_tasks: BackgroundTasks):
    result = add_some_tasks(data, background_tasks, app.noticlient)
    return result
Run Code Online (Sandbox Code Playgroud)

python global-variables background-task starlette fastapi

8
推荐指数
1
解决办法
6145
查看次数

在 Uvicorn/FastAPI 内发出下游 Https 请求的正确方法是什么?

我有一个 API 端点(FastAPI / Uvicorn)。除此之外,它还向另一个 API 请求信息。当我使用多个并发请求加载 API 时,我开始收到以下错误:

h11._util.LocalProtocolError: can't handle event type ConnectionClosed when role=SERVER and state=SEND_RESPONSE
Run Code Online (Sandbox Code Playgroud)

在正常环境中,我会利用request.session,但我知道它不是完全线程安全的。

因此,在 FastAPI 等框架内使用请求的正确方法是什么,其中多个线程将requests同时使用该库?

python python-requests fastapi

5
推荐指数
1
解决办法
4478
查看次数