为什么要用 url_for 而不是手写 URL?它能生成什么、不能生成什么?出错时的提示是什么?这篇把常见用法和各种错误都跑一遍。
url_for('index') → /
url_for('user', uid=7) → /user/7
url_for('user', uid=7, tab='info', page=2) → /user/7?tab=info&page=2
url_for('user', uid=7, _anchor='top') → /user/7#top
url_for('user', uid=7, _external=True) → http://localhost/user/7
url_for('user', uid=7, _external=True, _scheme='https') → https://localhost/user/7
url_for('files', p='a b/中文.txt') → /files/a%20b/%E4%B8%AD%E6%96%87.txt
url_for('user', uid=7, tags=['a', 'b']) → /user/7?tags=a&tags=b
url_for('user', uid=7, none=None) → /user/7上一篇:路由中的尾部斜杠行为;下一篇:静态文件路由的注册方式。
url_for('shop.item', iid=3) → /shop/item/3 | url_for('shop.shop_home') → /shop/
在非蓝图请求里写 url_for('.item') → BuildError: Could not build url for endpoint 'item' with values ['iid']. Did you mean 'shop.item' instead?
请求在蓝图里时 request.blueprint = shop | url_for('.item', iid=3) → /shop/item/3 endpoint 写错 url_for("usr", uid=1): BuildError: Could not build url for endpoint 'usr' with values ['uid']. Did you mean 'user' instead?
缺少必需参数 url_for("user"): BuildError: Could not build url for endpoint 'user'. Did you forget to specify values ['uid']?
参数类型不对 url_for("user", uid="x"): ValueError: invalid literal for int() with base 10: 'x'只有应用上下文,没设 SERVER_NAME → RuntimeError: Unable to build URLs outside an active request without 'SERVER_NAME' configured. Also configure 'APPLICATION_ROOT' and 'PREFERRED_URL_SCHEME' as needed. 设了 SERVER_NAME=example.test:5000、PREFERRED_URL_SCHEME=https → https://example.test:5000/user/1 | /user/1
app.url_for("user", uid=2) → /user/2
SCRIPT_NAME=/myapp 时 url_for("hi") → /myapp/hi
APPLICATION_ROOT=/prefix 且请求 /hi 时 url_for("hi") → /prefix/hi url_for("static", filename="css/site.css") → /static/css/site.css | url_for("static", filename="a b.js", v=3) → /static/a%20b.js?v=3