Django在runserver上出现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容器服务器后运行良好。有时当我更改文件服务器重新加载,但其他时候抛出相同的错误。

这是exception .py在共享的应用程序:

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

所有的__init__.py文件都在应该在的地方。

如果我编辑middleware.py添加额外的行,服务器不会重新加载,就像文件没有加载一样。

这是中间件:

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"]

直到现在错误没有再显示。

最新更新