金字塔:如何自动生成站点地图?

时间:2014-05-09 09:14:02

标签: python pyramid sitemap

有没有办法动态生成站点地图并定期使用金字塔将其提交给Google?

我在Flask中看到了2个代码段(herehere),但它们似乎不适用于Pyramid。

具体来说,当我在config.add_route('sitemap', '/sitemap.xml')中加入__init__.py,然后是以下视图时:

@view_config(route_name='sitemap', renderer='static/sitemap.xml')
def sitemap(request):
    ingredients = [ ingredient.name for ingredient in Cosmeceutical.get_all() ]
    products = [ product.name for product in Product.get_all() ]
    return dict(ingredients=ingredients, products=products)

我收到错误:

File "/home/home/SkinResearch/env/local/lib/python2.7/site-packages/pyramid-1.4.5-    py2.7.egg/pyramid/registry.py", line 148, in _get_intrs_by_pairs
raise KeyError((category_name, discriminator))
KeyError: ('renderer factories', '.xml')

将视图更改为:

@view_config(route_name='sitemap', renderer='static/sitemap.xml.jinja2')
def sitemap(request):
    ingredients = [ ingredient.name for ingredient in Cosmeceutical.get_all() ]
    products = [ product.name for product in Product.get_all() ]
    request.response.content_type = 'text/xml'
    return dict(ingredients=ingredients, products=products)

从以前获取过去的KeyError,但在我尝试导航到mysite.com/static/sitemap.xml.时给了我404这是怎么回事?

编辑:这是我的sitemap.jinja2文件。

<?xml version="1.0" encoding="UTF-8"?>
<urlset
      xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
            http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">

{% for page in other_pages %}
<url>
  <loc>http://www.wisderm.com/{{page}}</loc>
  <changefreq>weekly</changefreq>
</url>
{% endfor %}

{% for ingredient in ingredients %}
<url>
  <loc>http://www.wisderm.com/ingredients/{{ingredient.replace(' ', '+')}}</loc>
  <changefreq>monthly</changefreq>
</url>
{% endfor %}

{% for product in products %}
<url>
  <loc>http://www.wisderm.com/products/{{product.replace(' ', '+')}}</loc>
  <changefreq>monthly</changefreq>
</url>
{% endfor %}

</urlset>

2 个答案:

答案 0 :(得分:1)

鉴于您希望建立http://example.com/sitemap.xml作为您的站点地图网址。

将此行添加到 init .py以将网址格式http://example.com/sitemap.xml注册为路由sitemap

config.add_route('sitemap', '/sitemap.xml')

注册路由sitemap的视图代码,并使用您的自定义jinja2模板sitemap.jinja2呈现响应。文件扩展名“jinja2”将触发jinja2渲染器的使用。

@view_config(route_name='sitemap', renderer='static/sitemap.jinja2')
def sitemap(request):
    ingredients = [ ingredient.name for ingredient in Cosmeceutical.get_all() ]
    products = [ product.name for product in Product.get_all() ]
    return dict(ingredients=ingredients, products=products)

这样可以解决因尝试为网址命名模板而导致的错误。但这混淆了渲染器惯例如下所示。

  • *。pt触发Chameleon渲染器
  • *。jinja2触发Jinja2渲染器
  • * .mako触发Mako渲染器
  • *。xml触发XML渲染器(引发了您的第一个错误)

现在,您仍然需要根据sitemaps protocol创建XML。但是你的代码很有前景。您将资源树传递给XML模板。每个资源通常都可以访问URL或last_changed之类的属性。

答案 1 :(得分:0)

看看here

from pyramid.threadlocal import get_current_registry

def mview(request):
    reg = get_current_registy

当我查看来源时,get_routes_mapper中有方法pyramid.config.Configurator

也许它可以帮助您在'fly'上生成站点地图:)