2016-09-19 74 views
1

我有一個數據庫中的東西的列表,並希望隱藏訪問時在URL中顯示的主鍵序列。所以,我想談談是這樣的:如何隱藏id序列並使用金字塔提供「友好」url?

example.com/post/9854 

到這一點:

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

雖然顯然仍使用在查詢中的主鍵。完成這個的金字塔是什麼?

+0

如果你理解正確,我想你會想要使用cookies。用你的鍵值設置一個cookie。 –

回答

1

這個「用戶友好的URL片段」通常被稱爲「slu」「,我認爲這來自報紙排版鉛時代。

你通常做的是在你的模型中有一個存儲slu additional的附加字段。本場應該是唯一的和索引(你甚至可以考慮擁有它作爲你的模型的主鍵取決於你站在大,其中「自然VS代理主鍵」辯論:))

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,當你的帖子第一次被保存並且不再改變它時,即使標題改變 - 這對於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() 
     ... 

您正在考慮的URL架構要求您的所有帖子的所有slu have必須是唯一的,這可能很煩人。如果你看很多新聞網站,你會發現,他們使用「組合拳」 URL方案,其中兩個主鍵和蛞蝓存在於URL:

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

主鍵用於查找數據庫和slug部分的數據純粹是爲了SEO和可讀性。