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"]
До сих пор ошибка больше не появляется.