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 相关文章推荐
Python3实现连接SQLite数据库的方法
Aug 23 Python
零基础写python爬虫之使用Scrapy框架编写爬虫
Nov 07 Python
Python中利用原始套接字进行网络编程的示例
May 04 Python
Python基于动态规划算法计算单词距离
Jul 25 Python
Python中如何获取类属性的列表
Dec 26 Python
Python使用base64模块进行二进制数据编码详解
Jan 11 Python
tensorflow实现简单的卷积网络
May 24 Python
详解django2中关于时间处理策略
Mar 06 Python
pytorch numpy list类型之间的相互转换实例
Aug 18 Python
django 做 migrate 时 表已存在的处理方法
Aug 31 Python
Django中template for如何使用方法
Jan 31 Python
Python正则表达式中flags参数的实例详解
Apr 01 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
最省空间的计数器
2006/10/09 PHP
php异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE  eval()'d code error
2011/05/19 PHP
PHP实现Soap通讯的方法
2014/11/03 PHP
Zend Framework创建自己的动作助手详解
2016/03/05 PHP
Extjs列表详细信息窗口新建后自动加载解决方法
2010/04/02 Javascript
Prototype的Class.create函数解析
2011/09/22 Javascript
Java/JS获取flash高宽的具体方法
2013/12/27 Javascript
js(JavaScript)实现TAB标签切换效果的简单实例
2014/02/26 Javascript
JavaScript分秒倒计时器实现方法
2015/02/02 Javascript
浅谈JS中的bind方法与函数柯里化
2016/08/10 Javascript
AngularJS模块详解及示例代码
2016/08/17 Javascript
Bootstrap缩略图的创建方法
2017/03/22 Javascript
JavaScript hasOwnProperty() 函数实例详解
2017/08/04 Javascript
详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
2017/08/09 jQuery
JavaScript数据结构与算法之队列原理与用法实例详解
2017/11/22 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
2018/08/13 Javascript
jquery简单实现纵向的无缝滚动代码实例
2019/04/01 jQuery
Angular2实现的秒表及改良版示例
2019/05/10 Javascript
React+EggJs实现断点续传的示例代码
2020/07/07 Javascript
[01:07:53]RNG vs VG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python生成器的使用方法
2013/11/21 Python
基python实现多线程网页爬虫
2015/09/06 Python
Python对文件操作知识汇总
2016/05/15 Python
python tensorflow学习之识别单张图片的实现的示例
2018/02/09 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
2018/05/30 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
2018/06/19 Python
pandas进行时间数据的转换和计算时间差并提取年月日
2019/07/06 Python
Python 使用指定的网卡发送HTTP请求的实例
2019/08/21 Python
python飞机大战pygame游戏之敌机出场实现方法详解
2019/12/17 Python
python爬虫实例之获取动漫截图
2020/05/31 Python
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
迪斯尼商品官方网站:ShopDisney
2016/08/01 全球购物
独特的礼品和创新的科技产品:The Grommet
2018/02/24 全球购物
学校安全防火方案
2014/06/07 职场文书
学校安全管理制度
2015/08/06 职场文书
JS轻量级函数式编程实现XDM三
2022/06/16 Javascript