我正致力于将现有的Drupal网站转换为金字塔。 Drupal网站的网址是SEO友好的例子:" testsite.com/this-is-a-page-about-programming"。在Drupal中,他们有一个系统将该别名映射到类似" testsite.com/node/33"无需将用户重定向到该路径。因此,用户可以看到" testsite.com/this-is-a-page-about-programming"但是Drupal在内部加载了node / 33。此外,如果用户登陆" testsite.com/node/33"他们将被重定向到" testsite.com/this-is-a-page-about-programming"。
如果没有重大的性能影响,如何在金字塔中实现这一目标?
答案 0 :(得分:1)
在金字塔中,实现目标的一种方法是使用URL dispatch。
建议尝试Quick Tutorial以了解金字塔实际上做了什么。
答案 1 :(得分:0)
mod_rewrite是一个Web服务器模块,它独立于您的应用程序使用的框架。如果在服务器上配置它,无论您使用的是Drupal还是Pyramid,它都应该运行相同的操作。由于每个框架的模块相同,因此在两种情况下的开销都是相同的。
答案 2 :(得分:0)
你真的不需要Pyramid所有这些东西 - 它本身可以处理好的网址。
基本上,您的"页面" model将有一个slug
字段,用于存储SEO友好的URL片段:
class Page(Base):
id = sa.Column(sa.Integer, primary_key=True)
slug = sa.Column(sa.String, index=True, unique=True)
title = sa.Column(sa.String)
body = sa.Column(sa.String)
然后你会有一条路线直接将/:slug
网址映射到一个视图,该视图可以通过其slug找到一个页面并进行渲染。
出于向后兼容的目的,您可能还有一个映射到/node/:id
的视图,该视图只会重定向到/:slug
视图,但只有在您想保留旧的重定向时才需要这样做
这是您的Page模型的另一种变体:
class Page(Base):
slug = sa.Column(sa.String, primary_key=True)
title = sa.Column(sa.String)
body = sa.Column(sa.String)
historical_node_id = sa.Column(sa.Integer, index=True, unique=True)
更新:关于" wsgi服务器的服务器级重定向是否可以编码到文件中,而不是必须进行数据库查询然后重定向?&#34 ; - 这是过早优化的定义:)
浏览器发出请求,接收重定向和发出其他请求的成本通常大约为数百毫秒,特别是如果服务器位于另一个大陆上 - 纯粹是因为光。整页加载通常以秒为单位。从同一台机器上运行的数据库中获取单行的成本通常小于1毫秒 - 比重定向本身快数百倍。
但是,如果你坚持,肯定有办法做到这一点:
对某些字典中的值进行硬编码:
HISTORICAL_URLS_MAPPING = {
'33': '/this-is-a-page-about-programming',
'34': '/this-is-a-page-about-premature-optimization'
}
def historical_node_id_view(node_id):
return HTTPFound(HISTORICAL_URLS_MAPPING[node_id])
通常情况下,金字塔应用程序会在" industrial" Web服务器,例如Nginx或Apache。您可以将一堆配置行放入Web服务器配置中。