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
相关产品推荐
相关产品推荐

