我们已经知道,知道了url就可以找到对应的视图函数,那么现在问题来了,如果我们知道了视图函数,要怎么找到url呢?这时候我们就需要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/')def login():
print url_for('hello_world') return 'success'if __name__ == '__main__':
app.run()

运行上面代码:

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

当我们讲了模板以后,经常会遇到a标签比如<a href=''>我们都知道href里面放的是一个链接,试想现在我们判断用户是否登录成功,如果登录成功就跳转到p1页面,登录失败就跳转到p2页面,那么我们一般是不会再href里直接贴p1页面的url的,因为一旦p1页面地址改变,那么贴的url就会失效,试想你那么多代码,怎么可能记得住p1的url都在哪里用了呢?这时候就可以看到url_for的好处了,就是说我们会在href里放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/')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_for可以传“两个”参数:

  • 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(),找了好几个代码显示样式,就是怕大家忽视这个问题。
以上内容希望对你有帮助,有被帮助到的朋友欢迎点赞,评论。

url_for函数——快速寻找url的更多相关文章

  1. flask中重定向所涉及的反推:由视图函数反推url

    flask中重定向所涉及的反推:由视图函数反推url 例如有视图index() 反推 url的/default # -*- coding: utf-8 -*- from flask import Fl ...

  2. flask之url_for函数

    一:url_for函数 干什么的?传入函数名,得到函数的路由地址(访问视图函数的地址) from flask import Flask from flask import url_for app = ...

  3. hdu 3307 Description has only two Sentences (欧拉函数+快速幂)

    Description has only two SentencesTime Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...

  4. Flask视图函数报fmalformed url rule错误的原因

    Flask视图函数报fmalformed url rule错误,原因可能是包含中文字符了 把标点符号都重新写一遍英文格式的,可能就不会报这个了

  5. path-to-regexp快速拆分 url 路径中的参数信息

    介绍一个小工具 path-to-regexp 用于快速拆解url path中的部分,贴别适合restful接口中快速获取对应的实体参数 git地址可以参考 https://github.com/pil ...

  6. DB2 函数快速构造测试数据

    函数快速构造测试数据 [案例]使用DB2内置函数快速构造测试数据 无论您是在用原型证明某一概念,还是开发一个全新的应用程序,或者只是学习 SQL,您都需要在您的应用程序上运行测试数据.为了有效地测试应 ...

  7. XMU 1615 刘备闯三国之三顾茅庐(三) 【欧拉函数+快速幂+欧拉定理】

    1615: 刘备闯三国之三顾茅庐(三) Time Limit: 1000 MS  Memory Limit: 128 MBSubmit: 45  Solved: 8[Submit][Status][W ...

  8. 【C++】使用find函数快速定位元素

    当有了STL,你还在用遍历的土方法定位元素吗? 今天就来介绍一下,如何使用algorithm库里的find函数快速定位数组或向量中的元素. 首先当然要包含头文件: #include <algor ...

  9. 1:时间戳转换成年月日函数,2:url截取参数方法,3:弹窗自定义方法 4:点击按钮加入购物车

    最近一直在使用vue.js来构建项目,先分享一下一些简单可复用的函数. 1:时间戳转换Date.prototype.format = function(fmt){ //author: yumeiqia ...

随机推荐

  1. ARC 062 F - Painting Graphs with AtCoDeer 割点 割边 不动点 burnside引理

    LINK:Painting Graphs with AtCoDeer 看英文题面果然有点吃不消 一些细节会被忽略掉. 问每条边都要被染色 且一个环上边的颜色可以旋转. 用c种颜色有多少本质不同的方法. ...

  2. Spark初探

    Apache Spark是一个针对大规模数据的快速.统一处理引擎. One stack rule them all 1-Stream Processing :spark Streaming 2-Ad- ...

  3. Spring与Mybatis整合占位符无法解析问题

    问题:写了一个新的dao接口,进行单元测试时提示: Initialization of bean failed; nested exception is org.springframework.bea ...

  4. day23:单继承&多继承&菱形继承&__init__魔术方法

    1.单继承 1.1 关于继承的一些基本概念 1.2 子类可以调用父类的公有成员 1.3 子类无法调用父类的私有成员 1.4 子类可以改写父类的方法 2.多继承 2.1 多继承的基本语法 2.2 sup ...

  5. 解惑4:java是值传递还是引用传递

    一.概述 曾经纠结了很久java的参数传递方式是什么样的,后面粗略的了解了一鳞半爪以后有了大概的印象:"传参数就是值传递,传对象就是引用传递",后面进一步查找了相关资料和文章以后, ...

  6. Python 告诉你疫情扩散有多可怕

    今年(2020年)是注定要铭记史册的一年,从年初开始新冠疫情,席卷了全球,中国人民众志成城,为战胜疫情做出了巨大牺牲.最近北京疫情形式又变得严峻,面对疫情我们不能掉以轻心.今天我们模拟一下病毒的扩散过 ...

  7. 事件 - DOM编程

    何为 DOM 事件,HTML DOM 使JavaScript 有能力对 HTML 事件做出反应. 1. 事件流 一个 DOM 事件可以分为捕获过程.触发过程.冒泡过程. 下面一个<a>元素 ...

  8. 内存总是不够?HBase&GeoMesa配置优化了解一下

    概况: 生产环境HBase集群内存经常处于高位(90%),而且GC之后也是内存依然处于高位,经分析内存全部由集群的regionserver进程所持有,,经常重启之后,大概3-4天就会保持在高位.由上述 ...

  9. Java 语法 try catch使用容易忽略的细节 BigDecimal

    try catch使用细节 一. try catch的使用方式容易理解,两者最终都要执行finally中的代码,而当return在try和catch中又会有什么效果? 如果我们做一个简单的例子就会发现 ...

  10. Nginx CORS 跨域资源共享问题

    ## 背景 新项目上线,前后端分离,遇到了跨域资源共享的问题,导致请求根本无法发送到后端,前端和后端貌似只能有一个来处理跨域问题,我们这边要采用nginx来解决跨域问题. ## Nginx的CORS配 ...