我对相当一维的Django实现很满意,但现在试图了解多站点共享内容的过程。
我已经阅读了Django Sites Framework以及关于该主题的许多帖子,但是我没有获得如何启动使用相同数据库的第二个站点的基础知识,而是将其自身表示为单独的域名。
我有一个非常开心的django网站,其中包含一个在项目中运行的应用程序。
为了使用教程的说法,我用
开始了一个项目“mysite”django-admin.py startproject mysite
然后用
启动了一个应用程序“民意调查”manage.py startapp polls
Q1:网站框架是否假设每个网站都是单独的项目或单独的应用程序?
项目中的第二个应用'polls2'似乎有意义,但是定义SITE_ID的settings.py似乎是一个完整的项目。有没有办法进行app-by-app设置?
与'mysite'相邻的第二个proj'mysite2'会给我一个第二个结构,它有自己的settings.py和一个单独的SITE_ID,但是后来似乎有一个严重违反“DRY”原则,因为我要复制邻近姐妹项目的许多要素。
Q2:听起来我需要将数据库模型(models.py)重新定义为多对多关系,以便在站点之间共享数据。这只会改变Django访问这些表的方式,还是需要重建现有站点的数据库?
您对实施网站框架的预期流程的指导意见非常好,非常感谢。
答案 0 :(得分:14)
问题1:网站框架是否假设每个网站都是一个单独的项目或 一个单独的应用程序?
Django网站通常由多个应用程序组成,因此“单一应用程序”方法不会真正起作用。但是,对每个站点的单独项目进行思考也没有帮助。每个站点必须单独的 事物是设置文件。
为每个网站设置单独的设置文件是否违反DRY原则?不必要。您可以(并且应该)使用常用设置创建基本设置文件。然后,您可以在每个站点的设置文件中导入它们。
例如,在项目目录中,您可以有三个设置文件:
base_settings.py
siteA_settings.py
siteB_settings.py
siteA_settings.py
和siteB_settings.py
会从base_settings.py
导入所有设置。
唯一认为必须放入每个网站的设置文件的是具有单个网站ID的SITE_ID
设置。所有其他设置可以在网站(base_settings.py
)之间共享,也可以特定于特定网站(siteA_settings.py
,siteB_settings.py
),具体取决于您的个人需求。例如,如果您有每个站点的单独模板,但是如果您在不必要的站点之间共享模板,则可以在每个站点设置中重新定义TEMPLATE_DIRS
设置。与所有其他设置相同 - 网址结构,已安装应用程序列表等
然后,您可以通过指定设置文件来选择要运行的站点。例如,使用Django开发服务器:
python manage.py runserver --settings=mysite.siteA_settings
或
python manage.py runserver --settings=mysite.siteB_settings
Q2:听起来我需要重新定义数据库模型(models.py) 用于在站点之间共享数据的多对多关系。那样做 只是改变Django访问这些表的方式,或者改变现有的表 网站的数据库也需要重建?
只要共享所有对象,就不需要修改站点之间共享的模型。仅当您希望能够控制模型的哪个对象出现在哪个站点上时,您需要通过从模型添加关系(多对多或外键,具体取决于您的需要)来解决这个问题。 Django的Site
模型。
这样做确实会改变底层数据库结构(因为添加外键需要在给定模型的数据库表中添加额外的列,并且添加“多对多”关系需要一个完整的附加表)。 Sites框架本身也使用自己的数据库表,因此您需要在启用它后同步数据库。
添加关系后,您可以轻松地将查询限制为针对当前网站的对象 - 例如,使用the CurrentSiteManager。另一方面,您仍然可以使用默认管理器(即访问ORM的通常Model.objects
形式)访问所有对象。