You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flask框架下如何将Python变量传递至模板?url_for使用误区及正确用法解析

你的问题拆解与解决方案

一、先说说你现有代码里的错误

  1. url_for的完全误用:你在模板里写width: {{url_for('size')}};,但url_for根本不是用来获取函数返回值的!它的作用是根据视图函数名生成对应的URL路径,不是执行函数并返回结果。比如你如果给size函数加了路由,url_for('size')只会返回这个函数对应的URL字符串(比如/size),而不是"50px"
  2. size函数没有路由,也不该这么用:你的size函数没有加@app.route()装饰器,就算你想用它的返回值,也不能通过url_for来调用,直接在视图里调用函数把结果传去模板才对。
  3. web_size变量没传递到模板:你定义了web_size="100%",但render_template("web.html")里没把这个变量传进去,模板根本拿不到这个值。

二、搞懂url_for到底怎么用

url_for是Flask提供的URL反向生成工具,核心作用是:

  • 接收视图函数的名称(或者端点名称),生成对应的URL路径,避免你在模板/代码里硬写URL(硬写的话,以后改路由路径要改很多地方,用url_for只需要改路由装饰器就行)。
  • 还能给带参数的路由传参数,自动拼接成正确的URL。

举两个简单例子:

示例1:无参数路由

@app.route('/about')
def about_page():
    return "About Page"

模板里用{{ url_for('about_page') }},会生成字符串/about,比如你可以写<a href="{{ url_for('about_page') }}">关于我们</a>,渲染后就是<a href="/about">关于我们</a>

示例2:带参数路由

@app.route('/user/<int:user_id>')
def user_profile(user_id):
    return f"User {user_id}'s Profile"

模板里用{{ url_for('user_profile', user_id=123) }},会生成字符串/user/123


三、如何把Python变量传递到模板

很简单,在调用render_template的时候,把变量作为关键字参数传进去就行,然后在模板里用{{ 变量名 }}来引用。

修正后的你的代码示例:

Python部分:
from flask import Flask, render_template

app = Flask(__name__)
web_size = "100%"

def size():
    return "50px"

@app.route('/')
def home():
    # 把web_size和size()的返回值都传给模板
    return render_template("web.html", web_size=web_size, custom_size=size())
HTML模板部分(web.html):
<!-- 使用传递过来的web_size变量 -->
<div style="width: {{ web_size }};">这是宽度100%的容器</div>
<!-- 使用传递过来的custom_size变量(也就是size()函数的返回值) -->
<div style="width: {{ custom_size }};">这是宽度50px的容器</div>

这样渲染后,两个div的width就会被正确设置成你想要的值啦。

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

火山引擎 最新活动