如何隐藏id序列并提供友好的"网址使用金字塔?

时间:2016-09-19 06:47:07

标签: python url url-rewriting url-routing pyramid

我有一个数据库中的事物列表,并希望在访问时隐藏主键的序列显示在URL中。所以我想转向这样的事情:

example.com/post/9854

进入这个:

example.com/post/one-two-three-four

虽然显然仍然在查询中使用主键。实现这个的金字塔方式是什么?

1 个答案:

答案 0 :(得分:1)

这个用户友好的URL片段"通常被称为" slug",我认为它来自报纸排版领先的时代。

您通常在模型中添加一个存储slug的字段。该字段应该是唯一的并且已编入索引(您甚至可以考虑将其作为您的模型的主键,具体取决于您在伟大的"自然与代理主键中的位置"辩论:))

class SurrogatePost(Base):
    id = sa.Integer(primary_key=True)
    slug = sa.String(unique=True)
    title = sa.String()

class NaturalPost(Base)
    id = sa.String(primary_key=True)
    title = sa.String()

当您的帖子第一次保存时,您会从帖子的标题ONCE生成slug,并且永远不会再次更改它,即使标题发生变化 - 这对于SEO和链接也很重要。

class Post(Base)
    ...
    def __init__(self, title, body):
        self.slug = generate_slug(title)
        self.title = title
        self.body = body

然后,在您的视图代码中,您使用slug在数据库中查找帖子,就像您使用主键一样。

   def my_view(request):
       slug = request.matchdict['slug']
       post = DBSession.query(Post).filter(Post.slug==slug).one()
       ...

您正在考虑的网址架构要求所有帖子中的所有帖子都必须是唯一的,这可能很烦人。如果你看一下很多新闻网站,你会注意到他们使用的是"合并的#34; URL方案,其中主键和slug都存在于URL中:

/posts/123/one-two-three-four
/posts/123-one-two-three-four
etc.

主键用于查找数据库中的数据,而slug部分纯粹用于搜索引擎优化和可读性。