一直以来对url_for函数的用法很模糊,看了一篇文章终于有些了解了。https://blog.youkuaiyun.com/yannanxiu/article/details/52287870
url_for()函数是用于构建指定函数的URL。
url_for操作对象是函数,而不是route里的路径。
写一个测试代码:
from flask import Flask,url_for
app = Flask(__name__)
@app.route('/')
def index():
return "hello"
@app.route('/login')
def login():
return "world"
with app.test_request_context():
print(url_for('index'))
print(url_for('login'))
运行后结果是这样的:
/
/login
然后我将login()这个函数名字改为LOGIN(),再次运行,然后就报错了。因为这时候不再有login()这个函数存在了,url_for不能构造关于login的新链接了。
BuildError: Could not build url for endpoint ‘login’. Did you mean ‘index’ instead?
在python+flask的web开发中,url_for() 函数最简单的用法是以视图函数名作为参数, 返回对应的 URL。还可以用redirect函数进行跳转。它是重定向函数,输入一个URL后,自动跳转到另一个URL所在的地址,下面是一段代码实例。
from flask import Flask,url_for,render_template,redirect
app = Flask(__name__)
@app.route('/')
def index():
return redirect(url_for('user_index',username='default'))
@app.route('/user/<username>/<userid>')
def user_index(username,userid):
return render_template('index.html',username=username)
执行上面这代码的时候,我们访问程序给出的http://127.0.0.1/5000页面,这时由于redirect函数的作用,页面会跳转到由url_for函数生成的链接的页面。显示index.html里面的内容。我们可以看到,usr_for函数的第一个参数是函数名user_index,就是说,它会返回user_index对应的URL,也就是http://127.0.0.1/5000/user/defualt 。
对于url_for的一点新发现
先贴代码:
class Course(Base):
...
@property
def url(self):
return url_for('course.detail',course_id=self.id)
上面这个类是一个数据库的映射对象,对应数据库的一张表。为了后面方便,我给它增加了一个url属性。可以看到,url_for函数的第一个参数是‘course.detail’。detail这个函数在另一个python模块中,并且course这个文件夹和当前这段代码所在的文件夹并不在同一目录。所以这一点我觉得有点奇怪。
还有一个点,使用url_for() 生成动态地址时, 将动态部分作为关键字参数传入。例如,
url_for ('user', name='john', _external=True)
的返回结果是http://localhost:5000/user/john。 传入url_for() 的关键字参数不仅限于动态路由中的参数。函数能将任何额外参数添加到 查询字符串中。例如,url_for(‘index’, page=2) 的返回结果是/?page=2。