Django 在 Google App Engine 上出现“502 Bad Gateway”错误

Posted

技术标签:

【中文标题】Django 在 Google App Engine 上出现“502 Bad Gateway”错误【英文标题】:Django gives "502 Bad Gateway" error on Google App Engine 【发布时间】:2021-03-31 11:09:45 【问题描述】:

我正在尝试在标准 Python3.8 环境中的 Google App Engine 上部署 Django 应用程序。我按照this document 中的所有步骤进行操作。应用程序在我的本地使用谷歌云数据库运行良好。但是我收到502 Bad Gateway 错误访问Web Url。我发现了很多不同的问题,但是技术正在发生很大的变化,到目前为止,它们都没有帮助。最后,我今天遇到了this solution,但它说创建一个我在谷歌文档中从未见过的gcloud.py 文件,这就是我没有应用该解决方案但决定问你的原因。

访问页面时出现此错误

Traceback (most recent call last):
_find_and_load (<frozen importlib._bootstrap>)

这是错误的堆栈跟踪:

File "<frozen importlib._bootstrap>", line 973, in _find_and_load_unlocked: ModuleNotFoundError: No module named 'main'
at _find_and_load (<frozen importlib._bootstrap>:991)
at _gcd_import (<frozen importlib._bootstrap>:1014)
at import_module (/opt/python3.8/lib/python3.8/importlib/__init__.py:127)
at import_app (/layers/google.python.pip/pip/lib/python3.8/site-packages/gunicorn/util.py:358)
at load_wsgiapp (/layers/google.python.pip/pip/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py:39)
at load (/layers/google.python.pip/pip/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py:49)
at wsgi (/layers/google.python.pip/pip/lib/python3.8/site-packages/gunicorn/app/base.py:67)
at load_wsgi (/layers/google.python.pip/pip/lib/python3.8/site-packages/gunicorn/workers/base.py:144)
at init_process (/layers/google.python.pip/pip/lib/python3.8/site-packages/gunicorn/workers/base.py:119)
at init_process (/layers/google.python.pip/pip/lib/python3.8/site-packages/gunicorn/workers/gthread.py:92)
at spawn_worker (/layers/google.python.pip/pip/lib/python3.8/site-packages/gunicorn/arbiter.py:583)

my_site/wsgi.py

import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_site.settings")
application = get_wsgi_application()

这是我的 app.yaml

runtime: python38 
handlers:
# This configures Google App Engine to serve the files in the app's
# static directory.
- url: /static
 static_dir: static/
# This handler routes all requests not caught above to the main app. 
# It is required when static routes are defined, but can be omitted 
# (along with the entire handlers section) when there are no static 
# files defined.
- url: /.*
 script: auto

这是settings.py。我尝试使用注释行,但仍然出现相同的错误。

STATIC_URL = '/static/'
STATIC_ROOT = 'static'

# STATIC_ROOT = os.path.join(BASE_DIR, '/static/')
# STATICFILES_DIRS = (
#     os.path.join(BASE_DIR, 'static'),
# )
# MEDIA_URL = '/media/'
# MEDIA_ROOT = os.path.join(BASE_DIR, "media")

# STATICFILES_FINDERS = [
#    'django.contrib.staticfiles.finders.FileSystemFinder',
#    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
# ]

appengine_config.py

from google.appengine.ext import vendor
vendor.add('lib')

我的 lib 文件夹中有这 2 个库。我从 env 文件夹中手动移动了它们。

django
mysqldb

【问题讨论】:

您的入口点似乎有问题,您能否检查this 或this 是否有帮助? 我实际上尝试了第一个链接,但没有成功,但我会继续尝试不同版本的第一个链接。顺便说一句,即使在 app.yaml 中更改了行之后,也必须像往常一样进行部署,或者是否有其他方法可以仅部署更改。 不可能只上传更改,您必须在进行更改时上传和部署所有内容 【参考方案1】:

应用程序抱怨找不到main 模块,您mentioned 的文档与您的问题不同,您还没有达到使用存储库的目的。

关于您的具体问题。正如documentation中提到的:

运行时通过运行您在 app.yaml 文件中的入口点字段。

在这种情况下,您的 app.yaml 没有指定入口点,发生这种情况时,您必须确保满足以下要求:

如果您的应用满足以下要求,App Engine 将启动 如果您不指定 入口点字段:

您的应用程序目录的根目录包含一个 main.py 文件,其中包含一个 名为 app 的 WSGI 兼容对象。

您的应用不包含 Pipfile 或 Pipfile.lock 文件。

在这种情况下,您的应用程序缺少 main.py 文件,这是 App Engine 抱怨的错误。有多种方法可以避免此错误(例如指定entrypoint)。在这种情况下,我建议在您应用的 root 文件夹中创建一个名为 main.py 的文件,并包含下一个:

from mysite.wsgi import application
app = application

可以找到包含运行 Django 应用程序所需结构的示例here

【讨论】:

非常感谢@Emmanuel,它有帮助。顺便说一句,我不小心在 GitHub 上创建了一个公共存储库,其中保存了我所有的密码,这导致我的 google 引擎应用程序遭到破坏。我需要找到一种方法在单独的文件中加载密钥和密码。 我建议您使用gitifnore 文件,这样您就可以避免将这些文件上传到github

以上是关于Django 在 Google App Engine 上出现“502 Bad Gateway”错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django/Google App Engine 中制作日志颜色?

正在加载 Genymotion 库 Genymotion 目录:/Applications/Genymotion.app/Contents/MacOS 尝试初始化引擎 Initialize Engin

在 Google App Engine 中将 docx 文件呈现为 django 模板

来自 Google App Engine 的 Django 1.5.1 支持

在 Google App Engine 上部署 Django 项目

Cron Job-具有Google App Engine的纯Django项目