url_for函数——快速寻找url

咱们已经知道,知道了url就能够找到对应的视图函数,那么如今问题来了,若是咱们知道了视图函数,要怎么找到url呢?这时候咱们就须要url_for函数了。python

# coding: utf-8from flask import Flask, url_forimport flask app = 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() 

运行上面代码:面试

能够看到控制台打印出了hello_world函数的url。flask

当咱们讲了模板之后,常常会遇到a标签好比<a href=''>咱们都知道href里面放的是一个连接,试想如今咱们判断用户是否登陆成功,若是登陆成功就跳转到p1页面,登陆失败就跳转到p2页面,那么咱们通常是不会再href里直接贴p1页面的url的,由于一旦p1页面地址改变,那么贴的url就会失效,试想你那么多代码,怎么可能记得住p1的url都在哪里用了呢?这时候就能够看到url_for的好处了,就是说咱们会在href里放url_for咱们须要反转的函数。ruby

再看一个例子:app

# coding: utf-8from flask import Flask, url_forimport flask app = 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了:函数

 

上面说的是没有参数的url_for,若是没有参数,能够直接url_for('函数名')那若是咱们构造的函数是:测试

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

这时候url_for该怎么传呢?编码

咱们先来看一下url_for的源码:url

咱们注意到url_for能够传“两个”参数:spa

  • endpoint:结束点,即咱们传的函数名

  • values:关键字参数即key=value形式

那咱们如今就知道该怎么办了:

# coding: utf-8from flask import Flask, url_forimport flask app = Flask(__name__) # type: Flaskapp.debug = True# 根目录@app.route('/')def hello_world(): return 'Hello World!'@app.route('/login/<page_id>/')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 之后再也不强调了)之后,来到页面能够看到:

继续url_for的知识点

# coding: utf-8from flask import Flask, url_forimport flask app = Flask(__name__) # type: Flaskapp.debug = True# 根目录@app.route('/')def hello_world(): return 'Hello World!'@app.route('/login/<page_id>/')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多传一个参数,这时候会返回什么结果呢,执行代码能够看到:

看上面的代码,若是如今我想在login函数中获取title_id,该怎么获取呢?咱们以前已经写过的,咱们能够经过修改login函数:

@app.route('/login/<page_id>/')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 flask app = Flask(__name__) # type: Flaskapp.debug = True# 根目录@app.route('/')def hello_world(): return 'Hello World!'@app.route('/login/<page_id>/')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() 

若是对软件测试、接口测试、自动化测试、面试经验交流。感兴趣能够加软件测试交流:1085991341,还会有同行一块儿技术交流。
上面代码中,咱们在mylist函数中给login函数传了一个title_id='/',而后页面中看到:

页面对/进行了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(),找了好几个代码显示样式,就是怕你们忽视这个问题。以上内容但愿对你有帮助,有被帮助到的朋友欢迎点赞,评论。

相关文章
相关标签/搜索