Django 1.6: sitemap.py 文件应该放在哪里?
我想实现Django的站点地图功能,但我对sitemaps.py文件应该放在哪里,以及应该修改哪个urls.py文件来包含它有点困惑。
url(r'^sitemap.xml$', 'django.contrib.sitemaps.views.index', {'sitemaps': sitemaps}),
我应该把上面的代码放在项目的(mysite)urls.py文件里,还是放在应用的(sampleapp1)urls.py文件里呢?
2 个回答
3
文档中提到过这个内容,下面是简单的总结:
首先,确保你有正确的设置。这主要有两点:
- 在
INSTALLED_APPS
中添加django.contrib.sitemaps
- 确保你有一个定义好的站点。以前这个是默认的,但从1.6版本开始变成可选的。不过很多附加应用和一些第三方应用依赖这个设置。
- 在
接下来,你需要决定把你的
sitemap.xml
放在哪里。这很重要,因为这个位置会决定哪些内容会被包含在网站地图中。如果你把它指向/foo/sitemap.xml
,那么只有以foo/
开头的链接会被包含在网站地图里。所以,最好把它放在根网址配置中,通常是在你的项目级别。你只需要在合适的urls.py
中添加你问题中的那一行。现在你需要实际生成网站地图。Django提供了两种自动生成的方法。
GenericSiteMap
用于你的模型,FlatPageSitemap
用于其他所有内容。当然,你也可以创建自己的自定义网站地图。- 创建一个继承自
django.contrib.sitemaps.SiteMap
的类 - 在这个类中,创建一个方法
items
。这个方法将包含网站地图中的链接。对于你的对象,你可以直接返回一个查询集。如果你想创建自定义链接,可以返回一个网址名称的列表,Django会自动调用reverse()
来计算网址。 - 导入这个类名,并将其作为根
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,
}