django subdomains a la craigslist.com

时间:2012-05-10 23:45:34

标签: django

我有兴趣设置我的应用程序,以便我可以提供特定于位置的内容。

像craigslist这样的东西,miami.craigslist.org只显示迈阿密的帖子。

假设我有一个拥有City字段的模型,那么实现这一目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:5)

Banjer建议使用Sites框架,但我觉得它可能不是100%完美适合您的情况。站点框架适用于共享同一数据库的不同站点。但在你的情况下,它的所有相同的网站,你基本上只是想传递一个参数你的城市的意见。

只需将通配符*.domain.com指向django网站,然后在视图中使用request.get_host()解析子域,就可以做一些更简单的事情:
https://docs.djangoproject.com/en/1.4/ref/request-response/#django.http.HttpRequest.get_host

因此,如果域名为:“losangeles.domain.com”,并且您解析出“losangeles”,则可以将其用作查询中的城市“标记”。当您创建新内容时,您只需将其标记为城市。

Post.objects.filter(city_tag="losangeles")

我认为这取决于您网站中所需的“位置”结构的稳健程度。它很可能是具有各种元数据字段的City模型,包括tag字段。然后,您将其与内容关联为外键。它与Sites框架的概念相同,但在这种情况下,您并没有真正创建不同的站点。

答案 1 :(得分:1)

您应该查看"sites" framework。如果您曾经使用过内置的Django管理员,那么您可能已经看到了example.com部分,其中example.com是默认列出的唯一网站。

真实世界的例子,来自我提供的链接:

  

将内容与多个网站相关联

     

以Django为动力的网站LJWorld.com和Lawrence.com运营   同一个新闻机构 - 劳伦斯杂志 - 世界报   堪萨斯州劳伦斯。 LJWorld.com专注于新闻,而Lawrence.com   专注于本地娱乐。但有时编辑希望发表   两个网站上都有一篇文章。

     

解决问题的脑死亡方式是要求网站   制片人两次发布相同的故事:一次是LJWorld.com和   再次为Lawrence.com。但这对网站制作人来说效率低下,而且   在同一个故事中存储多个同一个故事的副本是多余的   数据库中。

     

更好的解决方案很简单:两个站点都使用相同的文章   数据库,文章与一个或多个网站相关联。

因此,您不是使用City字段,而是在Site的模型中添加一个字段,例如:

sites = models.ManyToManyField(Site)

您基本上拥有一个所有城市都使用的数据库。方便,但我想知道它将如何缩小规模。我自己也开始了一个类似的项目,并将使用Django站点框架来实现项目。我很想听听来自数据库人员的更具可扩展性的解决方案。