Django 1.6:sitemap.py文件的位置应该是什么?

时间:2014-08-10 15:49:31

标签: python django django-sites django-sitemaps

我想实现django站点地图,但我对于将sitemaps.py文件放在哪里以及应该修改哪个urls.py文件包含以下内容感到困惑:

url(r'^sitemap.xml$', 'django.contrib.sitemaps.views.index', {'sitemaps': sitemaps}),

我可以将上面的行放在project(mysite)urls.py文件或app(sampleapp1)urls.py文件中吗?

2 个答案:

答案 0 :(得分:7)

您在项目的应用程序中创建站点地图(您需要站点地图的应用程序),文档没有说明您可以随意做什么和在哪里,您只需要在字典中注册它们在网址中传递。 例如,您有your_projectblog应用:

your_project
  - blog
    - models.py
    - views.py
    - ...
    - sitemap.py

在您的sitemap.py中:

from django.contrib.sitemaps import Sitemap
from blog.models import Entry

class BlogSitemap(Sitemap):
    changefreq = "never"
    priority = 0.5

    def items(self):
        return Entry.objects.filter(is_draft=False)

    def lastmod(self, obj):
        return obj.pub_date

然后在你的urls.py(项目的主要urls.py)中:

...

from blog.sitemap import BlogSitemap

sitemaps = {
    'blog':BlogSitemap
}


url(r'^sitemap\.xml$', 'django.contrib.sitemaps.views.index', {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),

您对所需的每个站点地图重复相同的操作,如果您的项目很大(许多应用程序),那么每个应用程序使用不同的站点地图是明智的,然后在您的urls.py中:

...

from blog.sitemap import BlogSitemap
from fooapp.sitemap import FooSitemap
from barapp.sitemap import BarSitemap

sitemaps = {
    'blog':BlogSitemap,
    'foo':FooSitemap,
    'bar':BarSitemap,
}

答案 1 :(得分:3)

documentation确实突出了这一点,但这里是摘要版本:

  1. 确保您拥有correct settings。这归结为两件事:

    1. django.contrib.sitemaps
    2. 中有INSTALLED_APPS
    3. 确保您拥有site defined。过去,这是默认情况下完成的,但从1.6开始它已成为可选项。然而,许多贡献应用程序和一些第三方应用依赖于此。
  2. 接下来,您必须决定将sitemap.xml放在哪里。这很重要,因为它的位置将控制站点地图中包含的内容。如果您将其指向/foo/sitemap.xml,则只有那些以foo/开头的网址才会包含在网站地图中。因此,最好将它放在 root url conf 中,这通常是在您的项目级别。您所要做的就是将问题中的行添加到相应的urls.py

  3. 现在您必须实际生成站点地图。 Django提供了两种自动生成方式。您的模型GenericSiteMap,其他所有内容FlatPageSitemap。您当然可以创建自己的自定义站点地图。

    1. 创建一个继承自django.contrib.sitemaps.SiteMap
    2. 的类
    3. 在此课程中,创建方法items。这是站点地图中的链接。对于您的对象,您只需返回一个查询集。如果您要创建自定义链接,请返回网址名称列表,django会自动调用reverse()来计算网址。
    4. 导入此班级名称并将其作为'站点地图'根urls.py中的字典。因此,如果您的所有产品都有ProductMap,那么您可以将{'sitemaps': {'products': ProductMap}}作为最后一个参数传递(确保导入后)。
  4. 这就是它的全部内容。