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 相关文章推荐
zbar解码二维码和条形码示例
Feb 07 Python
Python Grid使用和布局详解
Jun 30 Python
详解Django+Uwsgi+Nginx 实现生产环境部署
Nov 06 Python
Python实现定时自动关闭的tkinter窗口方法
Feb 16 Python
python整小时 整天时间戳获取算法示例
Feb 20 Python
使用python os模块复制文件到指定文件夹的方法
Aug 22 Python
python字符串下标与切片及使用方法
Feb 13 Python
pycharm 中mark directory as exclude的用法详解
Feb 14 Python
python数据库开发之MongoDB安装及Python3操作MongoDB数据库详细方法与实例
Mar 18 Python
python利用platform模块获取系统信息
Oct 09 Python
Python用dilb提取照片上人脸的示例
Oct 26 Python
利用Python实现翻译HTML中的文本字符串
Jun 21 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&amp;&amp;mysql)五
2006/10/09 PHP
php图片验证码代码
2008/03/27 PHP
php目录操作函数之获取目录与文件的类型
2010/12/29 PHP
php基于str_pad实现卡号不足位数自动补0的方法
2014/11/12 PHP
Zend Framework入门教程之Zend_Config组件用法详解
2016/12/09 PHP
PHP使用pdo实现事务处理操作示例
2018/09/05 PHP
jquery属性过滤选择器使用示例
2013/06/18 Javascript
可自定义速度的js图片无缝滚动示例分享
2014/01/20 Javascript
javascript写的一个模拟阅读小说的程序
2014/04/04 Javascript
js密码强度校验
2015/11/10 Javascript
详解JavaScript中|单竖杠运算符的使用方法
2016/05/23 Javascript
再谈Javascript中的异步以及如何异步
2016/08/19 Javascript
HTML页面定时跳转方法解析(2种任选)
2016/12/22 Javascript
fckeditor部署到weblogic出现xml无法读取及样式不能显示问题的解决方法
2017/03/24 Javascript
jQuery 表单序列化实例代码
2017/06/11 jQuery
JS实现颜色的10进制转化成rgba格式的方法
2017/09/04 Javascript
js实现上传按钮并显示缩略图小轮子
2020/05/04 Javascript
Python中多线程及程序锁浅析
2015/01/21 Python
python结合shell查询google关键词排名的实现代码
2016/02/27 Python
python单例模式获取IP代理的方法详解
2018/09/13 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
Python循环中else,break和continue的用法实例详解
2019/07/11 Python
详解基于python的多张不同宽高图片拼接成大图
2019/09/26 Python
在Python中预先初始化列表内容和长度的实现
2019/11/28 Python
Python实现在线批量美颜功能过程解析
2020/06/10 Python
Python调用ffmpeg开源视频处理库,批量处理视频
2020/11/16 Python
世界最大的海报和艺术印刷商店:AllPosters.com
2017/02/01 全球购物
设置器与访问器的定义以及各自特点
2016/01/08 面试题
军训教官感言
2014/03/02 职场文书
锦旗标语大全
2014/06/23 职场文书
学习计划书怎么写
2014/09/15 职场文书
机关干部四风问题自查报告及整改措施
2014/10/26 职场文书
2014年村计划生育工作总结
2014/11/14 职场文书
党员“一帮一”活动总结
2015/05/07 职场文书
Golang生成Excel文档的方法步骤
2021/06/09 Golang
总结Python使用过程中的bug
2021/06/18 Python