如何使用Pyramid(Python Framework)模仿mod_rewrite的url别名功能?

时间:2014-04-26 18:10:53

标签: python url-rewriting pyramid

我正致力于将现有的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"。

如果没有重大的性能影响,如何在金字塔中实现这一目标?

3 个答案:

答案 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毫秒 - 比重定向本身快数百倍。

但是,如果你坚持,肯定有办法做到这一点:

  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])
    
  2. 通常情况下,金字塔应用程序会在" industrial" Web服务器,例如Nginx或Apache。您可以将一堆配置行放入Web服务器配置中。