在上述代码中,导入了需要的库并且定义了一个站点地图的字典。将sitemap.xml的路径匹配到sitemap视图。sitemaps字典会被传递给sitemap视图。现在启动站点然后在浏览器中打开:8000/sitemap.xml,可以看到如下的输出:
<?xml version="1.0" encoding="utf-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc></loc> <lastmod>2017-12-15</lastmod> <changefreq>weekly</changefreq> <priority>0.9</priority> </url> <url> <loc> </loc> <lastmod>2017-12-14</lastmod> <changefreq>weekly</changefreq> <priority>0.9</priority> </url> </urlset>其中的每个文章的URL都是由get_absolute_url()方法生成的。lastmod标签的内容是最后更新的时间,和在类中定义的一样。changefreq和priority标签也包含对应的值。可以看到站点名为example.com,这个名称来自于数据库存储的Site对象,这是我们在为站点地图应用进行数据迁移的时候默认生成的一个对象。打开:8000/admin/sites/site/,可以看到类似下边的界面:
上边的截图里包含刚才使用的的主机名,可以修改成自己想要的主机名。可以将其修改成localhost:8000以使用本地地址生成URL。如下图所示:
设置之后,URL就会使用本地地址。在生产环境中,需要在此处设置正常的主机和站点名。
3创建订阅功能Django内置一些功能,采用和创建站点地图类似的方法为站点增加RSS或者Atom订阅信息。订阅信息是一个特定的数据格式,通常是XML文件,用于向用户提供这个网站的更新数据,用户通过一个订阅代理程序,订阅这个网站的feed,就可以接收到新的内容通知。
在blog应用目录下新建feeds.py文件并添加如下代码:
from django.contrib.syndication.views import Feed from django.template.defaultfilters import truncatewords from .models import Post class LastestPostFeed(Feed): title = \'My blog\' link = \'/blog/\' description = \'New posts of my blog.\' def items(self): return Post.published.all()[:5] def item_title(self, item): return item.title def item_description(self, item): return truncatewords(item.body, 30)译者注:item_description(self, item)这个函数并没有对post.body进行处理,所以会返回未经处理的markdown代码,在不支持markdown的Feed阅读器里会出现问题,读者可以修改该函数,调用markdown库输出转换后的字符串。
这段代码首先继承了内置的Feed类,title,link和description属性分别对应XML文件的<title>、<link>和<description>标签。
items()方法用于获得订阅信息要使用的数据对象,这里只取了最新发布的5篇文章。item_title()和item_description()方法接收每一个数据对象并且分别返回标题和正文前30个字符。
现在为配置订阅路径,编辑blog/urls.py,导入LatestPostsFeed然后配置一条新路由:
from .feeds import LatestPostsFeed urlpatterns = [ # ... path(\'feed/\', LatestPostsFeed(), name=\'post_feed\'), ]打开地址:8000/blog/feed/即可看到feed内容,包含最新的5篇文章:
<?xml version="1.0" encoding="utf-8"?> <rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"> <channel> <title>My blog</title> <link>:8000/blog/</link> <description>New posts of my blog.</description> <atom:link href="http://localhost:8000/blog/feed/"/> <language>en-us</language> <lastBuildDate>Fri, 15 Dec 2017 09:56:40 +0000</lastBuildDate> <item> <title>Who was Django Reinhardt?</title> <link>:8000/blog/2017/12/14/who-was-djangoreinhardt/</ link> <description>Who was Django Reinhardt.</description> <guid>:8000/blog/2017/12/14/who-was-djangoreinhardt/</ guid> </item> ... </channel> </rss>如果用一个RSS阅读器打开这个链接,就可以在其界面里看到对应信息。
最后一步是在侧边栏添加订阅本博客的链接,在blog/base.html里的侧边栏
里追加:
之后就可以在:8000/blog/看到订阅链接,类似下图:
4增加全文搜索功能