在生产中部署django应用程序?

时间:2016-03-25 13:15:59

标签: python django git

我使用以下命令在ubuntu 15.10服务器上安装了Djangomod_wsgi-express new 方式):

pip install Django
pip install mod_wsgi

目前,我正在使用以下脚本启动/部署我的django应用程序:

cd ~/.local/bin
./mod_wsgi-express start-server ~/mysite/mysite/wsgi.py

我的应用程序位于(作为git存储库):

~/mysite/

由于~/mysite/不在 PYTHONPATH ,我已将 wsgi.py 文件修改为:

import os
from django.core.wsgi import get_wsgi_application
# Hardcode the path to the application/add it to the PYTHONPATH
import sys
path = '/home/user/mysite'
if path not in sys.path:
        sys.path.append(path)

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

现在这个工作正常。但如果我想在制作中使用它,我会发现一些问题:

  1. wsgi.py 包含django Web应用程序的硬编码路径,以确保它在PYTHONPATH中。此外,它不能保证在本地开发人员机器上处于相同的路径。至少可以使用相对路径进行改进。
  2. Web应用程序作为git存储库分发。例如。在java中,你可以将它打包成war或ear文件。
  3. django mod_wsgi-express 都位于特定本地用户的〜/ .local文件夹中。
  4. 是否有任何明显的变化我应该开始考虑消除上面的子弹1-3,或者上述方法或多或少是django部署的工作方式?

3 个答案:

答案 0 :(得分:1)

我首先要说的是,我假设您正在使用您描述的设置,因为具体原因而且我不会试图引导您走向任何可能更加管理员友好的设置。如果你不是并且可以使用友好的轻推,你可以尝试谷歌搜索不同的人的优点/缺点和例子,或者我会对Gunicorn和LTS版本的Ubuntu说一句好话。

反正。

当我在阅读你的问题时,首先出现的问题是你可以使用像Fabric这样的东西甚至只是一个可以在你的wsgi.py文件中进行字符串替换的部署脚本,然后输入正确的内容您的路径以及处理部署中的所有其他内容。我想说自动部署是一种标准,你可能希望能够在5分钟内抛弃服务器并启动新服务器,但如果你正在做其他事情,那么它们可能需要学习很多东西。时间。

确定你可能不想搞乱所有的自动化装置,然后我跳到Django's mod_wsgi deployment documentation(这是非常好的),因为弄乱Python路径似乎很奇怪,就像你应该'必须这样做。果然,they recommend running mod_wsgi in daemon mode,这使您有机会在Apache配置中设置Python路径,并使其与您分发的代码分开。然后你可以让不同的盒子根据他们的需要使用不同的配置文件。

同样的文档中有关于使用虚拟环境(virtualenv)的注意事项,您可能也希望这样做 - virtualenv将是可移植的,并将处理您对第3点的关注。

使用第2点,您可能只需将git发布视为一项功能 - 无需运行构建过程并上载WAR文件和所有etceteras。 Java人员只是忍受了这一点,因为他们理论上得到了将代码编译成字节码的东西; Python,无论好坏,都不进行任何编译,因此您可以透明地部署代码并使用git在应用程序生命周期的所有点处理文件,而不必担心保持工件版本的直接性。

编辑:

您也可以通过将〜/ .local / bin文件夹添加到路径(export PATH=~/.local/bin:$PATH从命令行),然后cd进入您网站的目录并运行来避免PYTHONPATH的任何问题mod_wsgi-express start-server mysite/wsgi.py。通过将本地bin文件夹添加到PATH,您可以从任何目录中隐式引用其中的任何应用程序,同时仍然将所有内容都植根到cd目录中,这样可以防止Python混淆。

我仍然希望将mod_wsgi链接到您的主Apache安装并以守护进程模式运行它,以便您可以控制从systemd / systemctl上调/下调而不是从终端分配进程并且必须查找进程ID在ps杀死它。

答案 1 :(得分:0)

更好的是这样的:     进口口     导入系统     sys.path.append("加/你/路径&#34)     os.environ.setdefault(" DJANGO_SETTINGS_MODULE"" mysite.settings&#34)     进口django     django.setup     import django.core.handlers.wsgi     application = get_wsgi_application()     application = django.core.handlers.wsgi.WSGIHandler()

检查你的项目是否被命名为mysite,如果你的项目在你的django-project名称上有其他名称更改mysite。您将使用生产apache?

答案 2 :(得分:0)

requestAnimationFrame