0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: python, django, debug, uwsgi, mule, python callable</p>
1
<p>Теги: python, django, debug, uwsgi, mule, python callable</p>
2
<p>Представим следующую ситуацию: вы разрабатываете большой и сложный проект на Django, который с самого начала "прибит гвоздями" к PostgreSQL, скажем, из-за того, что заказчик требует присутствия в продукте фич, которые уникальны для этого сервера баз данных (например, производительный полнотекстовый поиск или хранение геолокационных данных).</p>
2
<p>Представим следующую ситуацию: вы разрабатываете большой и сложный проект на Django, который с самого начала "прибит гвоздями" к PostgreSQL, скажем, из-за того, что заказчик требует присутствия в продукте фич, которые уникальны для этого сервера баз данных (например, производительный полнотекстовый поиск или хранение геолокационных данных).</p>
3
<p>Крутить у себя на компьютере PostgreSQL со всеми его базами данных - не самый удобный вариант, поэтому вы с самого старта ведёте разработку с использованием Docker и docker-compose. И тут встаёт проблема с отладочной версией приложения. Нет, прокинуть в контейнер переменную окружения DEBUG - это дело нехитрое, но очень хочется, чтобы при разработке<strong>изменения в коде тут же отражались в запущенном контейнере</strong>- т. н. авторелоад, но что именно и как релоадить при такой конфигурации - непонятно.</p>
3
<p>Крутить у себя на компьютере PostgreSQL со всеми его базами данных - не самый удобный вариант, поэтому вы с самого старта ведёте разработку с использованием Docker и docker-compose. И тут встаёт проблема с отладочной версией приложения. Нет, прокинуть в контейнер переменную окружения DEBUG - это дело нехитрое, но очень хочется, чтобы при разработке<strong>изменения в коде тут же отражались в запущенном контейнере</strong>- т. н. авторелоад, но что именно и как релоадить при такой конфигурации - непонятно.</p>
4
<p>Я для себя решил эту проблему с помощью сервера веб-приложений<strong>uWSGI</strong>, часто используемого в развёртывании Django. У uWSGI есть возможность, помимо запуска основного веб-приложения, с помощью конфигурационной опции<strong>mule</strong>запускать произвольный<strong>Python callable</strong>, который может выполнять любые фоновые задачи.</p>
4
<p>Я для себя решил эту проблему с помощью сервера веб-приложений<strong>uWSGI</strong>, часто используемого в развёртывании Django. У uWSGI есть возможность, помимо запуска основного веб-приложения, с помощью конфигурационной опции<strong>mule</strong>запускать произвольный<strong>Python callable</strong>, который может выполнять любые фоновые задачи.</p>
5
<p>Итак, в конфиге uWSGI пишем:</p>
5
<p>Итак, в конфиге uWSGI пишем:</p>
6
mule=project.wsgi:reloader<p>А в файл wsgi.py Django-проекта добавляем следующий код:</p>
6
mule=project.wsgi:reloader<p>А в файл wsgi.py Django-проекта добавляем следующий код:</p>
7
# ... import django from django.utils import autoreload import uwsgi def reloader(): if django.conf.settings.DEBUG: print('Starting debug reloader') while True: if autoreload.inotify_code_changed(): uwsgi.reload() # ...<p>Этот код "дружит" механизм обнаружения изменений в исходниках Django-проекта с механизмом перезапуска uWSGI. Остаётся только прокинуть внутрь контейнера с Django volume с кодом и наслаждаться автоматическим перезапуском веб-приложения в контейнере!</p>
7
# ... import django from django.utils import autoreload import uwsgi def reloader(): if django.conf.settings.DEBUG: print('Starting debug reloader') while True: if autoreload.inotify_code_changed(): uwsgi.reload() # ...<p>Этот код "дружит" механизм обнаружения изменений в исходниках Django-проекта с механизмом перезапуска uWSGI. Остаётся только прокинуть внутрь контейнера с Django volume с кодом и наслаждаться автоматическим перезапуском веб-приложения в контейнере!</p>
8
8