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 30 Python
使用rst2pdf实现将sphinx生成PDF
Jun 07 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
Feb 18 Python
python3+PyQt5实现自定义分数滑块部件
Apr 24 Python
python在回调函数中获取返回值的方法
Feb 22 Python
python re.sub()替换正则的匹配内容方法
Jul 22 Python
python编写简单端口扫描器
Sep 04 Python
python如何处理程序无法打开
Jun 16 Python
Idea安装python显示无SDK问题解决方案
Aug 12 Python
图解Python中深浅copy(通俗易懂)
Sep 03 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
Mar 04 Python
Python如何配置环境变量详解
May 18 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 Session_Regenerate_ID函数双释放内存破坏漏洞
2011/01/27 PHP
解析PHP中数组元素升序、降序以及重新排序的函数
2013/06/20 PHP
php获取一个变量的名字的方法
2014/09/05 PHP
php字符串的替换,分割和连接方法
2016/05/23 PHP
PHP页面间传递值和保持值的方法
2016/08/24 PHP
解决laravel 表单提交-POST 异常的问题
2019/10/15 PHP
goto语法在PHP中的使用教程
2020/09/17 PHP
通过js动态操作table(新增,删除相关列信息)
2012/05/23 Javascript
Js日期选择自动填充到输入框(界面漂亮兼容火狐)
2013/08/02 Javascript
jQuery中校验时间格式的正则表达式小结
2013/09/22 Javascript
js、jquery图片动画、动态切换示例代码
2014/06/03 Javascript
jquery判断checkbox是否选中及改变checkbox状态的实现方法
2016/05/26 Javascript
jQuery解析与处理服务器端返回xml格式数据的方法详解
2016/07/04 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
jQuery解析返回的xml和json方法详解
2017/01/05 Javascript
nodejs基础应用
2017/02/03 NodeJs
layui.js实现的表单验证功能示例
2017/11/15 Javascript
JavaScript:ES2019 的新特性(译)
2019/08/08 Javascript
简述ES6新增关键字let与var的区别
2019/08/23 Javascript
简单分析js中的this的原理
2019/08/31 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
2020/01/26 Javascript
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
R vs. Python 数据分析中谁与争锋?
2017/10/18 Python
python实现神经网络感知器算法
2017/12/20 Python
Python实现将照片变成卡通图片的方法【基于opencv】
2018/01/17 Python
python统计多维数组的行数和列数实例
2018/06/23 Python
使用Python批量修改文件名的代码实例
2019/01/24 Python
利用Python实现微信找房机器人实例教程
2019/03/10 Python
Jupyter notebook如何修改平台字体
2020/05/13 Python
经济实惠的豪华背包和行李袋:Packs Project
2018/10/17 全球购物
三八活动策划方案
2014/08/17 职场文书
股东授权委托书范本
2014/09/13 职场文书
一般党员对照检查材料
2014/09/24 职场文书
教代会闭幕词
2015/01/28 职场文书
总经理岗位职责
2015/02/04 职场文书
详解Python中下划线的5种含义
2021/07/15 Python