美文网首页
2020-05-29--flask02--flask基础02

2020-05-29--flask02--flask基础02

作者: program_white | 来源:发表于2020-05-30 14:43 被阅读0次

    本节内容

    • 路由参数限定
    • 指定请求方式
    • 返回Json数据
    • 重定向
    • 自定义状态码
    • 自定义转换器
    • 异常捕获

    路由的参数限定

    flask路由传递参数默认为str类型,我们可以进行限定类型:
    在参数的前边加上 ---- 类型名:

    #指定参数类型为int类型,也可以指定为其他。
    @app.route('/user/<int:user_id>')
    def user_info2(user_id):
        return f'hello2{user_id}'
    

    访问:

    127.0.0.1:5001/user/123
    

    使用的是:

    from werkzeug.routing import IntegerConverter
    
    IntegerConverter类进行处理
    

    指定请求方式

    from flask import request
    #请求方式的限定,默认为GET,
    @app.route('/demo1',methods=['GET','POST'])
    def demo1():
        return request.method
    

    使用postman进行测试:
    使用get方式:



    使用post方式:


    返回JSON格式

    一种通用数据格式

    JSON与字典的互相转换

    tvs = '''          #json字符串
    {
    "subjects": [
    {
    "rate": "7.5",
    "cover_x": 4429,
    "cover_x": "传闻中的陈芊芊",
    "url": "https://movie.douban.com/subject/34463197/",
    "playable": true,
    "cover": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2602398693.webp"
    },
      {
    "rate": "7.5",
    "cover_x": 4429,
    "cover_x": "传闻中的陈芊芊",
    "url": "https://movie.douban.com/subject/34463197/",
    "playable": true,
    "cover": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2602398693.webp"
    },
      {
    "rate": "7.5",
    "cover_x": 4429,
    "cover_x": "传闻中的陈芊芊",
    "url": "https://movie.douban.com/subject/34463197/",
    "playable": true,
    "cover": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2602398693.webp"
    }
    ]
    }
    '''
    # tvs 是一个json字符串
    import json
    # json.loads()将json字符串转化为字典
    print(type(tvs))      #str
    
    test_dict = json.loads(tvs)
    print(type(test_dict))          #dict
    print(test_dict["subjects"])        #取出键位subjects的值
    print([x for x in test_dict["subjects"][:2]])      # 遍历该值,取出前两个
    
    
    #将字典转化为json
    json_dict = {       #dict
        'name':"zhangsan",
        "age":"18"
    }
    # json.dumps() 是将字典转化为json字符串
    res = json.dumps(json_dict)
    print(type(res))      #str
    

    返回json格式的数据

    app.py:

    
    from flask import jsonify
    #返回json对象{},json数组[]
    @app.route('/demo2',methods=['GET','POST'])
    def demo2():
        json_dict = {  # dict
            'name': "zhangsan",
            "age": "18"
        }
        return jsonify(json_dict)
    

    运行:

    127.0.0.1:5001/demo2
    

    返回json格式:



    如果使用json.dumps()进行转换成json格式,那么不符合http协议的规范

    import json
    @app.route('/demo3',methods=['GET','POST'])
    def demo3():
        json_dict = {  # dict
            'name': "zhangsan",
            "age": "18"
        }
        res = json.dumps(json_dict)
        return res
    

    运行:


    重定向

    重定向的使用要用到两个flask下的方法

    • redirect()
    • url_for()

    1.重定向到外部网址

    #重定向到百度
    from flask import redirect
    @app.route('/demo4')
    def demo4():
        return redirect('https://baidu.com')
    

    2.重定向到自己编写的视图函数/路由
    重定向到自己的视图函数

    import json
    @app.route('/demo3',methods=['GET','POST'])
    def demo3():
        json_dict = {  # dict
            'name': "zhangsan",
            "age": "18"
        }
        res = json.dumps(json_dict)
        return res
    1.根据路由地址进行匹配
    @app.route('/demo6')
    def demo6():
        return redirect('/demo3')
    
    3.使用url_for(视图函数名)进行匹配
    @app.route('/demo6')
    def demo6():
        return redirect(url_for('demo3'))
    

    3.携带参数的重定向

    @app.route('/user/<user_id>')
    def user_info1(user_id):
        return f'hello1{user_id}'
    #重定向到自己的视图函数,并添加参数
    
    from flask import url_for
    @app.route('/demo5')
    def demo5():
        #url_for --- 相当于django中{% url '' 参数 %}
        return redirect(url_for('user_info1',user_id=333))     #重定向到demo3视图函数
    

    自定义状态码

    #自定义状态码
    @app.route('/demo7')
    def demo7():
        #python中的return可以返回多个对象
        return '自定义状态码',666
    

    运行:


    自定义转换器

    自定义转换器的步骤:

    1. 导入转换器基类,在flask中所有的路由匹配规则都是使用转换器对象进行记录的。
    from werkzeug.routing import BaseConverter     #转换器基类
    

    BaseConverter类:


    1. 自定义的转换器都要继承BaseConverter。
      RegexConverter类:
    #自定义转换器
    class RegexConverter(BaseConverter):
        def __init__(self,url_map,*args):
            super(RegexConverter, self).__init__(url_map)  #调用父类的构造器
            #将第一的参数当作匹配规则进行保存
            self.regex = args[0]      #自定义的正则匹配规则赋给父类的regex
    
    1. 添加转换器到默认的字典中。
    app.url_map.converters['re'] = RegexConverter       #添加到默认字典中
    

    已有的转换器:


    4.使用自定义的转换器实现自定义规则匹配

    @app.route('/user/<re("[0-9]{3}"):user_id>')
    def index(user_id):
        return 'hello%{}'.format(user_id)
    

    分析图解:


    异常捕获

    @app.route('/')
    def index1():
        #主动抛出http异常状态码,只能抛出http协议错误的状态码404,500等
        abort(500)
        return 'hello'
    #捕获错误
    # errorhandler装饰器:
    @app.errorhandler(500)        #捕获500错误,执行对应函数
    def errorhandler_server(val):
        return '服务器坏了'
    

    访问:127.0.0.1:5000:



    除0错误:

    @app.route('/index2')
    def index2():
        #主动抛出http异常状态码,只能抛出http协议错误的状态码404,500等
        a = 0
        b=1/a
        return 'hello'
    #捕获除0错误
    @app.errorhandler(ZeroDivisionError)        #捕获500错误,执行对应函数
    def zeroDivisionError(val):
        return f'除数不能为0:{val}'
    

    访问:127.0.0.1:5000/index2:


    相关文章

      网友评论

          本文标题:2020-05-29--flask02--flask基础02

          本文链接:https://www.haomeiwen.com/subject/sbtfzhtx.html