用文章标题创建一个URL

发布于 2021-01-29 15:00:59

我在MongoDB中有文章。我希望文章的URL可读。如果我有一篇名为“如何在Heroku中无缝使用Flask和MongoDB”的文章,则我希望URL类似于localhost:5000/blog/how- to-use-flask-and-mongodb-seamlessly-with-heroku

做到这一点的最佳方法是什么?任何朝着正确方向的指针都值得赞赏。我不确定从哪里开始。

关注者
0
被浏览
45
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您正在寻找一种生成“子弹”并将其用于标识帖子的方法。

    如果您只想使用一个标签,则所有帖子标题都必须具有唯一的标签(这大约意味着一个唯一的标题)。这也意味着,如果您更改帖子的标题,则URL可能会更改,这会使书签和其他外部链接无效。

    更好的方法是执行类似于Stack
    Overflow的操作。如果您查看此问题的URL,您会发现它具有唯一的ID和一个标记。实际上,该条是可选的,您仍然可以通过从url中删除它来访问此页面。

    您将需要一种生成标签的方法,以及一个自定义url转换器。该拐点库提供了一个很好的方式slugify与字符串parameterize的方法。以下url转换器接受一个对象,并返回带有the_object.id和的url
    the_object.title。解析url时,它只会返回对象的id,因为slug是可选的。

    from inflection import parameterize
    from werkzeug.routing import BaseConverter
    
    class IDSlugConverter(BaseConverter):
        """Matches an int id and optional slug, separated by "/".
    
        :param attr: name of field to slugify, or None for default of str(instance)
        :param length: max length of slug when building url
        """
    
        regex = r'-?\d+(?:/[\w\-]*)?'
    
        def __init__(self, map, attr='title', length=80):
            self.attr = attr
            self.length = int(length)
            super(IDSlugConverter, self).__init__(map)
    
        def to_python(self, value):
            id, slug = (value.split('/') + [None])[:2]
            return int(id)
    
        def to_url(self, value):
            raw = str(value) if self.attr is None else getattr(value, self.attr, '')
            slug = parameterize(raw)[:self.length].rstrip('-')
            return '{}/{}'.format(value.id, slug).rstrip('/')
    

    注册转换器,以便可以在路由中使用它:

    app.url_map.converters['id_slug'] = IDSlugConverter
    

    在路线中使用它:

    @app.route('/blog/<id_slug:id>')
    def blog_post(id):
        # get post by id, do stuff
    

    生成帖子的网址。请注意,您不仅将id传递给对象(“ post”),还传递给id参数:

    url_for('blog_post', id=post)
    # /blog/1234/the-post-title
    

    我为Stack Overflow Python聊天室网站编写的Converter 。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看