单个django实例上的“站点框架”

时间:2009-06-17 13:27:59

标签: django apache rss settings sites

我想在与网站其余部分不同的子域上提供专门的RSS源。

我是否可以使用sites框架在单个django实例中使用不同的urls.py和settings.py文件 。或者我是否需要设置两个apache位置,并在apache conf中设置不同的settings.py文件。

我需要设置两个urls.py文件的原因是为了避免重复内容。我不希望主网站在rss.example.com上可用,我不希望在example.com上访问专门的提要

从单个django实例提供服务将是理想的,因为我们在内存有限的共享主机上,打开一个只提供rss的实例似乎是浪费。

编辑:我得出的结论是,多个带有单独urls.py文件的实例对我来说最容易......但我发现这篇文章描述了如何使用单个实例来实现它:

http://effbot.org/zone/django-multihost.htm

解决方案:Django tupperware

我最终编写了一个框架,用于在单个django实例上运行多个站点副本。

基本思路是为每个请求动态更改SITE_ID设置,并从数据库加载备用设置。它基于域执行此操作,默认情况下使用SITE_ID = 1(当它找不到任何内容时)

settings.py文件中的所有设置都作为默认值,由当前站点的数据库中存储的设置覆盖。

它工作得很好:)它正在http://rootbuzz.com

的生产中运行

2 个答案:

答案 0 :(得分:10)

对于Django股票,每个网站都必须有唯一的settings.py ...因为SITE_ID是在settings.py中定义的,并且是网站处理此请求的关键。

换句话说,SITE_ID对您的实例是全局的,因此您需要为每个站点提供一个实例。

如果您愿意,可以有一个共同的urls.py,因为没有什么可以阻止您在所有网站ROOT_URLCONF文件中使用相同的settings.py ...或者您可以有一个不同的每个网站。在这种情况下,您可能希望包含子网址,以防止重复使用任何常见网址。

您可以尝试从单个实例中提供至少两种方法:

  1. 使用apache + mod_wsgi并使用WSGIApplicationGroup和/或WSGIProcessGroup指令。我以前从未需要这些,所以不能完全确定它们会以你想要的方式工作,但无论你是否可以在守护进程模式下使用mod_wsgi来大大改善你的内存占用。

  2. 您可以使用Django中间件根据请求主机名拒绝/允许URL(请参阅Django文档中的HttpRequest.get_host())。就此而言,即使它会受到轻微的性能影响,您也可以在所有视图上放置一个装饰器来检查传入的主机。

答案 1 :(得分:3)

仅供参考 - 我发布了django-dynamicsites,可以帮助解决这个问题 - https://bitbucket.org/uysrc/django-dynamicsites/src