Тайм-аут django при доступе к конкретному экземпляру объекта - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь устранить производственную проблему, когда django останавливается при доступе к конкретному экземпляру модели, но не к другим экземплярам того же класса.

Моя производственная среда - Heroku, использующая gunicorn с postgres в качестве базы данных.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 

Конкретный URL, к которому я обращаюсь, просто отображает экземпляр модели через класс generic.DetailView (упрощенный для краткости):

class DetailView(generic.DetailView):
    model = MyModel
    template_name = 'detail_view.html'

В моей производственной базе данных всего несколько десятков записей (все еще новый сайт), поэтому, насколько я могу судить, я не перегружаю сервер.

На этомТочка, я даже не уверен, куда идти, чтобы выяснить, что на самом деле идет не так.Время ожидания сервера истекает КАЖДЫЙ раз, когда я обращаюсь к одному конкретному экземпляру MyModel , но отлично работает для любого другого экземпляра.

1 Ответ

0 голосов
/ 15 июля 2019

Это заняло у меня некоторое время, но я загнал основную причину в бесконечный цикл в моем коде.При определенных условиях я непреднамеренно вызывал бесконечный цикл в вспомогательной функции, которую использовал для вычисления и отображения цены на свою вещь.

плохой код:

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

Урок дня: ВСЕГДА проверяйте ваш ввод!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...