You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flask中创建友好URL?路由实现方式咨询

在Flask中构建包含分类层级的友好URL

当然可行!在Flask里实现这种带有多层分类的友好URL完全没问题,下面给你两种实用的实现方案,你可以根据自己的业务场景选择:

方案1:通过302重定向实现

这个思路适合你已经有基于ID的基础路由,想要把友好URL作为“别名”的场景。核心是先通过产品ID找到对应的分类和名称,再重定向到友好URL;反过来,用户访问友好URL时,也能解析参数去数据库查询对应数据。

具体代码示例:

from flask import Flask, redirect

app = Flask(__name__)

# 模拟从数据库获取产品信息的函数(实际替换为你的数据库查询逻辑)
def get_product_from_db(product_id):
    return {
        "id": product_id,
        "category_path": ["machines", "cars", "modern"],
        "name": "Lexus LX570"
    }

# 基础路由:通过产品ID访问,重定向到友好URL
@app.route('/product/<int:id_product>')
def product_by_id(id_product):
    product_info = get_product_from_db(id_product)
    # 拼接完整的友好URL路径
    friendly_url = '/'.join(product_info["category_path"]) + '/' + product_info["name"]
    return redirect(friendly_url, code=302)

# 友好URL路由:解析分类路径和产品名,查询数据
@app.route('/<path:full_category>/<product_name>')
def product_by_friendly_path(full_category, product_name):
    # 拆分分类层级,用于数据库查询
    category_levels = full_category.split('/')
    # 这里替换为你的实际数据查询逻辑
    return f"查询到产品:{product_name},所属分类层级:{category_levels}"

方案2:多路由绑定同一查询函数

如果希望不同层级的URL都能直接命中查询逻辑(比如用户可能直接访问首页、单个分类页,或是完整分类路径的产品页),可以把多个路由绑定到同一个处理函数上,让函数根据传入的参数适配查询逻辑。

代码示例:

from flask import Flask

app = Flask(__name__)

# 通用的产品数据查询函数
def query_product(categories=None, product_name=None):
    # 实际替换为你的数据库查询逻辑
    if product_name:
        if categories:
            return f"正在查询分类[{categories}]下的产品:{product_name}"
        else:
            return f"正在查询产品:{product_name}"
    else:
        return "首页:展示全部分类或产品列表"

# 首页路由
@app.route('/')
def index():
    return query_product()

# 直接通过产品名访问的路由
@app.route('/<product_name>')
def product_by_name(product_name):
    return query_product(product_name=product_name)

# 包含完整分类路径+产品名的路由
@app.route('/<path:full_categories>/<product_name>')
def product_with_full_categories(full_categories, product_name):
    category_list = full_categories.split('/')
    return query_product(categories=category_list, product_name=product_name)

小提醒

  • 产品名中的空格(比如示例里的"Lexus LX570")无需额外处理,Flask会自动处理URL编码,函数中拿到的会是解码后的正常字符串。
  • 如果你的分类层级是动态不固定的,方案2里的<path:full_categories>非常实用,它能匹配任意长度的路径片段。

内容的提问来源于stack exchange,提问作者Tarmor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:42:22