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异常,并且返回了我们自定义的提示信息
本次分享到这里,这节写的周期比较长,周日学习的内容,硬是凭借着记忆在公司电脑里又敲了一遍,然后写下这篇文章,不过又手敲一遍,印象更深刻了
欢迎关注微信公众号【测试开发萌货】,定期分享更多测试干货~