首页 > 解决方案 > 带有 JsonResponse 的 django cookie 切割器中的 CRITICAL WORKER TIMEOUT

问题描述

我有以下日志

$ docker logs 1e5e704507c2
PostgreSQL is available

2198 static files copied to '/app/staticfiles', 6582 post-processed.
[2020-08-05 17:46:12 +0000] [10] [INFO] Starting gunicorn 20.0.0
[2020-08-05 17:46:12 +0000] [10] [INFO] Listening at: http://0.0.0.0:5000 (10)
[2020-08-05 17:46:12 +0000] [10] [INFO] Using worker: sync
[2020-08-05 17:46:12 +0000] [17] [INFO] Booting worker with pid: 17
[2020-08-05 17:46:12 +0000] [18] [INFO] Booting worker with pid: 18
[2020-08-05 17:46:12 +0000] [19] [INFO] Booting worker with pid: 19
[2020-08-05 17:46:12 +0000] [20] [INFO] Booting worker with pid: 20
INFO 2020-08-05 17:48:21,763 views 18 140288548957512 meeting_approve:
[2020-08-05 17:48:51 +0000] [10] [CRITICAL] WORKER TIMEOUT (pid:18)
[2020-08-05 17:48:51 +0000] [18] [INFO] Worker exiting (pid: 18)
[2020-08-05 17:48:52 +0000] [21] [INFO] Booting worker with pid: 21
INFO 2020-08-05 17:52:06,252 views 17 140288548957512 meeting_approve:
[2020-08-05 17:52:36 +0000] [10] [CRITICAL] WORKER TIMEOUT (pid:17)
[2020-08-05 17:52:36 +0000] [17] [INFO] Worker exiting (pid: 17)
[2020-08-05 17:52:36 +0000] [22] [INFO] Booting worker with pid: 22

这是我的观点

# views.py
def approve(request, pk):
    logger.info("meeting_approve:")
    try:
        logger.info("approve: query company api")
        r = requests.get(
            f"{foo}/bar",
            timeout=5,
        )
    except Timeout:
        messages.add_message(
            request, messages.WARNING, "Cannot connect to company api."
        )
        logger.warn(f"meeting_approve: Cannot connect to company api")
        return JsonResponse({"error": "Cannot connect to company api"}, status=500)
    logger.info(f"meeting_approve: check security {pk}")
    meeting = Meeting.objects.get(id=pk)
    logger.info(f"meeting_approve: check if blocked {meeting.company}")

为什么我的 JsonResponse 超时?

标签: djangogunicorn

解决方案


问题似乎是任何 5xx 状态都会使服务器超时。这可能是因为 api 试图通过电子邮件向管理员发送堆栈跟踪,而电子邮件未在服务器上配置。

解决方法是不使用 5xx 状态。

return JsonResponse({"error": "Cannot connect to company api"}, status=404)

推荐阅读