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

Flask动态路由链接生成报错问题求助

Flask动态路由链接生成报错解决方法

核心错误修复

1. 修正url_for调用方式

你触发TypeError的直接原因有两个:

  • url_for要求动态路由参数以关键字参数传递,而非位置参数
  • 路由对应的视图函数是show_post,不是posts(posts应为渲染列表的视图函数)

正确的模板代码应该是:

<h2><a class="article-title" href="{{ url_for('show_post', id=post.id) }}">{{ post.title | safe }}</a></h2>

解释:第一个参数传入视图函数名show_post,通过id=post.id传递动态路由所需的参数,url_for会自动生成/posts/xxx格式的链接。

2. 修复模板图片引用错误

当前图片标签中filename=img是无效的,需改为post.img(img是单个post对象的属性):

<img src="{{ url_for('static', filename=post.img) }}">

后端代码优化建议

1. 修正调试代码中的url_for调用

后端里的print(url_for('posts'))会报错,因为不存在名为posts的视图函数,测试动态链接应改为:

print(url_for('show_post', id='1'))

2. 修复post存在性判断逻辑

当前代码中if newposts:的判断永远为真(空字典也会被判定为True),应改为判断目标post是否存在:

sus = newposts.get(id)
if sus:
    return f'<h1>{sus}</h1>'
else:
    return '<h1>404</h1><p>Post not found</p>', 404

同时,全局变量posts在并发请求下会出现数据冲突,建议改为函数内局部变量:

def show_post(id):
    database = db.child("contents").get()
    posts = []  # 改为局部变量
    for title in database.each():
        posts.append(title.val())
    # 后续逻辑不变

3. 建议返回模板而非字符串

如果需要渲染结构化的详情页,建议创建post_detail.html模板,然后返回:

return render_template('post_detail.html', post=sus)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:01:43