Django,在 YouStable 主机上找不到设置模块

问题描述 投票:0回答:1

我一直在共享托管平台(YouStable)上部署 django 网站。 在我最近的尝试中,我收到了 500 服务器错误页面,因为它找不到设置文件。

背景

我之前确实成功部署了一个有效的网站。 当我遇到问题时,我删除了它,因为我选择了与保留字冲突的应用程序名称,而且我还发现我可以 pip 安装 Bootstrap Web 框架(尽管我需要先解决这个问题)。 从那以后我在创建新网站时遇到了问题。 当托管服务器尝试从连接到先前站点的虚拟环境运行代码时(该站点和 venv 已被删除),我报告了一个问题。托管支持技术人员已经解决了这个问题。

我做了什么。

部署过程涉及在 CPanel 的“Setup Python app”中创建一个 Python“app”:选择Python版本(我选择3.11),选择名称(‘myapp’),选择域名并保存应用程序。 这将使用我的用户名(‘用户名’)、应用程序名称和 Python 版本创建一个虚拟环境(或 venv)。 对我来说:

/home/username/virtualenv/appname/3.11/

CPanel 然后显示代码以选择并激活此 venv 以在 CPanel 的终端部分中使用。 我切换到终端,激活 venv,pip 安装 Django 并使用 django-admin startproject …创建站点(“mysite”)。 然后我在项目中找到了 wsgi.py 文件并将该位置保存在 CPanel 设置 Python 应用程序中

(/mysite/site/wsgi.py)

CPanel 确认它可以找到设置文件。如果没有任何进一步的更改,这应该会生成调试主页(火箭已打开)。但是我收到了 500 服务器错误页面和错误日志。

stderr.log 错误日志显示服务器经历了两次相同的周期,其中之一如下所示。在一个周期的大部分时间里,它使用来自正确 venv 的代码,但也有一些例外;一次它尝试使用 imp.py 加载乘客_wsgi.py (它不应该,因为我已经告诉它 wsgi.py 文件在哪里),一次使用 importlib.py 无法找到设置文件。两次都使用

/opt/alt/python311/lib64/python3.11

而不是我的 venv 并失败了。

当我提出支持票时,有人建议我咨询我的开发人员(呃,就是我)。 我的问题是

从我的 venv 到 /opt/alt... 的交换是错误的原因吗?

我还能做些什么来解决这个问题吗?

或者我需要回去支持,因为这是他们的问题?

预先感谢您对此提供的任何帮助。

stderr.log内容如下:

stderr.log (ASCII text)


Traceback (most recent call last):
  File "/home/username/appname/passenger_wsgi.py", line 8, in <module>
    wsgi = imp.load_source('wsgi', 'mysite/mysite/wsgi.py')
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/alt/python311/lib64/python3.11/imp.py", line 172, in load_source
    module = _load(spec)
             ^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 721, in _load
  File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 940, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "mysite/mysite/wsgi.py", line 16, in <module>
    application = get_wsgi_application()
                  ^^^^^^^^^^^^^^^^^^^^^^
  File "/home/username/virtualenv/appname/3.11/lib/python3.11/site-packages/django/core/wsgi.py", line 12, in get_wsgi_application
      django.setup(set_prefix=False)
  File "/home/username/virtualenv/appname/3.11/lib/python3.11/site-packages/django/__init__.py", line 19, in setup
     configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
                      ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/username/virtualenv/appname/3.11/lib/python3.11/site-packages/django/conf/__init__.py", line 89, in __getattr__
  self._setup(name)
  File "/home/username/virtualenv/appname/3.11/lib/python3.11/site-packages/django/conf/__init__.py", line 76, in _setup
    self._wrapped = Settings(settings_module)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/username/virtualenv/appname/3.11/lib/python3.11/site-packages/django/conf/__init__.py", line 190, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/alt/python311/lib64/python3.11/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1204, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1176, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1140, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'mysite.settings'
[UID:1295][2353167] Child process with pid: 2353179 was killed by signal: 15, core dumped: no
python-3.x django settings missing-data hosted
1个回答
0
投票

Q1 问题似乎来自服务器的乘客和Django文件系统之间的接口

Q2 是的。我更改了他们的 Passenger.py 文件,我的网站现在可以运行了。大多数步骤如下。

Q3 我确实回去支持,但没有收到任何有用的答案。

在“Cpanel”、“Domains”、“Domains”对话框中注册域。

CPanel's Domain Add a Domain dialogue

转到 Cpanel、软件、设置 Python 应用程序,然后单击创建应用程序

CPanel's Setup Python App Dialogue

在“设置Python应用程序”中选择Python版本、应用程序名称(“myapp”)和域名并保存。

(我选择了 python 3.10,因为它是推荐的并且适合 Django 5.0.3 - 撰写本文时的最新版本)

Put in python version, app name and domain into Setup Python App

服务器将为您的应用程序(“myapp”)创建一个文件夹,其中包含一个用于启动您的应用程序的 Passenger.py 文件,并在其 Virtualenv 文件夹中创建一个同名的虚拟环境。 它提供了激活 venv 并在创建应用程序后生成的对话框中移动到应用程序文件夹的代码。只需单击即可复制。

Python app created dialogue

在此示例中,代码为

source /home/username/virtualenv/myapp/3.10/bin/activate && cd /home/username/myapp

在 Cpanel、高级、终端中,此代码将激活 venv 并将您带到应用程序的顶部。 注意:在基于网络的终端上使用 ctrl + shift + v 粘贴

(您可以将文件上传到应用程序)

python -m pip install Django

完成后将显示 Django 版本

简化的文件结构如下所示:

  • myapp/
    
    • passenger.py
      
    • myproject/
      
    •   manage.py
      
    •   myproject/
      
    •     settings.py
      
    •     urls.py
      
    •     wsgi.py
      

修改 urls.py 为网站提供一些可显示的内容

# myproject/urls.py
from django.contrib import admin
from django.urls import path
from django.views import debug

urlpatterns = [
path('', debug.default_urlconf),
path('admin/', admin.site.urls),
]

在设置文件中将域名添加到允许的主机列表中。

ALLOWED_HOSTS = ['mysite.com']

最后 Django 创建了一个 wsgi.py 文件,我用它来修改他们的 Passenger.py。

# passenger.py
import os
import sys
from django.core.wsgi import get_wsgi_application
# Change myproject to the name of your project

# sys.path holds a list of directories that the python interpreter
# will search for a required module
# The following works out the directories to search 
# in your python app and Django project

# Get the directory path of this passenger file - myapp
this_path = os.path.dirname(os.path.abspath(__file__))
# Only add this if it's not in the list
if this_path not in sys.path:  
    sys.path.insert(0, this_path)

# Work out the directory of the Settings file
settings_path = os.path.join(this_path, 'myproject', 'myproject')
if settings_path not in sys.path:  # Only add this if ...
    sys.path.insert(1, settings_path)

# Work out the directory path of the top of the project
project_path = os.path.join(this_path, 'myproject')
if project_path not in sys.path:  # Only add this if ...
    sys.path.insert(2, project_path)

# The last lines are taken from the wsgi.py file created by Django
# Set the settings module environment variable
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_project.settings')

# Passenger looks for a function called application
application = get_wsgi_application()  
© www.soinside.com 2019 - 2024. All rights reserved.