7

我对相当一维的 Django 实现感到满意,但现在试图理解多站点共享的过程。

我已经阅读了 Django Sites Framework 和许多关于该主题的帖子,但我没有了解如何启动使用相同数据库的第二个站点的基础知识,但它以单独的域名呈现。

我有一个非常愉快且按惯例的 django 站点,其中包含一个在项目中运行的应用程序。

为了使用教程的说法,我开始了一个项目“mysite”

django-admin.py startproject mysite

然后启动了一个应用程序“民意调查”

manage.py startapp polls

Q1:站点框架是否假定每个站点都是单独的项目或单独的应用程序?

项目中的第二个应用程序“polls2”似乎很有意义,但定义 SITE_ID 的 settings.py 似乎是整个项目的事情。有没有办法进行逐个应用程序设置?

与“mysite”相邻的第二个项目“mysite2”会给我第二个结构,它有自己的 settings.py 和单独的 SITE_ID,但似乎严重违反了“DRY”原则,因为我会复制许多元素相邻的姐妹项目。

Q2:听起来我需要将数据库模型(models.py)重新定义为多对多关系,以便在站点之间共享数据。这只是改变了 Django 访问这些表的方式,还是现有站点的数据库也需要重建?

您对实施站点框架的预期过程的指导将非常感激。

4

1 回答 1

19

Q1:站点框架是否假定每个站点都是单独的项目或单独的应用程序?

一个 Django 网站通常由多个应用程序组成,因此“单个应用程序”的方法实际上行不通。但是,为每个站点考虑一个单独的项目也无济于事。每个站点唯一必须分开的是设置文件。

每个站点都有一个单独的设置文件是否违反了 DRY 原则?不必要。您可以(并且应该)创建具有通用设置的基本设置文件。然后,您将它们导入到每个站点的设置文件中。

例如,在您的项目目录中,您可以有三个设置文件:

base_settings.py
siteA_settings.py
siteB_settings.py

siteA_settings.py并将siteB_settings.py导入所有设置base_settings.py

您唯一需要放入每个站点的设置文件是SITE_ID具有单个站点 ID 的设置。所有其他设置可以跨站点共享 ( base_settings.py) 或特定于特定站点 ( siteA_settings.py, siteB_settings.py),具体取决于您的个人需求。例如,您可以TEMPLATE_DIRS在每个站点设置中重新定义设置,如果您有单独的每个站点模板,但如果模板在站点之间共享,则您不必这样做。与所有其他设置相同 - url 结构、已安装应用程序列表等。

然后,您只需指定设置文件即可选择要运行的站点。例如使用 Django 开发服务器:

python manage.py runserver --settings=mysite.siteA_settings

或者

python manage.py runserver --settings=mysite.siteB_settings

Q2:听起来我需要将数据库模型(models.py)重新定义为多对多关系,以便在站点之间共享数据。这只是改变了 Django 访问这些表的方式,还是现有站点的数据库也需要重建?

站点之间共享的模型不需要修改,只要所有对象都是共享的。只有在您希望能够控制模型的哪个对象出现在每个站点上的情况下,您才需要通过将关系(多对多或外键,取决于您的需要)从模型添加到Django的Site模型。

这样做确实会改变底层的数据库结构(因为添加外键需要在给定模型的数据库表中添加一个额外的列,而添加多对多关系需要一个完整的额外表)。Sites框架本身也使用了自己的数据库表,所以启用后需要同步数据库。

添加关系后,您可以轻松地将查询限制为用于当前站点的对象 - 例如通过使用CurrentSiteManager。另一方面,您仍然可以使用默认管理器访问所有对象(即Model.objects访问 ORM 的常用形式)。

于 2013-09-25T19:28:00.997 回答