如何通过RPM分发Python/Django应用程序

7
我已经阅读了this question,我认为这是一个很好的开始,但我想要更多的见解。
我使用Python 2.6和Django 1.2.1编写了一个应用程序。我希望将这个应用程序部署到一个没有安装Python 2.6或Django的系统上。该系统本身没有安装许多东西——sqlite3、pysqlite2、gcc等。然而,该系统有Python 2.4.3。
最明智的方法是什么,可以创建Python 2.6、Django和我的应用程序自己(一个标准的Django应用程序)的RPM,以便每个组件都可以单独安装,从而允许不同组件的升级?
我不太了解如何创建源RPM,但我认为这些信息很容易获得。如果有任何特别好的资源用于创建源RPM,我也会感激。
如果有任何关于内容分发的Python eggs或使用setup.py的可行解决方案,我也会感兴趣听听。
如果有关系的话,该系统是ESX 4 Update 1。
谢谢!
5个回答

5

除了打包Python代码时遇到的普通问题之外,Django项目还有一些其他问题需要处理:

  • 与系统路径协作
  • 与系统设施协作
  • 处理翻译
  • 随机生成密钥

我曾经为Transifex打包解决这些问题,并建议您调查已经实施的各种功能,以使其正常工作:

  • /usr/share/<projectname>下安装
  • 使用execfile()/etc/<projectname>加载设置
  • 巨大的翻译处理绕路
  • 在安装后脚本中替换密钥
  • 所有其他必需的更改和修改

我不会在系统路径下安装Web应用程序,因为这样可能会导致同时运行不同版本或冲突依赖项的问题。此外,在配置过程中应该随机生成密钥,而不是在安装过程中(想象一下在集群中运行的几个服务器...)。 - tux21b
如果你有一个集群,那么你将使用像 Puppet 这样的工具进行部署,因此它们最终将拥有相同的密钥。而且,处于系统路径下也没问题,因为你需要付出很大的努力才能首先安装多个版本的软件包。 - Ignacio Vazquez-Abrams

3

请参考Python文档的第5章,其中会介绍如何使用bdist Python工具。通过该工具,您将能够生成多种类型的包(或称为“构建分发”),包括RPM。


3
Python软件包通常与setuptools/distribute一起分发。通常,您可以使用easy_install <package_name>(可选附带特定版本号)安装每个Python软件包及其依赖项。我建议您使用setuptools作为我们的主要分发方法,因为:
  • 它适用于所有平台
  • 是Python软件包的首选方式
  • .rpm或.deb安装脚本也可以重复使用其中的部分
  • 您可以在virtualenv中安装这些软件包,无需root权限,在服务器上安装的其他Web应用程序不会冲突

一个很好的资源供您阅读是Deploying with Distribute。它专注于Flask(另一个Web框架),但只需将“Flask”替换为“Django”即可 :)

另一个非常适合分发和部署的 Python 工具是 fabric,您可以将其与 distribute 一起使用(或者不使用,随意选择)。使用 fabric,您可以在 N 台服务器上同时引导和安装您的应用程序(包括依赖项),管理多个开发、测试和生产服务器,并使用单个命令同时更新它们。
本文可能会帮助您入门 Fabric:使用 Fabric 进行部署 此外,我还建议您将您的代码库(或现有代码库的镜像)发布到 githubbitbucket 上,供那些想要手动获取最新源代码并后续使用 python setup.py install 安装您的应用程序的人使用。setup.py 安装脚本是之前提到的 distribute 的一部分。

我的 manage.py runserver 怎么运行?我应该在哪里指定它? - Ishan Bhatt

2
我写了一篇关于如何使用setuptools和它的bdist_rpm命令来创建rpm的博客文章。确实,使用setuptools,但确实要将应用程序作为rpm分发。在setuptools中有一些棘手的、文档不充分的东西,你可以使用这些东西最终得到一个不错的工作流程。
关键是你需要一个安装后脚本,运行你的迁移和收集静态文件,在rpm安装后运行。
export DJANGO_SETTINGS_MODULE=accountpage.settings
mkdir -p /var/www/django/static && chown apache:apache /var/www/django/static
runuser -m apache -c 'echo "yes" | django-admin collectstatic'
django-admin migrate
service httpd restart

您可以告诉setuptools在创建rpm之前将此添加到规范文件中,方法是在设置调用中提供以下选项:
options = {'bdist_rpm':{'post_install' : 'bdist_rpm_post_install.sh'}}
请参见上面的链接以获取完整的working setup.py脚本、后安装钩子和可与python setup.py test一起使用的测试套件,该测试套件将在本地安装所有依赖项并运行django测试。
要使rpm也自动安装其依赖项,请创建一个setup.cfg文件,告诉bdist_rpm关于其依赖项。
[bdist_rpm]
requires = python >= 2.7
           django >= 1.8
           httpd
           Django-Select2 >= 4.3.1
           django-easy-select2
           django-model-utils
           pytz
           django-oauth-toolkit

博客文章的链接已失效。 - kkurian

2
已经有Python 2.6Django的RPM了 - 因此,这些(相对而言)比较容易通过RPM获取和安装。要为您的项目创建一个RPM,可以使用Distutils详细了解spec文件所需内容以及需要调用什么来完成创建RPM过程。

在StackOverflow上还有一篇关于从Python创建RPM的注释,Creating Python RPM,其中也有一些细节。

根据经验,在打包Python本身作为RPM时最为棘手,因此我强烈建议利用已经存在的软件包。对于一些我们已经这样做的程序,我们在持续集成服务器上运行Makefile(是的,老派),并在持续集成服务器上作为构建结果提供RPM。


这个问题是关于创建一个你自己开发的Django应用程序的rpm包,而不是创建Django的rpm包。 - Jens Timmerman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接