我正在尝试解决生产问题,该问题在访问特定模型实例而不是同一类的其他实例时django超时。
我的生产环境是Heroku,使用带有postgres的gunicorn作为数据库。 Heroku在日志中显示以下错误(删除敏感位):
Feb 21 20:26:20 [heroku-app-name] heroku/router: at=error code=H12 desc="Request timeout" method=GET path="[url-path]" host=[my-host] request_id=[request-id] fwd="[fwd-stuff]" dyno=web.1 connect=0ms service=30000ms status=503 bytes=0 protocol=http
Feb 21 20:26:21 [heroku-app-name] app/web.1: [2019-02-22 04:26:21 +0000] [4] [CRITICAL] WORKER TIMEOUT (pid:14)
Feb 21 20:26:21 [heroku-app-name] app/web.1: [2019-02-22 04:26:21 +0000] [14] [INFO] Worker exiting (pid: 14)
Feb 21 20:26:21 [heroku-app-name] app/web.1: [2019-02-22 04:26:21 +0000] [20] [INFO] Booting worker with pid: 20
我要访问的特定网址只是通过generic.DetailView类(为简便起见而简化)显示模型实例:
class DetailView(generic.DetailView):
model = MyModel
template_name = 'detail_view.html'
我的生产数据库只有几十个条目(仍然是一个新站点),据我所知,我实际上并没有使服务器不知所措。
在这一点上,我什至不知道要去哪里才能弄清楚实际出了什么问题。每当我访问 MyModel 的一个特定实例时,服务器都会超时,但对于其他所有实例都可以正常工作。
答案 0 :(得分:0)
花了我一段时间,但我将根本原因归结为代码中的无限循环。在特定条件下,我无意间导致了我用来计算和显示商品价格的辅助函数中发生无限循环。
错误代码:
def my_cost_format(number, decimal_places=2, decimal="."):
result = intcomma(number)
result += decimal if decimal not in result else ""
while len(result.split(decimal)[1]) != decimal_places:
result += "0"
return result
好的代码:
def my_cost_format(number, decimal_places=2, decimal="."):
result = intcomma(round(number, decimal_places))
result += decimal if decimal not in result else ""
while len(result.split(decimal)[1]) != decimal_places:
result += "0"
return result
每日课程:始终验证您的输入!