【问题标题】:Django 1.6: What should be the location of the sitemap.py file?Django 1.6:sitemap.py 文件的位置应该是什么?
【发布时间】:2014-08-10 15:49:31
【问题描述】:

我想实现 django 站点地图,但我对将 sitemaps.py 文件放在哪里以及应该修改哪个 urls.py 文件以包括:

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

我应该把上面的行放在 project(mysite) urls.py 文件还是 app(sampleapp1) urls.py 文件中?

【问题讨论】:

    标签: python django django-sites django-sitemaps


    【解决方案1】:

    您在项目的应用程序中创建站点地图(您需要站点地图的那些),文档没有说明什么和在哪里,因为您可以随心所欲地做,您只需将它们注册在传递的字典中在网址中。 例如,您有一个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,
    }
    

    【讨论】:

      【解决方案2】:

      documentation 确实强调了这一点,但这里是总结版本:

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

        1. INSTALLED_APPS 中有django.contrib.sitemaps
        2. 确保您拥有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. 在这个类中,创建一个方法items。这就是站点地图中的链接。对于您的对象,您可以只返回一个查询集。如果要创建自定义链接,则返回url名称的列表,django会自动调用reverse()来计算URL。
        3. 导入此类名并将其作为根urls.py 中的“站点地图”字典传递。因此,如果您的所有产品都有 ProductMap,那么您将传递 {'sitemaps': {'products': ProductMap}} 作为最后一个参数(在确保导入它之后)。

      仅此而已。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      相关资源
      最近更新 更多