Django中的已安装应用 - 版本怎么办?

1 投票
3 回答
981 浏览
提问于 2025-04-15 12:07

在《实用Django项目》的可重用应用章节和DjangoCon(可能是Pycon?)的讲座中,似乎强调了让你的应用可以插拔,也就是可以安装到Python的路径中,特别是site-packages这个地方。

我不太明白的是,当这些安装的应用的版本发生变化时会怎样。如果我更新了一个安装在site-packages里的应用,那会不会导致我现在用的所有项目都出问题?我在settings.py里没有看到什么可以让你指定你要导入的应用版本的选项。

我记得在Ruby/Rails中,他们可以冻结gem来应对这种情况。那么在Python/Django中,我们该怎么做呢?

3 个回答

0

如果你有多个Django网站,绝对不要把你的Django应用放到site-packages里。

最好的办法,正如Ken Arnold所说的,是使用Ian Bicking的virtualenv(虚拟Python环境构建工具)。如果你需要运行多个版本的Django,这一点尤其重要。

不过,如果你只需要运行一个版本的Python和Django,那么把应用直接安装到你的项目目录里可能会简单一些。这样,如果有外部应用更新,你可以根据自己的需要逐个升级你的项目。这就是Pinax曾经用于外部Django应用的结构,但我觉得现在它使用的是virtualenv加上pip(而不是setuptools/distutils)。

0

我们做的事情。

我们只在 site-packages 里放“第三方”的东西,比如 Django、XLRD、PIL 等等。

我们的整个项目结构就像是一堆包和 Django 项目的集合。每个项目都是整个网站的一部分。我们对 80 端口和 443 端口(SSL)有两种不同的处理方式。

OverallProject/

    aPackage/
    anotherPackage/

    djangoProject80/
        settings.py
        logging.ini
        app_a_1/
            models.py # app a, version 1 schema
        app_a_2/
            models.py # app a, version 2 schema
        app_b_2/
            models.py
        app_c_1/
            models.py

    djangoProject443/

    test/
    tool/

我们在应用名称中使用版本号。这是主要版本号,和数据库的结构有关,因为“使用相同的结构”是主要版本兼容性的一种定义。

你需要迁移数据,并且证明在新版本中一切正常。然后你才能删除旧版本,并从数据库中移除旧的结构。迁移数据比较困难,因为你不能同时运行两个应用。

大多数应用程序只安装一个当前版本。

5

有多个版本的同一个软件包会让事情变得很麻烦(不过setuptools可以做到这一点)。

我发现把每个项目放在自己的virtualenv里会更干净。我们使用virtualenvwrapper来方便地管理这些虚拟环境,并使用--no-site-packages选项,让每个项目都真正独立,这样在不同的电脑上也能轻松使用。

这是mod_wsgi服务器推荐的设置

撰写回答