gpt4 book ai didi

python - 创建一个带有文章标题的 url

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:28:58 24 4
gpt4 key购买 nike

我在 MongoDB 中有文章。我希望文章的 URL 是可读的。如果我有一篇名为“How to Use Flask and MongoDB Seamlessly with Heroku”的文章,我希望 URL 类似于 localhost:5000/blog/how-to-use-flask-and-mongodb-seamlessly-with -heroku.

实现此目标的最佳方法是什么?对正确方向的任何指示表示赞赏。我不确定从哪里开始。

最佳答案

您正在寻找一种生成“slug”并使用它来识别帖子的方法。

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

更好的方法是像 Stack Overflow 那样做一些问题。如果您查看这个问题的 URL,您会注意到它有一个唯一的 ID 和一个 slug。事实上,slug 是可选的,您仍然可以通过从 url 中删除它来访问此页面。

您需要一种生成 slug 的方法,以及一个自定义 url converter . inflection库提供了一种使用 parameterize 对字符串进行 slugify 的好方法方法。以下 url 转换器获取一个对象并返回一个带有 the_object.idthe_object.title 作为 slug 的 url。解析 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

为帖子生成一个 url。请注意,您将对象('post')传递给 id 参数,而不仅仅是 id。:

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

我为 Stack Overflow Python 聊天室编写的转换器 site .

关于python - 创建一个带有文章标题的 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27760307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com