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

Python 金字塔:如何自动生成站点地图?,python,pyramid,sitemap,Python,Pyramid,Sitemap,有没有一种方法可以动态生成站点地图,并定期使用金字塔将其提交给谷歌 我在Flask中看到了两个代码片段(和),但它们似乎不适用于Pyramid 具体地说,当我在中包含config.add_route('sitemap','/sitemap.xml')时,会出现以下视图: @view_config(route_name='sitemap', renderer='static/sitemap.xml') def sitemap(request): ingredients = [ ingred

有没有一种方法可以动态生成站点地图,并定期使用金字塔将其提交给谷歌

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

具体地说,当我在
中包含
config.add_route('sitemap','/sitemap.xml')
时,会出现以下视图:

@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>

{其他页面中的页面百分比%}
http://www.wisderm.com/{{page}
每周的
{%endfor%}
{成分中成分的百分比%}
http://www.wisderm.com/ingredients/{{component.replace(''+')}
月刊
{%endfor%}
{products%中产品的%s}
http://www.wisderm.com/products/{{product.replace(''+')}
月刊
{%endfor%}
看一看

当我查看源代码时,
pyramid.config.Configurator
中有方法
get\u routes\u mapper


也许它可以帮助您“动态”生成站点地图:)

如果您希望建立站点地图URL,请执行此操作

将此行添加到init.py以将URL模式注册为路由
sitemap

config.add_route('sitemap', '/sitemap.xml')
注册路线
站点地图的查看代码
,并使用自定义jinja2模板
站点地图提供响应。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)
这将修复因尝试将模板命名为URL而导致的错误。但这混淆了下面所示的渲染器惯例

  • *.pt触发变色龙渲染器
  • *.jinja2触发jinja2渲染器
  • *.mako触发mako渲染器
  • *.xml触发xml呈现程序(引发第一个错误)

现在仍然由您来创建基于XML的XML。但是你的代码看起来很有前途。将资源树传递给XML模板。每个资源通常都可以访问其属性,如URL或上次更改的内容。

注册的路由并不能说明应用程序资源树的全部情况。在金字塔应用程序的应用程序运行时,注册的路由不会更改,但当用户可以对内容执行CRUD操作时,资源树通常会更改。这些变化是网站地图提交给谷歌和搜索引擎的主题。除了@SachaGottfried所说的,我认为在
static/
目录中看到模板有点奇怪-后者通常配置为提供静态文件-我想知道您是否意外地允许下载模板的源代码。尝试访问
http://mysite.tld/static/sitemap.xml.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)