我有一个数据库中的事物列表,并希望在访问时隐藏主键的序列显示在URL中。所以我想转向这样的事情:
example.com/post/9854
进入这个:
example.com/post/one-two-three-four
虽然显然仍然在查询中使用主键。实现这个的金字塔方式是什么?
答案 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部分纯粹用于搜索引擎优化和可读性。