怎么传url回后端_url_for函数——快速寻找url

我们已经知道,知道了url就可以找到对应的视图函数,那么现在问题来了,如果我们知道了视图函数,要怎么找到url呢?这时候我们就需要url_for函数了。

# coding: utf-8from flask import Flask, url_forimport flaskapp = Flask(__name__)  # type: Flaskapp.debug = True# 根目录@app.route('/')def hello_world():    return 'Hello World!'@app.route('/login/')def login():    print url_for('hello_world')    return 'success'if __name__ == '__main__':    app.run()

运行上面代码:

523656b5dee22af1169f5d5844f2206d.png

可以看到控制台打印出了hello_world函数的url。

当我们讲了模板以后,经常会遇到a标签比如我们都知道href里面放的是一个链接,试想现在我们判断用户是否登录成功,如果登录成功就跳转到p1页面,登录失败就跳转到p2页面,那么我们一般是不会再href里直接贴p1页面的url的,因为一旦p1页面地址改变,那么贴的url就会失效,试想你那么多代码,怎么可能记得住p1的url都在哪里用了呢?这时候就可以看到url_for的好处了,就是说我们会在href里放url_for我们需要反转的函数。

再看一个例子:

# coding: utf-8from flask import Flask, url_forimport flaskapp = Flask(__name__)  # type: Flaskapp.debug = True# 根目录@app.route('/')def hello_world():    return 'Hello World!'@app.route('/login/')def login():    return url_for('hello_world')@app.route('/list/')def mylist():    return url_for('login')if __name__ == '__main__':    app.run()

这时候进入http://127.0.0.1:5000/list/页面,就可以看到login的url了:

2adeee7650b83d9676d03e496d39d37c.png


上面说的是没有参数的url_for,如果没有参数,可以直接url_for('函数名')那如果我们构造的函数是:

@app.route('/login//')def login(page_id):    return u'登录页面'

这时候url_for该怎么传呢?

我们先来看一下url_for的源码:

a0d8ce7ad1ad96c2ca61d7ab2fd74bf8.png

我们注意到url_for可以传“两个”参数:

  • endpoint:结束点,即我们传的函数名
  • values:关键字参数即key=value形式

那我们现在就知道该怎么办了:

# coding: utf-8from flask import Flask, url_forimport flaskapp = Flask(__name__)  # type: Flaskapp.debug = True# 根目录@app.route('/')def hello_world():    return 'Hello World!'@app.route('/login//')def login(page_id):    return u'登录页面'@app.route('/list/')def mylist():    return url_for('login', page_id=1)if __name__ == '__main__':    app.run()

我们只需要像上面代码里一样,给url_for多传递一个参数即可,保存(Ctrl+s 以后不再强调了)以后,来到页面可以看到:

cc90db30c9ff9c0d886eef85803d6b0b.png

继续url_for的知识点

# coding: utf-8from flask import Flask, url_forimport flaskapp = Flask(__name__)  # type: Flaskapp.debug = True# 根目录@app.route('/')def hello_world():    return 'Hello World!'@app.route('/login//')def login(page_id):    return u'登录页面'@app.route('/list/')def mylist():    return url_for('login', page_id=1, title_id=2)if __name__ == '__main__':    app.run()

现在我们在mylist函数中的url_for多传一个参数,这时候会返回什么结果呢,执行代码可以看到:

00a72a82d312a3d7b1bbf4fcd49aab89.png

看上面的代码,如果现在我想在login函数中获取title_id,该怎么获取呢?我们之前已经写过的,我们可以通过修改login函数:

@app.route('/login//')def login(page_id):    title_id = flask.request.args.get('title_id')    return title_id

这样,在页面访问127.0.0.1:5000/login/2/页面显示的就是title_id。

现在我们来说url_for的另一个优点,就是它会自动对你传递的内容进行编码:

# coding: utf-8from flask import Flask, url_forimport flaskapp = Flask(__name__)  # type: Flaskapp.debug = True# 根目录@app.route('/')def hello_world():    return 'Hello World!'@app.route('/login//')def login(page_id):    return u'登录页面'@app.route('/list/')def mylist():    return url_for('login', page_id=1, title_id='/')if __name__ == '__main__':    app.run()

上面代码中,我们在mylist函数中给login函数传了一个title_id='/',然后页面中看到:

657cbad623a1aa3603838ea20599e0a3.png

页面对/进行了ASCII编码,/变成了%2F。这种机制就避免了url的混乱,比如我们地址是127.0.0.1:5000/login/,后面查询字符串中含有/,那地址就成了类似127.0.0.1:5000/login//这种url形式明显是错误的,但是如果我们用url_for,那么地址 就会自动转换为127.0.0.1:5000/login/%2F,如此一来就避免了url的错乱。

大家千万不要忽视函数上面的@app.route(),找了好几个代码显示样式,就是怕大家忽视这个问题。

如果对接口、性能、自动化测试、面试经验交流等感兴趣的,可以关注我的头条号,我会不定期的发放免费的资料,这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。欢迎分享,欢迎评论,欢迎转发。需要资料的同学可以关注小编+转发文章+私信【测试资料】

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值