【问题标题】:500 Error running Django, Apache2, PostGreSQL Ubuntu 18.04.3 LTS运行 Django、Apache2、PostGreSQL Ubuntu 18.04.3 LTS 时出现 500 错误
【发布时间】:2020-07-24 18:05:05
【问题描述】:

很抱歉,我似乎迷路了,但我几乎没有部署 Web 应用程序的经验,而且在线搜索也无济于事。正如标题所述,我正在运行 Ubuntu、Apache2、PostgreSQL 和 Django,并且我反复收到错误消息,其中大部分要么含糊不清,要么没有明确的解决方案。再加上我对特定交互流沙的无知,任何试图找到解决方案的尝试,所以我会非常具体。

安装:

  • apache2 libapache2-mod-wsgi-py3 -- 适用于 python 3
  • 我不记得我是否安装了 django 或者它是否自动与我的 PyCharm 包一起打包。
  • PostgreSQL - 工作正常。

应用:

  • 是一个云计算平台,所以需要接收文件,存储文件,渲染文件。
  • 与附加的 Django 网络服务器一起工作正常。
  • 有静态文件,需要写入媒体文件夹

settings.py:

- DEBUG = True
- WSGI_APPLICATION = 'example.wsgi.application'
-DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'example',
        'USER': 'example',
        'PASSWORD': 'example',
        'HOST': 'localhost',
        'PORT': '',

000-default.conf

<VirtualHost *:80>
ServerName FireAnts.localhost
ServerAlias www.FireAnts.localhost
DocumentRoot /var/www/FireAnts
<Directory /var/www/FireAnts/FireAnts>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIDaemonProcess FireAnts python-path=/var/www/FireAnts python-home=/var/www/FireAnts/venv
WSGIProcessGroup FireAnts
WSGIScriptAlias / /var/www/FireAnts/FireAnts/wsgi.py
</VirtualHost>

错误,根据日志

  • 目前,我收到“没有名为 'django' 的模块”。
  • 我经常得到“填充”不是可重入的——这个问题似乎有上百万种可能的解决方案。
  • 目标 WSGI 无法作为 Python 模块加载。

我通过删除写入 error.txt 文件的所有行来临时得到另一个脚本来工作——该文件同时存在于两个包中并生成语法错误。由于某种无法解释的原因,它再次因“No module name django”失败而中断。此外,我将整个包从外部目录移动到“/var/www/”(并修改了 000-default.conf 文件)。这不应该产生任何问题,因为虚拟环境与包一起移动,并且数据库仍应从外部连接。但我假设这之前通过写入不再具有写权限的文件生成了 500 错误。我的数据库会以某种方式(通过阻止连接)生成错误吗?如果用户稍后上传一个包,它将临时写入媒体文件夹。即使它还没有写,这能打破它吗?将包移动到 /var/www 目录时是否需要进行更多修改?我不知道什么可能会产生这些错误。一定是 apache 配置错误,因为它适用于 Django 的 Web 服务器,并且只与 apache2 中断...

抱歉造成混乱和缺乏组织;我只是不知道我在哪里搞砸了。 - 但每次尝试的修复都会再次破坏它。我将不胜感激。

【问题讨论】:

  • 发布这个问题绝对破坏了格式,所以我为此道歉。,
  • 您使用的是虚拟环境吗?
  • 当你在 PyCharm 中启动一个 Django 应用程序时,它会自动配置一个虚拟环境,所以是的。我想它有我需要的一切。
  • 您在运行应用程序时是否激活了该虚拟环境?你能确认 django 确实安装在那个虚拟环境中吗?
  • Django 自己工作得很好,所以我假设 django 被包括在内。这可能是一个荒谬的问题,但我必须在 apache 请求时激活虚拟环境吗?我从来没有激活环境,但它可能是用“python3 manage.py ....”命令激活的。

标签: python django postgresql apache2


【解决方案1】:

您可能错过了在默认配置中正确提供 WSGIDaemonProcess。尝试给予

WSGIDaemonProcess FireAnts python-path=/var/www/FireAnts/venv/path/to/bin/python:/var/www/FireAnts/FireAnts

&lt;path/to/&gt; 替换为您的venv 的正确路径。您必须提供 python 可执行文件的完整路径。

编辑项目的 wsgi.py 文件

/var/www/FireAnts/FireAnts/wsgi.py:

import os
import sys

from django.core.wsgi import get_wsgi_application

path = '/var/www/FireAnts'
if path not in sys.path:
    sys.path.insert(0, path)

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "FireAnts.settings")

application = get_wsgi_application()

【讨论】:

  • 那行不通。应用程序是否应该在 www-data 权限下运行?标准权限适用于以前的版本——它刚刚重新开始工作。上面列出了我所做的唯一更改。
  • 错误是“RuntimeError: populate() is not reentrant。上次弹出时,我正在编写一个没有权限的文件(在“只读”模式下编写一个文本文件。目前我的静态文件不加载,登录页面后会加载,用户上传的时候也会写一个文件,其他文件需要修改权限吗?
  • 删除了所有权部分,在您的情况下可能不需要。看看错误,可能你必须提供必要的代码来重现这个
【解决方案2】:

好的,所以我想出了答案。 一切都以正确的方式配置,但是缺少安装并显示不明确的错误消息。 我找到了生成“populate() is not reentrant”消息的文件,找到了提供错误消息的行,并通过替换“raise RuntimeError(“populate() is not reentrant”)”指示它继续“self.app_configs = {}”。错误日志没有收到含糊不清的答案,而是报告了缺少的“psycopg2”导入。我激活了 venv 目录并安装了 psycopg2。之后,它起作用了。

【讨论】:

    猜你喜欢
    • 2020-02-20
    • 2020-10-29
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 2020-04-17
    • 2020-02-15
    相关资源
    最近更新 更多