• flask 可插拔视图


    Flask 0.7 版本引入了可插拨视图。可插拨视图基于使用类来代替函数,其灵感来自于 Django 的通用视图。
    可插拨视图的主要用途是用可定制的、可插拨的视图来替代部分 实现。
    普通的函数视图

    演示代码

    复制代码
    from flask import Flask, request
    
    app = Flask(__name__)
    
    
    @app.route("/", methods=['GET', 'POST'])
    def hello():
        method = request.method.upper()
        return "hello %s" % method
    
        
    if __name__ == "__main__":
        app.run()
    复制代码

    演示结果
    C:\Users\jh>curl http://127.0.0.1:5000/
    hello GET
    C:\Users\jh>curl -d 'a=1' http://127.0.0.1:5000/
    hello POST
    这是一个普通的函数视图,使用的是route去注册url和函数绑定。
    进而通过访问相关的url而访问相应的函数。

    上例简单而灵活。但是如果要把这个视图变成一个可以用于其他模型和模板的通用视图,
    那么这个视图还是不够灵活。因此,我们就需要引入可插拨的、基于类的视图。第一步, 可以把它转换为一个基础视图:

    示例代码

    复制代码
    from flask import Flask
    from flask.views import View
    app = Flask(__name__)
    
    
    class ShowHello(View):
        def dispatch_request(self):
            return 'Hello'
    
    
    app.add_url_rule('/', view_func=ShowHello.as_view('show_hello'))
    
    
    if __name__ == "__main__":
        app.run()
    复制代码

    演示结果
    C:\Users\jh>curl http://127.0.0.1:5000/
    Hello
    有以下几个要点
    1.必须创建一个flask.views.View的子类,并且执行dispatch_request方法。
    2.必须通过使用 as_view() 方法把类转换为实际视图函数

    基于方法的调度
    对于 REST 式的 API 来说,为每种 HTTP 方法提供相对应的不同函数显得尤为有用。使用 flask.views.MethodView
    可以轻易做到这点。在这个类中,每个 HTTP 方法 都映射到一个同名的类方法(名称为小写字母):

    演示代码

    复制代码
    from flask import Flask
    from flask.views import MethodView
    app = Flask(__name__)
    
    
    class ShowHello(MethodView):
        def get(self):
            return 'Hello get'
        def post(self):
            return 'Hello post'
    
    
    app.add_url_rule('/', view_func=ShowHello.as_view('show_hello'))
    
    
    if __name__ == "__main__":
        app.run()
    复制代码

    演示结果
    C:\Users\jh>curl http://127.0.0.1:5000/
    Hello get
    C:\Users\jh>curl -d 'a=1' http://127.0.0.1:5000/
    Hello post
    C:\Users\jh>

    装饰视图
    视图函数会被添加到路由系统中,而视图类则不会。因此视图类不需要装饰,只能以手工 使用 as_view() 来装饰返回值:
    演示代码

    复制代码
    from flask import Flask, request
    from flask.views import MethodView
    app = Flask(__name__)
    
    
    class ShowHello(MethodView):
        def get(self):
            return 'Hello get'
        def post(self):
            return 'Hello post'
    
    
    def hello_required(f):
        def decorator(*args, **kwargs):
            method = request.method.upper()
            if method == 'GET':
                print('before get')
            return f(*args, **kwargs)
        return decorator
    
    
    view = hello_required(ShowHello.as_view('show_hello'))
    app.add_url_rule('/', view_func=view)
    
    
    if __name__ == "__main__":
        app.run()
    复制代码

    演示结果
    C:\Users\jh>curl http://127.0.0.1:5000/
    Hello get
    服务端日志
    before get
    127.0.0.1 - - [22/Aug/2022 16:36:17] "GET / HTTP/1.1" 200 -

    一个类对应多种不同的请求方式
    /user get 获取所有用户
    /user post 创建一个用户
    /user/ get 获取一个用户
    /user/ put 更新一个用户
    /user/ delete 删除一个用户

    演示代码

    复制代码
    from flask import Flask
    from flask.views import MethodView
    app = Flask(__name__)
    
    
    class User(MethodView):
        def get(self, user_id):
            if user_id:
                return 'get one user userid: %s' % user_id
            else:
                return 'get all user'
        def post(self):
            return 'create new user'
    
        def put(self, user_id):
            return 'update one user userid: %s' % user_id
    
        def delete(self, user_id):
            return 'delete one user userid: %s' % user_id
    
    
    user_view = User.as_view('user_api')
    app.add_url_rule('/user/', defaults={'user_id': None}, view_func=user_view, methods=['GET', ])
    app.add_url_rule('/user/', view_func=user_view, methods=['POST', ])
    app.add_url_rule('/user/', view_func=user_view, methods=['GET', 'PUT', 'DELETE'])
    
    if __name__ == "__main__":
        app.run()
    复制代码

    演示结果
    C:\Users\jh>curl http://127.0.0.1:5000/user/
    get all user
    C:\Users\jh>curl http://127.0.0.1:5000/user/1234
    get one user userid: 1234
    C:\Users\jh>curl -d 'user_id=1' http://127.0.0.1:5000/user/
    create new user
    C:\Users\jh>curl -X PUT http://127.0.0.1:5000/user/1234
    update one user userid: 1234
    C:\Users\jh>curl -X DELETE http://127.0.0.1:5000/user/1234
    delete one user userid: 1234

  • 相关阅读:
    测试工程师应具备何种心态?
    如何使用正则表达式实现Java日志信息的抓取与收集
    【C++进阶】引用 & 函数提高
    【Linux详解】进程的状态 | 运行 阻塞 挂起 | 僵尸和孤儿状态
    服务器数据恢复—RAID5阵列重建重建导致数据丢失的数据恢复案例
    Linux运维Centos7_创建虚拟机 安装操作系统
    文本焦点小程序
    docker-ip与服务器ip冲突问题
    python http.server 的测试和常见问题解决方法
    linux 配置 NTP 服务器
  • 原文地址:https://www.cnblogs.com/mtck/p/16618204.html