在查看Practical Django Projects的可重用应用程序章节并听取DjangoCon(Pycon?)讲座后,似乎强调通过将应用程序安装到Python路径(即site-packages)来使您的应用程序可插入。
我不明白的是,当其中一个安装的应用程序的版本发生变化时会发生什么。如果我更新安装到site-packages的其中一个应用程序,那么这不会打破我使用它的所有当前项目吗?我从来没有注意到settings.py中的任何内容,您可以指定要导入的应用程序的版本。
我认为在Ruby / Rails中,他们能够在这种情况下冻结宝石。但是我们应该在Python / Django中做些什么呢?
答案 0 :(得分:5)
同一个软件包的多个版本会变得混乱(但是setuptools可以做到这一点。)
我发现将每个项目放在自己的virtualenv
中更加清晰。我们使用virtualevwrapper
轻松管理virtualenvs,使用--no-site-packages
选项使每个项目真正自包含并可跨机器移植。
答案 1 :(得分:0)
如果你有多个Django网站,你肯定不想把你的Django应用程序放到网站包中。
Ken Arnold回答说,最好的方法是使用Ian Bicking的virtualenv(虚拟Python环境构建器)。如果您必须运行多个版本的Django,则尤其如此。
但是,如果您可以运行单个版本的Python和Django,那么将应用程序安装到项目目录中可能会更容易一些。这样,如果外部应用程序得到更新,您可以根据需要逐个升级每个项目。这是一次用于外部Django应用程序的结构Pinax,但我认为它现在使用virtualenv + pip(而不是setuptools / distutils)。
答案 2 :(得分:0)
我们做什么。
我们只将“第三方”内容放入网站包中。 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/
我们使用版本号作为应用名称的一部分。这是主要版本号,并且与架构相关联,因为“uses-the-same-schema”是主要版本兼容性的一个定义。
您必须迁移数据并证明新版本中的工作正常。然后,您可以删除旧版本并从数据库中删除架构。迁移数据具有挑战性,因为您无法并排运行这两个应用程序。
大多数应用程序只安装了一个当前版本。