Django网站框架初步设置

7

我对相对简单的Django实现感到舒适,但现在正在尝试理解多站点共享内容的过程。

我已经阅读了Django Sites Framework和许多相关主题的文章,但我还没有掌握如何启动第二个站点的基本知识,该站点使用相同的数据库,但呈现为不同的域名。

我有一个非常成功和符合规范的Django站点,由一个项目中运行的一个应用程序组成。

使用教程术语,我开始了一个名为“mysite”的项目。

django-admin.py startproject mysite

然后使用以下命令启动名为“polls”的应用:

manage.py startapp polls

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

在项目中创建第二个应用程序'polls2'似乎很合理,但定义SITE_ID的settings.py似乎是整个项目的事情。是否有一种方法可以进行应用程序级别的设置?

如果在'mysite'旁边创建另一个名为'mysite2'的项目,则会给我提供第二个结构,它有自己的settings.py和单独的SITE_ID,但这似乎违反了“DRY(不要重复自己)”原则,因为我将重复许多相邻姐妹项目的元素。

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

很高兴并且非常感谢您能够提供实施网站框架所需的指导。

1个回答

19

Q1: Sites Framework 是否默认每个站点都是单独的项目或单独的应用程序?

Django网站通常由多个应用程序组成,因此“单应用程序”方法并不适用。但是也不必将每个站点视为单独的项目。唯一必须针对每个站点分离的是设置文件。

每个站点都有单独的设置文件是否违反了DRY原则?并非如此。您可以(而且应该)创建一个具有公共设置的基本设置文件,然后在每个站点的设置文件中导入它们。

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

base_settings.py
siteA_settings.py
siteB_settings.py

siteA_settings.pysiteB_settings.py将导入来自base_settings.py的所有设置。

唯一需要在每个站点的配置文件中添加的是SITE_ID设置,其中包含各自不同的站点ID。所有其他设置可以在站点间共享(base_settings.py),也可以根据您的个人需求特定于某个站点(siteA_settings.pysiteB_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访问那些表的方式,还是现有网站的数据库也需要重建?
如果要共享对象,则仅在此类对象需要添加关系(根据需要选择Many To Many或Foreign Key)到Django的Site模型时才需要修改在各个站点之间共享的模型。对于仅在站点之间共享的模型通常不需要更改。
这样做确实会改变底层数据库结构(因为添加外键需要为给定模型的数据库表添加额外的列,而添加多对多关系则需要一个完整的额外表)。Sites框架本身也使用自己的数据库表,所以启用它后需要同步数据库。
添加关系后,您可以轻松地将查询限制为适用于当前站点的对象,例如使用CurrentSiteManager。另一方面,您仍然可以访问所有对象,使用默认管理器(即访问ORM的常规Model.objects形式)。

感谢您详细的回复。请问一下,“You would then choose which site you want to run…”这句话中的“选择要运行的站点”,是指这种方法可以同时运行两个站点吗?对我来说,不是一个取舍的问题,两个站点都需要正常工作。我还在消化这些信息。可能只需要尝试一下(希望我不会搞砸太多 :))。 - RossGK
当你在开发过程中时,你可以同时运行两个Django开发服务器实例,一个用于每个站点。在生产环境中,你需要在Web服务器配置中添加两个单独的规则,一个用于每个站点。 - Ludwik Trammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接