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

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

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

  • 相关阅读:
    简明Python3教程 12.问题解决
    简明Python3教程 11.数据结构
    【SPOJ 694】Distinct Substrings
    【codeforces Manthan, Codefest 17 C】Helga Hufflepuff's Cup
    【CF Manthan, Codefest 17 B】Marvolo Gaunt's Ring
    【CF Manthan, Codefest 17 A】Tom Riddle's Diary
    【SPOJ 220】 PHRASES
    【POJ 3261】Milk Patterns
    【POJ 3294】Life Forms
    【POJ 1226】Substrings
  • 原文地址:https://www.cnblogs.com/mengxinfeng/p/15477302.html
Copyright © 2011-2022 走看看