Django中的已安装应用 - 版本怎么办?
在《实用Django项目》的可重用应用章节和DjangoCon(可能是Pycon?)的讲座中,似乎强调了让你的应用可以插拔,也就是可以安装到Python的路径中,特别是site-packages这个地方。
我不太明白的是,当这些安装的应用的版本发生变化时会怎样。如果我更新了一个安装在site-packages里的应用,那会不会导致我现在用的所有项目都出问题?我在settings.py里没有看到什么可以让你指定你要导入的应用版本的选项。
我记得在Ruby/Rails中,他们可以冻结gem来应对这种情况。那么在Python/Django中,我们该怎么做呢?
3 个回答
如果你有多个Django网站,绝对不要把你的Django应用放到site-packages里。
最好的办法,正如Ken Arnold所说的,是使用Ian Bicking的virtualenv(虚拟Python环境构建工具)。如果你需要运行多个版本的Django,这一点尤其重要。
不过,如果你只需要运行一个版本的Python和Django,那么把应用直接安装到你的项目目录里可能会简单一些。这样,如果有外部应用更新,你可以根据自己的需要逐个升级你的项目。这就是Pinax曾经用于外部Django应用的结构,但我觉得现在它使用的是virtualenv加上pip(而不是setuptools/distutils)。
我们做的事情。
我们只在 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/
我们在应用名称中使用版本号。这是主要版本号,和数据库的结构有关,因为“使用相同的结构”是主要版本兼容性的一种定义。
你需要迁移数据,并且证明在新版本中一切正常。然后你才能删除旧版本,并从数据库中移除旧的结构。迁移数据比较困难,因为你不能同时运行两个应用。
大多数应用程序只安装一个当前版本。
有多个版本的同一个软件包会让事情变得很麻烦(不过setuptools可以做到这一点)。
我发现把每个项目放在自己的virtualenv
里会更干净。我们使用virtualenvwrapper
来方便地管理这些虚拟环境,并使用--no-site-packages
选项,让每个项目都真正独立,这样在不同的电脑上也能轻松使用。