Django 1.6: sitemap.py 文件应该放在哪里?

2 投票
2 回答
901 浏览
提问于 2025-04-18 16:45

我想实现Django的站点地图功能,但我对sitemaps.py文件应该放在哪里,以及应该修改哪个urls.py文件来包含它有点困惑。

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

我应该把上面的代码放在项目的(mysite)urls.py文件里,还是放在应用的(sampleapp1)urls.py文件里呢?

2 个回答

3

文档中提到过这个内容,下面是简单的总结:

  1. 首先,确保你有正确的设置。这主要有两点:

    1. INSTALLED_APPS中添加django.contrib.sitemaps
    2. 确保你有一个定义好的站点。以前这个是默认的,但从1.6版本开始变成可选的。不过很多附加应用和一些第三方应用依赖这个设置。
  2. 接下来,你需要决定把你的sitemap.xml放在哪里。这很重要,因为这个位置会决定哪些内容会被包含在网站地图中。如果你把它指向/foo/sitemap.xml,那么只有以foo/开头的链接会被包含在网站地图里。所以,最好把它放在根网址配置中,通常是在你的项目级别。你只需要在合适的urls.py中添加你问题中的那一行。

  3. 现在你需要实际生成网站地图。Django提供了两种自动生成的方法。GenericSiteMap用于你的模型,FlatPageSitemap用于其他所有内容。当然,你也可以创建自己的自定义网站地图。

    1. 创建一个继承自django.contrib.sitemaps.SiteMap的类
    2. 在这个类中,创建一个方法items。这个方法将包含网站地图中的链接。对于你的对象,你可以直接返回一个查询集。如果你想创建自定义链接,可以返回一个网址名称的列表,Django会自动调用reverse()来计算网址。
    3. 导入这个类名,并将其作为根urls.py中的'sitemap'字典传入。所以如果你有ProductMap用于所有产品,你就可以传入{'sitemaps': {'products': ProductMap}}作为最后一个参数(确保你已经导入它)。

就这么简单。

7

你可以在项目中需要生成网站地图的应用里创建网站地图,文档没有具体说明该做什么和在哪里做,因为你可以自由选择。你只需要在一个字典里注册这些网站地图,然后把这个字典传递到网址中。

举个例子,假设你有一个叫做 your_project 的项目,其中有一个 blog 应用:

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,
}

撰写回答