IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> flask学习记录04-重定向、自定义转换器和异常抛出与捕获 -> 正文阅读

[Python知识库]flask学习记录04-重定向、自定义转换器和异常抛出与捕获

有句谚语叫“学习如逆水行舟,不进则退”,但是在这种互联网高度内卷的环境下,我感觉不退即进。

图片

能够把之前学习到的知识不遗忘,也是一种进步,快跟小孟一起来回顾下flask吧,看看你有没有忘记?

图片

今天的核心知识如下:

  • 通过redirect和url_for进行路由重定向

  • 自定义一个list路由转换器

  • 异常抛出与捕获

路由重定向

方式一:redirect直接返回给前端

我们先来看下redirect的源码参数,非常简单有三个值,前两个是设置跳转的url和状态码,code默认为302,最后一个是对response返回对象的限制

图片

我们写一个demo来看下

from flask import Flask
from werkzeug.routing import redirect

app = Flask(__name__)


@app.route('/')
def index():
    return '<h1>开始学习flask</h1>'


@app.route('/index')
def welcome():
    return redirect('/index/123')


@app.route('/index/<username>')
def get_user(username):
    return '<h1>开始学习flask吧,我的{}</h1>'.format(username)


if __name__ == '__main__':
    app.run(debug=True)

浏览器可以看到访问/index,成功跳转到/index/123,且code为302;

图片

方式二:redirect中加入url_for方法,根据定义的方法名进行跳转,且可传递参数

redirect可以跳转也可以传参数,为什么要加入url_for呢?

因为通过redirect跳转的路由,如果原路由发生了变化,必须手动修改跳转的路由,不然就会找不到路由,报404错误。

我们写个demo看下,通过welcome对应的路由,访问get_user对应的路由,即使路由变了,也可以访问最新的路由

from flask import Flask, url_for
from werkzeug.routing import redirect

app = Flask(__name__)


@app.route('/')
def index():
    return '<h1>开始学习flask</h1>'


@app.route('/index')
def welcome():
    return redirect(url_for('get_user', username='1234'))


@app.route('/index/<username>')
def get_user(username):
    return '<h1>开始学习flask吧,我的{}</h1>'.format(username)


if __name__ == '__main__':
    app.run(debug=True)

未修改路由地址时,查看返回的信息

图片

修改路由后,url_for自动访问新的路由,返回的信息与之前的一致

图片

修改路由后,redirect不会访问新的路由地址,出现404 Not Found

图片

自定义转换器

需求:定义一个列表路由转换器,用于路由参数为列表数据类型时,对参数做处理如:

传递参数[1,2,3,4]--后端直接返回的参数

输入参数为'1,2,3,4'--用户浏览器输入的参数

输出参数[1,2,3,4]--页面显示的参数 

分析:默认情况下参数是字符串类型,需要把传递参数转换为字符串,正则判断是否符合,然后再转换回列表

之前我们有学习到常见的路由转换器有int/float/string(默认),那么我们通过源码,来看下默认的转换器都有哪些?

图片

我们通过int转换器来看看它继承关系

图片

发现最终都是继承的BaseConveter类,那我们继承此类,写一个列表路由转换器

from flask import Flask, url_for
from werkzeug.routing import redirect, BaseConverter

app = Flask(__name__)


class ListConverter(BaseConverter):
    def __init__(self, url_map, *args):
        # 路由url不变
        super(ListConverter, self).__init__(url_map)
        # regex规则自定义
        self.regex = args[0]

    # 在调用视图函数之前对url参数进行处理
    def to_python(self, value):
        return value.split(',')

    # 在匹配路由之前,对传入的url参数进行处理
    def to_url(self, value):
        result = ','.join([str(i) for i in value])
        # print(result)
        return result


# 把自定定义的装饰器配置到路由默认装饰器中去
app.url_map.converters["list"] = ListConverter


@app.route('/')
def index():
    return '开始学习flask'


@app.route('/wel')
def welcome():
    return redirect(url_for('get_user', username=[1, 3, 5, 7]))


@app.route('/index/<list("(\d+,+?)+\d+$"):username>')
def get_user(username):
    return "看下输入的是否是一个列表:{}".format(username)


if __name__ == '__main__':
    app.run(debug=True)

这里用到了源码中的两个方法,to_python 和 to_url

这两个方法的主要作用如上方代码中的注释,下边我们看下效果是什么样的

图片

上边实例将这节讲到的redirect、url_for、to_python、to_url和正则表达式都覆盖了,如果需要可以自己练习下

我在敲这个实例的时候,遇到了几个阻力,一个是重写BaseConverter时,一个是正则表达覆盖时,之后要多加练习

推荐一个在线练习正则表达式的地址:https://c.runoob.com/front-end/854/

异常抛出与捕获

1.通过abort方法抛出异常

from flask import Flask,abort

app = Flask(__name__)

@app.route('/')
def index():
    return '开始学习flask'
    
if __name__ == '__main__':
    app.run(debug=True)

abort方法一旦启动,会中止本次请求,返回对应状态码的错误信息

图片

系统的默认提示真是好丑,我们可以通过errorhandler装饰器去捕获异常,并返回新的提示信息

from flask import Flask, url_for, abort

app = Flask(__name__)

@app.route('/')
def index():
    abort(404)
    return '开始学习flask'


# 捕获404错误,并返回提示信息
@app.errorhandler(404)
def pagenotfound(e):
    return '咦,页面哪里去了,偷偷跑到萌货那里学习了吗?'


if __name__ == '__main__':
    app.run(debug=True)


可以看到页面已经捕获到了404异常,并且返回了我们自定义的提示信息

图片

本次分享到这里,这节写的周期比较长,周日学习的内容,硬是凭借着记忆在公司电脑里又敲了一遍,然后写下这篇文章,不过又手敲一遍,印象更深刻了

欢迎关注微信公众号【测试开发萌货】,定期分享更多测试干货~

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-10-29 12:58:42  更:2021-10-29 13:02:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 22:58:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码