当前位置: 首页 > 面试题库 >

用文章标题创建一个URL

吕衡
2023-03-14
问题内容

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

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


问题答案:

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

如果您只想使用一个标签,则所有帖子标题都必须具有唯一的标签(这大约意味着一个唯一的标题)。这也意味着,如果您更改帖子的标题,则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 。



 类似资料:
  • 在本章中,我们将研究如何在Drupal中创建文章。 创建文章可以帮助您的访问者详细了解公司和您的网站。 以下是在Drupal中创建文章的步骤。 Step 1 - 单击Drupal中的Add content 。 Step 2 - 您将看到弹出窗口,如下面的屏幕所示。 选择Article 。 Step 3 - 您将看到以下屏幕。 以下是“ Create Article页面中的字段。 Title - 它

  • 在我的Linux机器上,我希望创建某个文件夹的.tar.bz2文件。一旦我将自己放入该文件夹(在终端中),我在终端命令行中键入什么来将压缩文件夹放入我机器的主目录? 假设我在文件夹中 /home/user/folder.在文件夹“文件夹”中有几个文件(txt、. c等)。如何压缩该类型的文件夹。tar.bz2并将其放在我的 /home目录中? 在/home/user/folder中,我尝试了< c

  • 我在我的查询中添加了一个投影,它创建了一个像。。。 参见链接 和相同的错误y8_,y5_意味着所有关闭它给了一个错误。 我把它改成了。。。 它起作用了。但是我不知道如何在HQL修改它?

  • 问题内容: 我有一个动态文本文件,可以根据用户的查询从数据库中选择内容。我必须将此内容写入文本文件,并将其压缩在servlet的文件夹中。我应该怎么做? 问题答案: 看这个例子: 这将在D:named 的根目录中创建一个文件,其中将包含一个名为的单个文件。当然,你可以添加更多的zip条目,还可以指定一个子目录,如下所示:

  • 但随后文件每次都被触摸,在日志中显示为黄线,这也是不令人满意的... 这个简单的问题还有更好的解决办法吗?

  • 问题内容: 我一直在阅读和谷歌搜索,但似乎找不到这个简单的答案。 我有一个读取文件的功能,但是如果文件不存在,则会出现混乱。我想做的是一个函数,该函数在读取之前会检查文件是否存在,如果不存在,则会创建一个空文件。这就是我所拥有的。 问题答案: 不要尝试先检查是否存在,因为如果同时创建了文件,那么您将面临一场竞赛。您可以打开带有标志的文件以创建该文件(如果不存在):