flask中使用url_for可以获取视图函数路由,但是使用过程中可能会不小心采坑!!!
url_for作用:
url_for有如下两个常见用法:
- 给指定的函数构造 URL,即获取指定视图函数的连接地址。
- 访问静态文件(CSS / JavaScript 等)。 只要在你的包中或是模块的所在目录中创建一个名为 static 的文件夹,在应用中使用 /static 即可访问
例1:使用url_for函数构造 URL代替使用直接路由
from . import admin # 导入蓝图admin from flask import render_template, redirect, url_for @admin.route("/") def index(): return render_template("admin/index.html") @admin.route("/login") def login(): return render_template("admin/login.html") @admin.route("/logout") def logout(): # return redirect("admin/login") # 直接使用路由 return redirect(url_for("admin.login")) # 使用url_for代替使用直接路由
例2:访问静态文件
参数
url_for()
也可以附带一些参数,比如想要完整的URL,可以设置_external
为Ture:
url_for('.static',_external=True,filename='pic/test.png')
这样返回的url是http://localhost/static/pic/test.png
- endpoint
URL的端点(即函数的名字) - values
URL的变量参数 - _external
如果设置为True
,则生成一个绝对路径URL - _scheme
一个字符串指定所需的URL方案。_external参数必须设置为True,不然会抛出ValueError。 - _anchor
如果设置了这个则给URL添加一个mao - _method
如果设置这个则显示地调用这个HTTP方法
url_for的两个坑
连接管理器url_for在使用过程中注意如下的两个坑
1 链接管理器可以获取视图函数的路由地址,但是注意他会自动忽略蓝图的路由
程序示例:
浏览器显示:
2 url_for操作对象是视图函数,而不是route里的路径。
如果route和函数名不一样而导致使用url_for()错误,千万不要去route找错误。
例如下面的代码:
from flask import Flask, url_for
app = Flask(\__name__)
@app.route('/')
def index():
pass
@app.route('/login')
def LOGIN():
pass
with app.test_request_context():
print(url_for('index'))
print(url_for('login'))
print(url_for('index'))
没有报错,就是一个反斜杠;print(url_for('login'))
报错,抛出BuildError异常:
/
Traceback (most recent call last):
File “<\pyshell#12>”, line 3, in
print(url_for(‘login’))
File “C:\Python35\lib\site-packages\flask\helpers.py”, line 332, in url_for
return appctx.app.handle_url_build_error(error, endpoint, values)
File “C:\Python35\lib\site-packages\flask\app.py”, line 1811, in handle_url_build_error
reraise(exc_type, exc_value, tb)
File “C:\Python35\lib\site-packages\flask_compat.py”, line 33, in reraise
raise value
File “C:\Python35\lib\site-packages\flask\helpers.py”, line 322, in url_for
force_external=external)
File “C:\Python35\lib\site-packages\werkzeug\routing.py”, line 1758, in build
raise BuildError(endpoint, values, method, self)
werkzeug.routing.BuildError: Could not build url for endpoint ‘login’. Did you mean ‘index’ instead?
把login修改为LOGIN:
with app.test_request_context():
print(url_for('index'))
print(url_for('LOGIN'))
打印正常:
/
/login