Django 热重载仅适用于某些文件

Django hot reload only working on certain files

我遇到了一个奇怪的问题,即并非所有文件编辑都被 Django 的热重载程序拾取。

我有这样的结构:

/
  app/ ... apps in here.
  config/settings.py
  manage.py

现在,对 config/settings.py 或 manage.py 的任何更改都将导致 django 运行服务器重新加载。

但是对 app/... 中文件的任何更改都不会触发重新加载 - 我必须去 manage.py 添加一个换行符并保存(非常烦人)。

知道为什么会这样吗?

起初我以为是docker的东西,它只是在base dir中获取文件,但后来更改为config/settings.py也触发了重新加载,所以很明显可以看得更深

编辑:添加信息

Django 3.2,PyCharm,MacOS - 是的,所有应用程序都在 INSTALLED_APPS

我有另一个项目具有完全相同的结构并且出于某种原因它有效...我真的很困惑。

编辑添加 dc 和 dockerfile

FROM python:3.8-slim

ENV PYTHONUNBUFFERED 1
WORKDIR /app

COPY ./requirements /requirements
ARG pip_requirement_file

RUN apt-get update && apt-get install -y libjpeg62-turbo-dev zlib1g-dev gcc ca-certificates gcc postgresql-client sed xmlsec1 pax-utils && apt-get clean

RUN pip install --no-cache-dir -r /requirements/$pip_requirement_file \
    && find /usr/local \
    \( -type d -a -name test -o -name tests \) \
    -o \( -type f -a -name '*.pyc' -o -name '*.pyo' \) \
    -exec rm -rf '{}' +

# Copy requirements and install local one
RUN rm -rf /requirements

COPY ./compose/django/entrypoint.sh /entrypoint.sh
RUN sed -i 's/\r//' /entrypoint.sh
RUN chmod +x /entrypoint.sh

COPY ./compose/django/start-server.sh /start-server.sh
RUN sed -i 's/\r//' /start-server.sh
RUN chmod +x /start-server.sh

# Very specifically copy the files we want to avoid bloating the image.
COPY ./manage.py /app/

COPY ./app/ /app/app/
COPY ./admin_static/ /app/admin_static/
COPY ./config/ /app/config/
COPY ./database/ /app/database/

ENTRYPOINT ["/entrypoint.sh"]
CMD ["/start-server.sh"]

docker撰写

services:
  django:
    container_name: django
    build:
      context: .
      dockerfile: ./compose/django/Dockerfile
      args:
        pip_requirement_file: local.txt
    depends_on:
      - postgres
    ports:
      - "8000:8000"
    links:
      - postgres:postgres
    volumes:
      - .:/app
    env_file: .env

我不是 100% 确定问题是什么,但是提供这个答案有几个你可以尝试的事情:

  1. reports that Pycharm will sometimes cause problems if it has been configured not to update the timestamps of files when saving them (there is a Preserve files timestamps 设置来控制它)您可以尝试切换。验证这是否是问题的一种简单方法是尝试使用不同的编辑器编辑文件(或 touch 文件)并查看是否触发重新加载 - 如果触发重新加载,则问题是 PyCharm .

    请注意,如果文件时间戳不更改,默认 StatReloader 将不起作用。

  2. 尝试安装 pywatchman 和 Watchman 服务,如前所述 in the documentation,它提供了一种比 StatReloader 简单轮询更有效的方式来监视变化每秒更改所有文件 - 如果它是一个大型项目,可能是 StatReloader 花费太长时间才能发现更改。

感谢大家帮助我解决这个困扰我的难题。

我决定剥离两个项目(旧的和新的),看看为什么旧的有效而新的无效。

这就是不同之处。

在旧项目的 config/init.py 中,存在这一行:

from __future__ import absolute_import, unicode_literals

在新项目中,缺少这个。

当我添加这个时,热重新加载开始对 app/* 中的所有文件起作用?????

这是有效的,但老实说,我不知道为什么会有不同。