zoukankan      html  css  js  c++  java
  • 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入门_绘制多个五角形_turtle
    Selenium3+python自动化6-八种元素元素定位(Firebug和firepath)
    MongoDB入门(3)- MongoDB备份与恢复
    MongoDB入门(2)- MongoDB安装
    MongoDB入门(1)- MongoDB简介
    Elastic Search操作入门
    应用Xml.Linq读xml文件
    Struts2入门(1)-第一个Struts2程序
    Hibernate入门(4)- Hibernate数据操作
    Hibernate入门(3)- 持久对象的生命周期介绍
  • 原文地址:https://www.cnblogs.com/mengxinfeng/p/15477302.html
Copyright © 2011-2022 走看看