如何通过RPM分发Python / Django App

时间:2010-07-12 04:35:54

标签: python django rpm esx

我已经阅读了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,我也会很感激。

系统是ESX 4 Update 1,如果重要的话。

谢谢!

更新 我从未想过,分发Python egg甚至使用setup.py是内容分发的可行解决方案。我也有兴趣听到这个。

5 个答案:

答案 0 :(得分:5)

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

  • 熟悉系统路径
  • 善于使用系统设施
  • 处理翻译
  • 随机化密钥

我必须解决这些问题才能打包Transifex,我建议您调查已经落实的各个部分以使其正常工作:

  • /usr/share/<projectname>
  • 下安装
  • 使用execfile()加载/etc/<projectname>
  • 的设置
  • 巨大的翻译处理解决方案
  • 替换安装后脚本中的密钥
  • 所有其他所需的血腥变化和软糖

答案 1 :(得分: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,除了分发之外你可以使用它(或者没有它,无论你想要什么)。使用结构,您可以立即在N个服务器上引导和安装应用程序(包含依赖项),管理多个开发,测试和生产服务器,并使用单个命令同时更新它们。

本文可能会帮助您开始使用Fabric:Deploying with Fabric

此外,我还建议您在githubbitbucket上发布您的存储库(或镜像现有存储库),以便那些想要手动获取最新资源并使用{{安装您的应用程序的人1}}之后。 setup.py安装脚本是我之前提到的分发的一部分。

答案 2 :(得分:3)

请参阅chapter 5 of the Python documentation。它将展示如何处理 bdist Python实用程序。有了它,您将能够生成几种类型的包(或者,如何说,“构建分发”),包括RPM。

答案 3 :(得分:2)

已经有python 2.6django的RPM可用 - 因此至少(相对)容易通过RPM获取和安装。为您的项目创建一个RPM,有一个使用Distutils写下一些细节的内容,这些内容详细说明了您在spec文件中需要的内容以及为实现它而调用的内容。

还有一个关于在Creating Python RPM的StackOverflow上从python创建RPM的说明,它也有一些细节。

根据经验,将python本身打包为RPM是最狡猾的小动物,因此利用已有的东西我肯定会推荐。对于我已经看过这个的一些程序,我们有一个Makefile(是的,旧学校)在一个持续集成服务器上运行setup.py bdist_rpm命令,使RPM可用作该构建的结果并立即在CI服务器。

答案 4 :(得分:2)

I've written up a blog post on how to use setuptools and it's 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

你可以通过在setup调用中给出这个选项告诉setuptools在创建rpm之前将它添加到spec文件中:

options = {'bdist_rpm':{'post_install' : 'bdist_rpm_post_install.sh'}},

请参阅上面的链接,查看完整的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