如何模拟mod_rewrite with Pyramid(Python框架)的url别名功能?

如何模拟mod_rewrite with Pyramid(Python框架)的url别名功能?,python,url-rewriting,pyramid,Python,Url Rewriting,Pyramid,我正在将现有的Drupal站点转换为Pyramid。Drupal站点的URL对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。此外,如果用户登陆“t

我正在将现有的Drupal站点转换为Pyramid。Drupal站点的URL对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”


如何在金字塔中实现这一点而不造成重大性能损失

mod_rewrite是一个独立于应用程序使用的框架的Web服务器模块。如果它是在服务器上配置的,那么无论您使用的是Drupal还是Pyramid,它的操作都应该是相同的。由于每个框架的模块是相同的,所以在这两种情况下,开销是完全相同的。

在金字塔中,实现所需的一种方法是使用


建议您尝试一下,了解一下金字塔的实际功能。

您并不需要金字塔的所有功能,它可以在本地处理漂亮的URL

基本上,您的“页面”模型将有一个
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
url映射到一个视图的路由,该视图将通过slug找到一个页面并呈现它

出于向后兼容的目的,您还可以将一个视图映射到
/node/:id
,该视图只需重定向到
/:slug
视图,但仅当您希望保留旧重定向时才需要该视图

以下是页面模型的另一个变体:

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服务器的服务器级重定向的东西可以编码到文件中,而不必进行数据库查询然后重定向?”-这就是过早优化的定义:)

浏览器发出请求、接收重定向和发出另一个请求的成本通常在数百毫秒左右,特别是如果服务器位于另一个大陆上,这纯粹是因为光速。整页加载通常以秒为单位。从运行在同一台计算机上的数据库中获取一行的成本通常小于一毫秒,比重定向本身快数百倍

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

  • 硬编码某些dict中的值:

    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])
    
  • 通常,金字塔应用程序是在“工业”web服务器(如Nginx或Apache)后面提供的。您可以将一组配置行放入webserver配置中


  • 到目前为止,我还没有看到金字塔使用Apache的任何证据。据我所知,这是一个wsgi服务器,我从命令行运行Python文件开始。我一直在启动和停止它,但我从来没有看到它在提到Apache的屏幕上打印出来。好的,是的-我只看到它在Apache中使用mod_wsgi模块。如果您使用的是独立实例,您可能会考虑使用MaMPIDIOReRead扩展,虽然我从未使用过。在这里处理重定向最有效的方法是什么?是否有类似于wsgi服务器的服务器级重定向的功能,可以将其编码到文件中,而不必进行数据库查询然后重定向?否则,我假设我必须对旧url运行查询,检查现有页面,重定向,然后运行另一个查询来加载该页面。谢谢,我想这对我来说很清楚。关于过早优化,我相信你是对的,我只是想确保我从一开始就设计了一个能够处理重载的系统。在我当前的Drupal安装中,查询效率非常低,因此我唯一可以处理我获得的流量的方法就是将所有内容缓存为平面html。