flask框架url与重定向操作实例详解


Posted in Python onJanuary 25, 2020

本文实例讲述了flask框架url与重定向操作。分享给大家供大家参考,具体如下:

1. url与函数的映射

当我们新建一个flask项目的时候,默认就会有一个hello_world函数,如下面这样

@app.route('/')
def hello_world():
  return 'hello world'

上面函数中,app.route()的参数就是我们的url,当我们启动项目的时候,我们在浏览器中输入127.0.0.1:5000,就能够访问到我们这个视图了,因为/就是代表"根url",所以我们只需要ip地址和端口就访问到了我们的这个函数视图。

当我们将app.route()的参数改为'/hello/'时,那我们访问这个视图就需要输入网址为127.0.0.1:5000/hello/才能访问到我们的这个视图了,

这就是flask中url与函数的映射。

2. url传入参数

  1. url中包含参数

当我们访问CSDN,博客园,简书等网站中的文章详情的时候,我们会发现起始每篇文章的详情页面的url前面不封都是一样的,只有后面一部分不一样。那么这个不一样的部分我们就可以当做一个参数传入视图中,然后我们在视图中拿到相应的参数在进行相应的操作,返回相应的数据。那么在flask中怎样实现这个功能呢?

@app.route('/article_detail/<article_id>/')
def article_detail(article_id):
  return "你查看到文章id 为 %s" % article_id

在上面的函数视图中,app.route()中用<>这个包裹起来的就是我们定义的参数,这里我们就定义了一个article_id这样的参数。当我们在url中定义了一个参数之后,我们必须也在函数中写入这个参数,而且参数名必须和url中的参数名一致。然后我们就可以在视图中拿到article_id这个参数的值了。

然后启动项目,在浏览器中输入127.0.0.1:5000/article_detail/3/等相似 的url,就能够查看到相应的效果了。

上面的例子中虽然我们能够将参数通过url传入函数视图中,但是我们并不能对url做类型限制,比如我们想要的article_id必须是一个int数据,当用户传入的参数不是int型的数据的时候,那么他就访问不到我们这个函数视图.出现404页面.那么flask中怎样实现这样这个需求呢?

在flask中,我们是可以对url指定类型的。

@app.route('/article_detail/<int:article_id>/')
def article_detail(article_id):
  return "你查看到文章id 为 %s" % article_id

这样,我们就对传入的参数做了类型限制。只需要参数前面写上我们的类型就可以了.

在flask中,除了支持int类型外,还支持以下类型:

  • string: 默认的数据类型,接受没有任何斜杠/的字符串。
  • int: 整形
  • float: 浮点型。
  • path: 和string类似,但是可以传递斜杠/。
  • uuid: uuid类型的字符串。(什么是uuid?)
  • any:可以指定多种路径,这个通过一个例子来进行说明:
@app.route('/<any(blog,article):url_path>/<int:id>/')
def detail(url_path,id):
  if url_path == 'blog':
    return 'blog detail is ' + str(id)
  else:
    return 'article detail is ' + str(id)

这样,我们在浏览器中输入127.0.0.1:5000/blog/3/127.0.0.1:5000/article/3/都能够访问到这个视图,那么我们怎么知道当前是以哪个url访问的呢,我们可以通过:后面我们定义的url_path参数来接受这个值,然后我们在视图中也要写入这个参数。然后我们就能拿到这个值了.

  1. url中以查询字符窜的方式传递参数(get请求)

有些时候,我们并不需要向上面那样传递参数,通过?xxx=xxx这样的形式传递参数。

那么在flask中,我们怎样得到这种参数的值呢?

from flask import request
@app.route('/search/')
def search():
  name = request.args.get('name')
  return "查询字符串传入参数 %s" % name

比如在上面的视图函数中,我想传入name=xxx,以查询字符窜的方式(get请求),那么我们直接在浏览器中输入127.0.0.1:5000/search/?name=xxx,然后我们在函数视图中通过request.args.get()方法就能够拿到这个值了。

如果我们url中没有传入name这个参数,那么我们的程序也不会报错,只会得到一个None,并不会影响我们代码的运行。

3. 构造url,url_for的使用

在上面的代码中,都是通过在浏览器中输入url,从而找到我们的视图函数。那么我们可不可以反过来呢,知道视图函数,从而得到相应的url。

这个时候我们就需要使用url_for了,首先我们的先导入。

from flask import url_for
@app.route('/url_for/')
def url_for_demo():
  return 'url_for_demo'
@app.route('/index/')
def index():
  #        函数的名字
  return url_for('url_for_demo')

url_for中参数为函数的名字,如果传入的函数不存在就会报错。让我们在浏览器中输入127.0.0.1:5000/index/的时候,我们就能够看到url_for_demo这个函数对应的url了。没有参数的url学会了,那么如果url中携带参数怎么办?

在url_for这个函数中,我们也是可以传入关键字参数的,只需要和url中的参数对应上就好了。

@app.route('/article/<int:article_id>/')
def article_detail(article_id):
  return "article id is " + str(article_id)
@app.route('/index/')
def index():
  # 注意 这里的关键字参数的key不是随便取的,必须的和该函数对应的url中参数名一样
  url = url_for('article_detail',article_id=2)
  return url

这样,我们也能在url_for中传入url的参数了

那么如果我们在url_for中传入url中不存在的关键字参数,会怎么样呢?

@app.route('/article/<int:article_id>/')
def article_detail(article_id):
  return "article id is " + str(article_id)
@app.route('/index/')
def index():
  # 注意 这里的关键字参数的key不是随便取的,必须的和该函数对应的url中参数名一样
  url = url_for('article_detail',article_id=2,name='xxx')
  return url

当我们访问这个url的时候,就会返回这样的一个url:/article/2/?name=xxx

也就是说,当我们传入url中没有的关键之参数,url_for就会以查询字符窜的方式给我们添加到url上。

那么我们的到函数对应的url有什么用呢?

url_for一般是和重定向一起使用,一般不会单独使用,所以接下来我们来讲重定向。

4. 重定向

重定向分为永久性重定向与暂时性重定向

  • 永久性重定向:http的状态码为301,多用于旧网址废弃了,需要转到一个新的网址确保用户的访问。比如京东的网站。当我们输入jingdong.com的时候,浏览器会给我们重新跳转至jd.com这个网页,因为jingdong.com这个网址已经被废弃了,所以会给我们重新跳转至jd.com。这就是永久性重定向。
  • 暂时性重定向:http的状态码为302,表示页面的暂时性跳转,比如在一个网站中我们直接访问个人中心页面,但是因为没有登陆,所以就会直接给我们跳转至登陆页面。

在flask中,使用重定向需要使用到direct这个函数.

我们通过一个小例子来说明重定向的使用。

需求:当我们访问个人中心的时候,如果没有登陆,就需要跳转至登陆页面,这里我们假设在url中传入了name参数,就认为是登陆了。代码如下

from flask import redirect,url_for
@app.route('/login/')
def login():
  return 'login'
@app.route('/profile/')
def profile():
  name = request.args.get('name')
  if name:
    return 'profile 页面'
  else:
    return redirect( url_for('login') )

上面的代码就实现了我们的需求。

这个时候可能有人会问,在redirect函数中,我们也可以不使用url_for,直接构造手动构造url啊,也不是特别麻烦的,例如这样。return redirect('login'),这样,我也能直接跳转至login页面啊。

这里就大概说一下使用url_for的好处吧:

  • 当我们的项目特别大的时候,如果某一天老板需要我们修改一下url,例如将/index/修改为/xxx/index/,那么我们在app.route中修改了之后,如果我们的项目中大量的使用的redirect重定向到我们的这个函数视图中,那么我们就必须的去代码中一个一个的找出来,然后去修改代码,而如果我们使用了url_for,那就不会出现这样的问题了,直接修改@app.route就行了,而其他地方因为我们使用的是url_for生成的,所以完全不需要我们去修改。
  • 当我们的url中拥有特殊字符的时候,如'/',如果我们直接手动构造这个参数的话,那么就可能会出现歧义了,这个'/‘是当做url中的'/‘来识别呢还是当做一个普通的字符'/‘来识别呢,所以可能就会出现页面找不到的情况,而使用url_for的话,url_for就会将'/'编码,然后我们使用的时候优惠解码回来,所以就不会出翔上面那种状况。

5. 指定HTTP请求方法

有些时候,我们的一个视图只允许POST方法访问,而@app.route()默认只允许GET方法,那么我们如何指定允许请求的方法呢?

@app.route()中可以传入一个关键字参数methods来指定本方法支持的HTTP方法

# 只允许POST方法
@app.route('/post_demo/',methods=['POST'])
def post_demo():
  return 'post'
# 默认的就是这种情况,所以当方法为get请求是,我们一般都省略不写
@app.route('/get_demo/',methods=['GET'])
def get_demo():
  return 'get'
# GET,POST方法都允许
@app.route('/all_demo/',methods=['POST','GET'])
def all_demo():
  return 'all'

注意:

@app.route('/index')@app.route('/index/')起始是对应的两个url,一般我们在项目中,都是使用后面一种,因为在有些浏览器中,当我们最后面没有加'/'时,浏览器会自动给我们添加上去,而我们有没有这样的一个url,所以就有可能会造成页面找不到的情况。所以在项目中,我们一般都会写成后面那种形式。

希望本文所述对大家基于flask框架的Python程序设计有所帮助。

Python 相关文章推荐
跟老齐学Python之私有函数和专有方法
Oct 24 Python
python中多个装饰器的执行顺序详解
Oct 08 Python
python如何实现代码检查
Jun 28 Python
pyecharts动态轨迹图的实现示例
Apr 17 Python
Jupyter Notebook的连接密码 token查询方式
Apr 21 Python
Python基于paramunittest模块实现excl参数化
Apr 26 Python
python实现将中文日期转换为数字日期
Jul 14 Python
聊聊python中的循环遍历
Sep 07 Python
Python爬虫代理池搭建的方法步骤
Sep 28 Python
Python之字典添加元素的几种方法
Sep 30 Python
python 批量下载bilibili视频的gui程序
Nov 20 Python
Python 内存管理机制全面分析
Jan 16 Python
flask框架蓝图和子域名配置详解
Jan 25 #Python
flask框架渲染Jinja模板与传入模板变量操作详解
Jan 25 #Python
如何在 Django 模板中输出 &quot;{{&quot;
Jan 24 #Python
在keras中获取某一层上的feature map实例
Jan 24 #Python
keras获得model中某一层的某一个Tensor的输出维度教程
Jan 24 #Python
使用Tensorflow实现可视化中间层和卷积层
Jan 24 #Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
Jan 24 #Python
You might like
php并发对MYSQL造成压力的解决方法
2013/02/21 PHP
php共享内存段示例分享
2014/01/20 PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
2014/08/11 PHP
Laravel中9个不经常用的小技巧汇总
2019/04/16 PHP
PHP filter_var() 函数, 验证判断EMAIL,URL等
2021/03/09 PHP
jquery 弹出登录窗口实现代码
2009/12/24 Javascript
iframe窗口高度自适应的实现方法
2014/01/08 Javascript
js获取通过ajax返回的map型的JSONArray的方法
2014/01/09 Javascript
浅谈$(document)和$(window)的区别
2015/07/15 Javascript
Bootstrap实现input控件失去焦点时验证
2016/08/04 Javascript
jQuery实现表格文本框淡入更改值后淡出效果
2016/09/27 Javascript
解决vue+webpack打包路径的问题
2018/03/06 Javascript
vue与vue-i18n结合实现后台数据的多语言切换方法
2018/03/08 Javascript
打通前后端构建一个Vue+Express的开发环境
2018/07/17 Javascript
如何实现一个webpack模块解析器
2018/10/24 Javascript
vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)
2018/11/05 Javascript
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
2018/11/29 Javascript
vue element upload实现图片本地预览
2019/08/20 Javascript
解决vue+webpack项目接口跨域出现的问题
2020/08/10 Javascript
详解Vue的mixin策略
2020/11/19 Vue.js
token 机制和实现方式
2020/12/15 Javascript
Python常见文件操作的函数示例代码
2011/11/15 Python
使用Python实现简单的服务器功能
2017/08/25 Python
python+pyqt实现12306图片验证效果
2017/10/25 Python
django反向解析和正向解析的方式
2018/06/05 Python
Python imageio读取视频并进行编解码详解
2019/12/10 Python
Python用input输入列表的实例代码
2020/02/07 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
CSS3圆角和渐变2种常用功能详解
2016/01/06 HTML / CSS
Order by的几种用法
2013/06/16 面试题
资深财务管理人员自我评价
2013/09/22 职场文书
成人大专自我鉴定范文
2013/10/19 职场文书
买房子个人收入证明
2014/01/16 职场文书
2014班子成员自我剖析材料思想汇报
2014/10/01 职场文书
二年级语文上册复习计划
2015/01/19 职场文书
城南旧事电影观后感
2015/06/16 职场文书