运行 Oracle 应用程序容器上的 Django

Run Django on Oracle Application Container

我有一个现有的 django 项目,我正试图将其部署到 Oracle 的云服务,Application Container

我关注了Oracle's guide to do this however there are some details missing from this guide. Specifically the guide references an app.py file which seems to come from this guide。但是我看不到如何在 django 项目中使用它。

我已经尝试将对 app.py 的调用替换为使用 django 的 manage.pywsgi.py 文件,但 Oracle 服务器仍然无法启动。 Oracle 提供的服务器日志也没有帮助,只告诉我正在安装 python 包。

ACCS[web.1]: Content of APP_HOME [ /u01/app/ ] dir
ACCS[web.1]: total 96
ACCS[web.1]: -rw-r----- 1 apaas apaas 28423 May 17 10:51 readme.html
ACCS[web.1]: -rw-r----- 1 apaas apaas 40960 May 17 10:51 db.sqlite3
ACCS[web.1]: -rw-r----- 1 apaas apaas   355 Sep 10 13:26 manage.py
ACCS[web.1]: -rw-r----- 1 apaas apaas   254 Sep 10 13:28 DjangoProject.pyproj.user
ACCS[web.1]: -rw-r----- 1 apaas apaas  6990 Sep 10 13:28 DjangoProject.pyproj
ACCS[web.1]: -rw-r----- 1 apaas apaas   186 Sep 12 11:24 manifest.json
ACCS[web.1]: drwxr-x--- 1 apaas apaas    10 Sep 13 03:42 obj
ACCS[web.1]: drwxr-x--- 1 apaas apaas   160 Sep 13 03:42 app
ACCS[web.1]: drwxr-x--- 1 apaas apaas    94 Sep 13 03:42 DjangoProject
ACCS[web.1]: drwxr-xr-x 1 apaas apaas   286 Sep 13 03:42 .
ACCS[web.1]: drwxr-xr-x 1 apaas apaas    46 Sep 13 03:42 ..
ACCS[web.1]: -rw-r----- 1 apaas apaas   290 Sep 13  2018 start.sh
ACCS[web.1]: -rw-r----- 1 apaas apaas    51 Sep 13  2018 requirements.txt
ACCS[web.1]: Application should listen on 0.0.0.0:$PORT [enabling app to listen on all interfaces on $PORT env variable]
ACCS[web.1]: Starting application with launch command [ sh ./start.sh ]
APP[web.1]: Collecting Django==1.11.15 (from -r ./requirements.txt (line 1))
APP[web.1]:   Downloading https://files.pythonhosted.org/packages/f8/1c/31112c778b7a56ce18e3fff5e8915719fbe1cd3476c1eef557dddacfac8b/Django-1.11.15-py2.py3-none-any.whl (6.9MB)
APP[web.1]: Collecting pytz==2018.5 (from -r ./requirements.txt (line 2))
APP[web.1]:   Downloading https://files.pythonhosted.org/packages/30/4e/27c34b62430286c6d59177a0842ed90dc789ce5d1ed740887653b898779a/pytz-2018.5-py2.py3-none-any.whl (510kB)
APP[web.1]: Collecting setuptools==39.0.1 (from -r ./requirements.txt (line 3))
APP[web.1]:   Downloading https://files.pythonhosted.org/packages/20/d7/04a0b689d3035143e2ff288f4b9ee4bf6ed80585cc121c90bfd85a1a8c2e/setuptools-39.0.1-py2.py3-none-any.whl (569kB)
APP[web.1]: Installing collected packages: pytz, Django, setuptools
APP[web.1]: Successfully installed Django-1.11.15 pytz-2018.5 setuptools-39.0.1
APP[web.1]: You are using pip version 9.0.1, however version 18.0 is available.
APP[web.1]: You should consider upgrading via the 'pip install --upgrade pip' command.

我在制作 start.sh 文件时也发现了 this guide 的使用。

#!/bin/sh
pip --no-cache-dir install -r ./requirements.txt -t modules
export PYTHONPATH=$PYTHONPATH:modules
python manage.py runserver

我已经联系了 Oracle 的支持,但他们也找不到解决方案。他们的建议是在 wsgi.py 文件中包含服务器使用的 PORT 变量,我试过了。

import os
import sys

from django.core.management import call_command
from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DjangoMedmin.settings")
application = get_wsgi_application()

PORT_NUMBER = int(os.environ.get('PORT', 8084))
call_command('runserver',  '0.0.0.0:'+str(PORT_NUMBER))

我错过了什么?是否可以让 django 与 Oracle 一起工作?

该指南绝对是误导性的,并且混淆了 Django 和 Flask。

runserver 命令仅用于在本地计算机上进行开发,不适合生产使用。您必须使用某种 WSGI 网络服务器来 运行 您的 Django 应用程序。

我建议你使用gunicorn:

  1. 将 gunicorn 添加到您的 requirements.txt
  2. 在您的 start.sh 中启动 gunicorn:

    pip --no-cache-dir install -r ./requirements.txt -t modules
    export PYTHONPATH=$PYTHONPATH:modules
    gunicorn -b $PORT DjangoProject.wsgi
    

(免责声明:在阅读您的问题之前,我什至不知道存在 Oracle ACCS)

在 Oracle 支持的更多帮助下,我设法让 Django 在应用程序容器上工作。

问题出在 settings.py 中的 ALLOWED_HOSTS 变量。我找到的教程都建议使用 ALLOWED_HOSTS = ['*']。这不起作用。

为了让 Django 工作,我需要包含特定的 URL Oracle 分配给应用程序容器。所以像 ALLOWED_HOSTS = ['ProjectName-AccountName.oracle-region-0.oraclecloud.com'] 这样的东西。