Приложения Django выдают ImportError на Heroku - PullRequest
1 голос
/ 16 октября 2019

Я развертываю приложение Django в Heroku. Это приложение работает локально и было построено как структурный клон django-vue-template . Единственные заметные изменения:

  1. У меня есть больше приложений в моем проекте.
  2. Я не использую пакет настроек с модулями prod / dev, только один модуль.

Структура файла:

Ошибка, которую я получаю в журнале сборки, вызывает ошибку ImportEr 'users', но это не приложение, это приложение, которое является первым приложением Django в моем INSTALLED_APPS.

-----> $ python manage.py collectstatic --noinput

       PYTHONPATH:  .

       BASE_DIR /tmp/build_1803d0c0cef716d3bc64a04ddb7b7ea0/backend

       Traceback (most recent call last):

         File "manage.py", line 15, in <module>

           execute_from_command_line(sys.argv)

         File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line

           utility.execute()

         File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/__init__.py", line 357, in execute

           django.setup()

         File "/app/.heroku/python/lib/python3.6/site-packages/django/__init__.py", line 24, in setup

           apps.populate(settings.INSTALLED_APPS)

         File "/app/.heroku/python/lib/python3.6/site-packages/django/apps/registry.py", line 89, in populate

           app_config = AppConfig.create(entry)

         File "/app/.heroku/python/lib/python3.6/site-packages/django/apps/config.py", line 90, in create

           module = import_module(entry)

         File "/app/.heroku/python/lib/python3.6/importlib/__init__.py", line 126, in import_module

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

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

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

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

       ModuleNotFoundError: No module named 'users'

 !     Error while running '$ python manage.py collectstatic --noinput'.

       See traceback above for details.

       You may need to update application code to resolve this error.

       Or, you can disable collectstatic for this application:

          $ heroku config:set DISABLE_COLLECTSTATIC=1

       https://devcenter.heroku.com/articles/django-assets

 !     Push rejected, failed to compile Python app.

 !     Push failed

Вот мой INSTALLED_APPS в settings.py для справки.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'rest_framework',

    'users',
    'channels',
    'socials',
]

Я не получаю эту ошибку локально, даже при запуске python manage.py collectstatic, поэтому я чувствую, что это связано с моим PYTHONPATH на Heroku, но я сравнил с развертыванием неизмененного django-vue-шаблон & PYTHONPATH выглядит одинаково.

Что я могу сделать вывод:

  • settings.py достигается
  • INSTALLED_APPS в порядкедо фактических приложений Django
  • Это не похоже на прямую структурную ошибку, поскольку не влияет локально, только при подаче wsgi.py

Если есть дополнительная информация, которую стоит поделиться для отладки помощи, пожалуйста, оставьте комментарий, и я добавлю его!


Обновление: я понял, что был немного вложенным, что Heroku не понравилось. backend был просто каталогом, а не пакетом, поэтому я добавил __init__.py, что выявило большую проблему с вложением таким способом. Я изменил свою структуру, чтобы улучшить зеркальную структуру backend в django-vue-template , поэтому моя новая структура выглядит следующим образом, что опять-таки работает локально, но завершается неудачей с ImportError на usersпри развертывании в Heroku.

enter image description here

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Мое решение будет очень нишевым для пользователей, клонирующих django-vue-template, но я поделюсь вместо удаления вопроса.

Проблема в том, что django-vue-template не следуетстандартная структура проекта Django. Вопрос о том, является ли это серьезной проблемой, еще предстоит определить, но я предполагаю, что отход от традиционной структуры был сделан исключительно для улучшения управляемости при совместном использовании Vue & Django.

Несколько замечаний:

  1. manage.py находится в корне проекта, а не в корне проекта Django.
  2. В manage.py мы должны быть уверены, что указываем на модуль явных настроек,В своем проекте они используют пакет с модулями dev / prod соответственно, но для моего я использую один модуль. Этот модуль будет api.settings, а не settings.
  3. Учитывая структуру, Heroku является правильным с точки зрения модуля wsgi. users не существует, но существует api.users, поэтому мои установленные приложения теперь имеют префикс api..
  4. При импорте таких модулей Django, как models, теперь он должен быть api.users.models, поскольку«прорывного» потока этой структуры.

Добавление этих префиксов, чтобы приспособить структурные изменения, исправило это для меня, и в конечном итоге я понимаю, почему они пошли по этому пути, потому что сценарии сборки затем могут быть соединены. Конечно, есть способ сделать этот импорт менее масштабным для масштабируемости, но ради того, чтобы все заработало, это ответ.

0 голосов
/ 16 октября 2019

У меня была такая же проблема для некоторых приложений heroku. Это сработало для меня, запустите следующие команды:

1.отключите сборщик данных во время развертывания

heroku config:set DISABLE_COLLECTSTATIC=1

2.deploy

git push heroku master
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...