Как сделать ленивую запись для каждого запроса в Django? - PullRequest
1 голос
/ 16 марта 2011

Используя Django, мне нужно сделать запись в журнал для каждого запроса, которая включает запись в базу данных.

Я понимаю хуки промежуточного программного обеспечения Django process_request() и process_response(), но, насколько я могу судить, эти хуки находятся на критическом пути (по замыслу) для отрисовки ответа веб-страницы.

Я бы предпочел, чтобы мои операции записи в базу данных после запроса не задерживали время ответа для страницы.

Существует ли простой шаблон проектирования для Django, который позволяет мне выполнять «ленивую запись в журнал», где я могу использовать перехватчики запросов для сбора информации во время обработки запроса, но никаких последующих операций и фактической операции записи в журнал не происходит пока после того как ответ написан пользователю?

В настоящее время я использую WSGI, но предпочел бы самое общее возможное решение.

1 Ответ

5 голосов
/ 17 марта 2011

Django реализует сигнал request_finished, который срабатывает после того, как обработка ответа завершена, но недостатком является то, что он не позволит вам получить доступ к текущему объекту request, которыйделает его не совсем полезным для регистрации ... Последнее место, где можно подключиться к обработке ответов в django, скорее всего, в самом классе HttpResponse .Вы могли бы, например.временно сохраните данные в request.session и запишите их в базу данных методом close().

Но я думаю, что есть и другие альтернативы, которые вы должны рассмотреть: вы можете использовать что-то вроде Celery обрабатывать ваши задачи журналирования асинхронно.Кроме того, существуют базы данных не-SQL, такие как MongoDB , которые предлагают вам удобные и эффективные функции для ведения журналов, например. вам не нужно ждать, пока изменения действительно будут внесены в базу данных, что может дать вам большое преимущество в производительности.

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