我一直在共享托管平台(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
Q1 问题似乎来自服务器的乘客和Django文件系统之间的接口
Q2 是的。我更改了他们的 Passenger.py 文件,我的网站现在可以运行了。大多数步骤如下。
Q3 我确实回去支持,但没有收到任何有用的答案。
在“Cpanel”、“Domains”、“Domains”对话框中注册域。
转到 Cpanel、软件、设置 Python 应用程序,然后单击创建应用程序
在“设置Python应用程序”中选择Python版本、应用程序名称(“myapp”)和域名并保存。
(我选择了 python 3.10,因为它是推荐的并且适合 Django 5.0.3 - 撰写本文时的最新版本)
服务器将为您的应用程序(“myapp”)创建一个文件夹,其中包含一个用于启动您的应用程序的 Passenger.py 文件,并在其 Virtualenv 文件夹中创建一个同名的虚拟环境。 它提供了激活 venv 并在创建应用程序后生成的对话框中移动到应用程序文件夹的代码。只需单击即可复制。
在此示例中,代码为
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()