Django Keyerror на сервере запуска до многих перезапусков

Надеюсь, вы сможете мне помочь, у меня есть проект с Django 2.2.25 и docker, но внезапно появляется эта ошибка:

Exception in thread django-main-thread:

Traceback (most recent call last):

  File "/usr/local/lib/python3.8/threading.py", line 932, in _bootstrap_inner

    self.run()

  File "/usr/local/lib/python3.8/threading.py", line 870, in run

    self._target(*self._args, **self._kwargs)

  File "/usr/local/lib/python3.8/site-packages/django/utils/autoreload.py", line 54, in wrapper

    fn(*args, **kwargs)

  File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/runserver.py", line 117, in inner_run

    self.check(display_num_errors=True)

  File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 387, in check

    all_issues = self._run_checks(

  File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 377, in _run_checks

    return checks.run_checks(**kwargs)

  File "/usr/local/lib/python3.8/site-packages/django/core/checks/registry.py", line 72, in run_checks

    new_errors = check(app_configs=app_configs)

  File "/usr/local/lib/python3.8/site-packages/debug_toolbar/apps.py", line 37, in check_middleware

    if is_middleware_class(GZipMiddleware, middleware):

  File "/usr/local/lib/python3.8/site-packages/debug_toolbar/apps.py", line 81, in is_middleware_class

    middleware_cls = import_string(middleware_path)

  File "/usr/local/lib/python3.8/site-packages/django/utils/module_loading.py", line 17, in import_string

    module = import_module(module_path)

  File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module

    return _bootstrap._gcd_import(name[level:], package, level)

  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import

  File "<frozen importlib._bootstrap>", line 991, in _find_and_load

  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked

  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked

  File "<frozen importlib._bootstrap_external>", line 843, in exec_module

  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed

  File "/app/shared/middleware.py", line 8, in <module>

    from shared.exceptions import JsonNotFound

  File "<frozen importlib._bootstrap>", line 991, in _find_and_load

  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked

  File "<frozen importlib._bootstrap>", line 682, in _load_unlocked

KeyError: 'shared.exceptions'

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

Это исключения.py внутри общего приложения:

class JsonNotFound(Exception):
    def __init__(self):
        Exception.__init__(self, "Record not found")

Все файлы __init__.py находятся там, где должны быть.

Также если я отредактирую middleware.py, добавив дополнительную строку, сервер не перезагружается, как будто файл не загружен.

Это MIDDLEWARE:

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
    "shared.middleware.ExceptionMiddleware",
    "models_logging.middleware.LoggingStackMiddleware",
]

и это middleware.py

from django.utils import timezone
from shared.exceptions import JsonNotFound
from shared.mixins import render_to_json_response

class ExceptionMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        return self.get_response(request)

    def process_exception(self, request, exception):
        if type(exception) == JsonNotFound:
            now = format(timezone.now(), "U")
            kwargs = {}
            response = {
                "status": "404",
                "message": "Record not found",
                "timestamp": now,
            }
            return render_to_json_response(response, status=404, **kwargs)
        return None

У кого-нибудь есть подсказки, как это исправить?

Я не уверен на 100%, что это правильный ответ, но я считаю, что проблема была в файлах pycache, приложение внутри docker не регенерировало файлы pycache, поэтому я обновил свой Dockerfile, чтобы избежать создания этих файлов с помощью env PYTHONDONTWRITEBYTECODE на 1, вот так:

FROM python:3.8
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN mkdir /app
WORKDIR /app
COPY ./requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
ADD . /app

RUN apt-get clean && apt-get update && apt install -y netcat

COPY ./docker/development/entrypoint.sh /docker-entrypoint.sh
RUN chmod +x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]

До сих пор ошибка больше не появляется.

Вернуться на верх