Горячая перезагрузка Django работает только с определенными файлами
У меня есть странная проблема, когда не все правки файлов подхватываются горячим перезагрузчиком для Django.
У меня такая структура:
/
app/ ... apps in here.
config/settings.py
manage.py
Теперь любые изменения в config/settings.py или manage.py будут приводить к перезагрузке сервера django runserver.
Но любые изменения в файлах внутри app/... не вызывают перезагрузку - мне приходится идти и добавлять новую строку в manage.py и сохранять (довольно раздражающе).
Есть идеи, почему это может быть?
Сначала я подумал, что это дело docker, и он подхватывает только файлы в базовом каталоге, но затем изменения в config/settings.py также вызывают перезагрузку, так что очевидно, что он может видеть глубже.
Я не уверен на 100%, в чем проблема, но предлагаю этот ответ с парой вещей, которые вы можете попробовать:
Есть отчеты о том, что Pycharm иногда вызывает проблемы, если он настроен не обновлять временные метки файлов при их сохранении (есть параметр Preserve files timestamps для управления этим), который можно попробовать переключить. Простой способ проверить, в этом ли проблема - попробовать отредактировать файл в другом редакторе (или
.touchфайл) и посмотреть, вызовет ли это перезагрузку - если да, то проблема в PyCharm.Обратите внимание, что стандартное
StatReloaderне будет работать, если временные метки файлов не меняются.Попробуйте установить
pywatchmanи службу Watchman, как упоминается в документации , которая обеспечивает гораздо более эффективный способ отслеживания изменений, чемStatReloader, которая просто опрашивает все файлы на предмет изменений каждую секунду - если это большой проект, то может оказаться, чтоStatReloaderпросто требуется слишком много времени, чтобы заметить изменения.
Вы не опубликовали свои Dockerfile или docker-compose.yml, но Docker проверяет каждый ADD и COPY на предмет изменения файлов и аннулирует кэш для этого и всех последующих шагов, если это произошло. Это может быть вашей проблемой.
Я предлагаю вам следовать этому Django Docker best practices и с Dockerfile похожим на это:
FROM python:3
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
Используйте VOLUME в вашем docker-compose.yml:
services:
...
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
...
По ссылке Django Docker best practices есть все остальные объяснения более подробно.
Я хотел бы поблагодарить всех за попытку помочь мне решить эту загадку, которая не дает мне покоя.
Я решил вернуть оба проекта (старый и новый) назад, чтобы понять, почему старый работает, а новый - нет.
Вот что было по-другому.
Внутри config/init.py на старом проекте существует такая строка:
from __future__ import absolute_import, unicode_literals
Внутри нового проекта это отсутствовало.
Когда я добавляю это, горячая перезагрузка начинает работать для всех файлов внутри app/* ?????
Это работает, но, честно говоря, я понятия не имею, почему это может иметь значение.