Django с CherryPy — ошибки ModuleNotFound

Я нашел суть, которая реально позволила бы мне интегрировать веб-сервер CherryPy в мою программу и запустить проект Django через этот веб-сервер CherryPy. Однако у меня возникли некоторые трудности с тем, чтобы заставить эту вещь работать должным образом.

Вот класс в моем коде по существу, в основном без изменений

class ClientThread(object):
    HOST = "127.0.0.1"
    PORT = int("3852")
    DIR = "/home/user/project/"
    STATIC_ROOT = DIR + '/clientFiles/static/'

    def mount_static(self, url, root):
        """
        :param url: Relative url
        :param root: Path to static files root
        """
        config = {
            'tools.staticdir.on': True,
            'tools.staticdir.dir': root,
            'tools.expires.on': True,
            'tools.expires.secs': 86400
        }
        cherrypy.tree.mount(None, url, {'/': config})

    def run(self):
        cherrypy.config.update({
            'server.socket_host': self.HOST,
            'server.socket_port': self.PORT,
            'engine.autoreload_on': False,
            'log.screen': True
        })

        self.mount_static(settings.STATIC_URL, self.STATIC_ROOT)

        cherrypy.tree.graft(WSGIHandler())
        cherrypy.engine.start()
        print("[Info]: Client started. Use http://{0}:{1} to access the WebApp.".format(self.HOST,self.PORT))
        cherrypy.engine.block()

    def init(self):
        print("[Info]: Starting Client WebApp...")
        cThread = Thread(target=self.run)
        cThread.start()

Весь этот класс инициируется через ClientThread().init()

Первые несколько строк в верхней части моего приложения (по порядку):

import os
from threading import Timer
os.environ["DJANGO_SETTINGS_MODULE"] = "clientFiles.settings"
import django
django.setup()
import cherrypy
from django.conf import settings
from django.core.handlers.wsgi import WSGIHandler

Мой проект выложен следующим образом:

.
├── clientFiles
│   ├── clientFiles
│   │   ├── asgi.py
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   │   ├── __init__.cpython-37.pyc
│   │   │   └── settings.cpython-37.pyc
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   ├── __init__.py
│   ├── manage.py
│   ├── __pycache__
│   │   └── __init__.cpython-37.pyc
│   └── static
├── main.py

Я инициировал свой проект Django в корневом каталоге с помощью django-admin startproject clientFiles.

Когда я пытаюсь запустить свою программу, я получаю:

Traceback (most recent call last):
  File "main.py", line 26, in <module>
    django.setup()
  File "/usr/local/lib/python3.7/dist-packages/django/__init__.py", line 19, in setup
configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
  File "/usr/local/lib/python3.7/dist-packages/django/conf/__init__.py", line 83, in __getattr__
self._setup(name)
  File "/usr/local/lib/python3.7/dist-packages/django/conf/__init__.py", line 70, in _setup
self._wrapped = Settings(settings_module)
  File "/usr/local/lib/python3.7/dist-packages/django/conf/__init__.py", line 177, in __init__
mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/usr/lib/python3.7/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 'clientFiles.settings'

Похоже, это проблема с загрузкой модуля, верно?

Поэтому я попытался изменить os.environ["DJANGO_SETTINGS_MODULE"] = "clientFiles.settings" на os.environ["DJANGO_SETTINGS_MODULE"] = "clientFiles.clientFiles.settings", потому что мои URL-адреса Django находятся в clientFiles/clientFiles.

После этого запуск моего приложения указывает на то, что CherryPy запускается без проблем:

[24/Dec/2020:04:37:14] ENGINE Bus STARTING
[24/Dec/2020:04:37:14] ENGINE Started monitor thread 'Autoreloader'.
[24/Dec/2020:04:37:14] ENGINE Serving on http://127.0.0.1:3852
[24/Dec/2020:04:37:14] ENGINE Bus STARTED
[Info]: Client started. Use http://127.0.0.1:3852 to access the WebApp.

Но при попытке зайти на сайт по адресу http://127.0.0.1:3852 получаю:

ModuleNotFoundError at /

No module named 'clientFiles.urls'

Request Method:     GET
Request URL:    http://127.0.0.1:3852/
Django Version:     3.1.4
Exception Type:     ModuleNotFoundError
Exception Value:    

No module named 'clientFiles.urls'

Exception Location:     <frozen importlib._bootstrap>, line 965, in _find_and_load_unlocked
Python Executable:  /usr/bin/python3
Python Version:     3.7.3
Python Path:    

['/home/user/project',
 '/usr/lib/python37.zip',
 '/usr/lib/python3.7',
 '/usr/lib/python3.7/lib-dynload',
 '/home/user/.local/lib/python3.7/site-packages',
 '/usr/local/lib/python3.7/dist-packages',
 '/usr/lib/python3/dist-packages']

Server time:    Thu, 24 Dec 2020 04:38:14 +0000

И в консоли получаю:

> Internal Server Error: /
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/dist-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/usr/local/lib/python3.7/dist-packages/django/core/handlers/base.py", line 165, in _get_response
    callback, callback_args, callback_kwargs = self.resolve_request(request)
  File "/usr/local/lib/python3.7/dist-packages/django/core/handlers/base.py", line 288, in resolve_request
    resolver_match = resolver.resolve(request.path_info)
  File "/usr/local/lib/python3.7/dist-packages/django/urls/resolvers.py", line 545, in resolve
for pattern in self.url_patterns:
  File "/usr/local/lib/python3.7/dist-packages/django/utils/functional.py", line 48, in __get__
res = instance.__dict__[self.name] = self.func(instance)
  File "/usr/local/lib/python3.7/dist-packages/django/urls/resolvers.py", line 589, in url_patterns
patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/usr/local/lib/python3.7/dist-packages/django/utils/functional.py", line 48, in __get__
res = instance.__dict__[self.name] = self.func(instance)
  File "/usr/local/lib/python3.7/dist-packages/django/urls/resolvers.py", line 582, in urlconf_module
    return import_module(self.urlconf_name)
  File "/usr/lib/python3.7/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 'clientFiles.urls'

Итак, возможно, проблема со структурой каталогов....

Я перемещаю содержимое clientFiles/clientFiles в clientFiles, поэтому у меня есть это:

.
├── clientFiles
│   ├── asgi.py
│   ├── __init__.py
│   ├── manage.py
│   ├── __pycache__
│   │   ├── __init__.cpython-37.pyc
│   │   └── settings.cpython-37.pyc
│   ├── settings.py
│   ├── static
│   ├── urls.py
│   └── wsgi.py
├── main.py

Ага! Успех запуска. Я вижу страницу «Добро пожаловать в Django».

НО, когда я пытаюсь создать новое приложение для входа в систему или что-то в этом роде...

python3 manage.py startapp login

В каталоге clientFiles у меня теперь есть

.
├── asgi.py
├── __init__.py
├── login
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
├── __pycache__
│   ├── __init__.cpython-37.pyc
│   ├── settings.cpython-37.pyc
│   └── urls.cpython-37.pyc
├── settings.py
├── static
├── urls.py
└── wsgi.py

И просто следуйте инструкциям здесь: https://docs.djangoproject.com/en/3.1/intro/tutorial01/

Я создал представление, создал urls.py в приложении входа и вставил следующее в clientFiles/urls.py:

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('login/', include('login.urls')),
    path('admin/', admin.site.urls),
]

Запускаю программу... запустилась нормально. Но когда я пытаюсь просмотреть что-либо на моем http://127.0.0.1:3852, я получаю

ModuleNotFoundError at /

No module named 'login'

Request Method:     GET
Request URL:    http://127.0.0.1:3852/
Django Version:     3.1.4
Exception Type:     ModuleNotFoundError
Exception Value:    

No module named 'login'

Exception Location:     <frozen importlib._bootstrap>, line 965, in _find_and_load_unlocked
Python Executable:  /usr/bin/python3
Python Version:     3.7.3
Python Path:    

['/home/user/project',
 '/usr/lib/python37.zip',
 '/usr/lib/python3.7',
 '/usr/lib/python3.7/lib-dynload',
 '/home/user/.local/lib/python3.7/site-packages',
 '/usr/local/lib/python3.7/dist-packages',
 '/usr/lib/python3/dist-packages']

Server time:    Thu, 24 Dec 2020 04:55:22 +0000

И вот где я застрял. Я пробовал изменять пути влево и вправо, структуру каталогов, добавлять дополнительные монтирования для CherryPy для новых каталогов... Я в недоумении.

Если у вас есть какие-либо идеи, которые были бы очень признательны... или, возможно, есть другой способ, которым я могу интегрировать веб-сервер в свое приложение, способное обслуживать динамический и статический контент через django или, возможно, Laravel?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
186
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это было довольно просто решить. Я просто воссоздал корень своего приложения в проекте Django, а затем скопировал в проект свой файл main.py. Сделанный!

Другие вопросы по теме