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异常,并且返回了我们自定义的提示信息

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

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

posted @ 2021-10-28 19:26  梦途的测开笔记  阅读(66)  评论(0编辑  收藏  举报