Django - рендеринг HTTP перед подключением к базе данных - PullRequest
0 голосов
/ 11 июля 2019

У меня есть серверный кластер базы данных, который отключается, когда он не используется.Холодные запуски занимают минуту или около того, в течение которых django просто ждет и ожидает отправки объекта http-запроса.

Прежде чем кодировать что-то сложное, я ищу рекомендации для существующей интеграции промежуточного ПО / сигнала, которая могла быпозвольте мне визуализировать промежуточное представление, пока django пытается установить соединение с базой данных (например, если запрос к базе данных занимает больше секунды, вместо этого выполните рендеринг в это представление.)

Ответы [ 2 ]

2 голосов
/ 11 июля 2019

Вы можете создать специальное промежуточное программное обеспечение, которое проверяет подключение к БД при каждом запросе.Имейте в виду, что это будет пытаться создать новое соединение с БД при каждом запросе

from django.db import connection
from django.db.utils import OperationalError
from django.shortcuts import render_to_response

def db_is_up_middleware(get_response):

    def middleware(request):
        try:
            c = connection.cursor()
        except OperationalError:
            return render_to_response('your_template.html')
        else:
            return get_response(request)

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

Частичное решение:

  • Я сократил время ожидания запроса шлюза RESTful до 3 секунд.В конце тайм-аута я возвращаю сообщение об ошибке 504 с хорошим сообщением, которое сообщает пользователю, что сервер перешел в спящий режим, но вскоре он снова загрузится.В ответ text / html «Ошибка 504» я включил метатег обновления, чтобы браузеры автоматически попытались перезагрузить представление.

  • Я снял все вызовы базы данных с открытого доступасайт и поместите их за слой аутентификации.Это означает, что аутентификация будет наиболее вероятным шагом по истечении времени ожидания, и пользователи (я надеюсь), естественно, попытаются повторно пройти аутентификацию после получения ошибки 504. Выше:

  • Я добавил вызов jjery AJAXв document.ready (), чтобы получить случайную запись в базе данных.Время ожидания этого запроса истекло, и ничего не произойдет (как и предполагалось).Это заставляет сервер базы данных сразу начинать загрузку, когда пользователь переходит на общедоступную страницу.

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