Django 2.2 ломает ранее работающие представления / URL - PullRequest
3 голосов
/ 02 апреля 2019

Решил взять Django 2.2 для вращения (проект в настоящее время работает 2.1.8), и теперь я даже не могу запустить сервер. Я поддерживаю этот проект в течение почти двух лет, и это должно быть незначительное обновление.

Ошибка, похоже, связана с моими взглядами, но я не могу найти ничего в заметках о выпуске , которые значительно изменились между 2.1.8 и 2.2. Я подозреваю, что это может быть связано с моей довольно нестандартной view системой. Вместо одного файла с именем views.py я использую папку из view файлов, соединенных __init__.py. Но опять же, это всего лишь предположение.

Watching for file changes with StatReloader
Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Python37\lib\threading.py", line 917, in _bootstrap_inner
    self.run()
  File "C:\Python37\lib\threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Python37\lib\site-packages\django\utils\autoreload.py", line 54, in wrapper
    fn(*args, **kwargs)
  File "C:\Python37\lib\site-packages\django\core\management\commands\runserver.py", line 117, in inner_run
    self.check(display_num_errors=True)
  File "C:\Python37\lib\site-packages\django\core\management\base.py", line 390, in check
    include_deployment_checks=include_deployment_checks,
  File "C:\Python37\lib\site-packages\django\core\management\base.py", line 377, in _run_checks
    return checks.run_checks(**kwargs)
  File "C:\Python37\lib\site-packages\django\core\checks\registry.py", line 72, in run_checks
    new_errors = check(app_configs=app_configs)
  File "C:\Python37\lib\site-packages\django\core\checks\urls.py", line 13, in check_url_config
    return check_resolver(resolver)
  File "C:\Python37\lib\site-packages\django\core\checks\urls.py", line 23, in check_resolver
    return check_method()
  File "C:\Python37\lib\site-packages\django\urls\resolvers.py", line 399, in check
    messages.extend(check_resolver(pattern))
  File "C:\Python37\lib\site-packages\django\core\checks\urls.py", line 23, in check_resolver
    return check_method()
  File "C:\Python37\lib\site-packages\django\urls\resolvers.py", line 400, in check
    messages.extend(self._check_custom_error_handlers())
  File "C:\Python37\lib\site-packages\django\urls\resolvers.py", line 408, in _check_custom_error_handlers
    handler, param_dict = self.resolve_error_handler(status_code)
  File "C:\Python37\lib\site-packages\django\urls\resolvers.py", line 590, in resolve_error_handler
    return get_callable(callback), {}
  File "C:\Python37\lib\site-packages\django\urls\utils.py", line 28, in get_callable
    mod = import_module(mod_name)
  File "C:\Python37\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 965, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'views'

Traceback (most recent call last):
  File "C:/git/si-dash/manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "C:\Python37\lib\site-packages\django\core\management\__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "C:\Python37\lib\site-packages\django\core\management\__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Python37\lib\site-packages\django\core\management\base.py", line 323, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Python37\lib\site-packages\django\core\management\commands\runserver.py", line 60, in execute
    super().execute(*args, **options)
  File "C:\Python37\lib\site-packages\django\core\management\base.py", line 364, in execute
    output = self.handle(*args, **options)
  File "C:\Python37\lib\site-packages\django\core\management\commands\runserver.py", line 95, in handle
    self.run(**options)
  File "C:\Python37\lib\site-packages\django\core\management\commands\runserver.py", line 102, in run
    autoreload.run_with_reloader(self.inner_run, **options)
  File "C:\Python37\lib\site-packages\django\utils\autoreload.py", line 579, in run_with_reloader
    start_django(reloader, main_func, *args, **kwargs)
  File "C:\Python37\lib\site-packages\django\utils\autoreload.py", line 564, in start_django
    reloader.run(django_main_thread)
  File "C:\Python37\lib\site-packages\django\utils\autoreload.py", line 275, in run
    self.run_loop()
  File "C:\Python37\lib\site-packages\django\utils\autoreload.py", line 281, in run_loop
    next(ticker)
  File "C:\Python37\lib\site-packages\django\utils\autoreload.py", line 321, in tick
    state.update(self.loop_files(state, previous_timestamp))
  File "C:\Python37\lib\site-packages\django\utils\autoreload.py", line 328, in loop_files
    for path, mtime in self.snapshot_files():
  File "C:\Python37\lib\site-packages\django\utils\autoreload.py", line 348, in snapshot_files
    for file in self.watched_files():
  File "C:\Python37\lib\site-packages\django\utils\autoreload.py", line 241, in watched_files
    yield from iter_all_python_module_files()
  File "C:\Python37\lib\site-packages\django\utils\autoreload.py", line 103, in iter_all_python_module_files
    return iter_modules_and_files(modules, frozenset(_error_files))
  File "C:\Python37\lib\site-packages\django\utils\autoreload.py", line 128, in iter_modules_and_files
    if not path.exists():
  File "C:\Python37\lib\pathlib.py", line 1339, in exists
    self.stat()
  File "C:\Python37\lib\pathlib.py", line 1161, in stat
    return self._accessor.stat(self)
OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect: '<frozen importlib._bootstrap>'

Опять же, этот макет просмотра работает уже много лет, и я не могу найти ничего, касающегося urls или views, которое изменилось между 2.1.8 и 2.2.

Все, от чего я ухожу, это внезапное ModuleNotFoundError: No module named 'views'

Screenshot of filesystem

Edit: С помощью @Alasdair я справился с этой ошибкой, но до сих пор не знаю, почему это происходит. Проект отлично работает на 2.1.8, и в документации нет ничего относительно изменений в том, как вы ссылаетесь на handler### представления. Кроме того, тот факт, что я получил LookupError: No installed app with label 'admin' и затем волшебным образом исчез после удаления и повторной установки 2.2, не заставляет меня чувствовать себя прекрасно.

Ответы [ 3 ]

2 голосов
/ 03 апреля 2019

Это двухступенчатая задача:

Во-первых, что-то изменилось с тем, как Django разрешает пути к представлениям. В то время как handler404 = 'views.error_404' работал на 2.1.8, более точный путь handler404 = 'apps.dashboard.views.error_404' требуется на 2.2.

Во-вторых, я допустил ошибку при написании своего пользовательского handler404, и новая системная проверка перехватила его перед запуском сервера. handler404 должен быть настроен так, чтобы принимать два аргумента request, exception, тогда как у меня было просто настроено принять request. Возможно, он молча провалился.

Я столкнулся с третьей ошибкой LookupError: No installed app with label 'admin' после того, как изначально исправил путь, но после удаления и переустановки 2.2 я не смог его реплицировать.

Благодаря @Alasdair у нас есть билет , открытый и похоже, что это будет безболезненно исправить в 2.2.1.

Я просто пишу этот ответ, чтобы подвести итог всего вопроса, поскольку оба фантастических ответа, которые были даны ранее, охватывают только одну часть. Спасибо, ребята!

2 голосов
/ 03 апреля 2019

Трассировка показывает, что новая системная проверка _check_custom_error_handlers вызывает ошибку.Это говорит о том, что в вашем urls.py есть недопустимый пользовательский обработчик ошибок, например,

handler404 = 'views.notfound'

Из изображения макета вашего проекта выглядит так, как будто это должно быть что-то вроде:

handler404 = 'apps.dashboard.views.notfound'

Пользовательская проверка обработчика ошибок была добавлена ​​в Django 2.2, поэтому теперь вы получаете уведомление о проблеме при запуске runserver.В прошлом Django пытался загрузить пользовательский обработчик позже, и, похоже, вы не заметили, что он не смог загрузить.

В Django 2.2.1 , естьновая проверка системы, поэтому вы получите более полезное сообщение об ошибке, когда пользовательский обработчик ошибок не может быть импортирован.

1 голос
/ 03 апреля 2019

Кажется, причиной является custom error handlers.

В Django 2.1 У меня был собственный обработчик для ошибки 500 Error, такой как:

def error_500_view(request, exception):
    return render(request,'500.html')

Но в Django 2.2 кажется, что обработчик 500 Error принимает только 1 аргумент, поэтому я изменил на:

def error_500_view(request):
    return render(request,'500.html')

И все снова работает нормально.

Так что убедитесь, что ваш обработчик 404 Error выглядит примерно так:

def notfound(request, exception):
    return render(request,'400.html')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...