zoukankan      html  css  js  c++  java
  • 基于Flask的 api(二)

    使用flask 构造服务的方法有:

      (1)利用路由实现

      (2)利用flask的扩展插件实现

    利用路由实现REST API

    1.GET

    获取资源

    获取列表

    from flask import Flask,request,abort,jsonify
    
    app = Flask(__name__)
    
    tasks = [
        {
            'id': 1,
            'title': u'Buy groceries',
            'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
            'done': False
        },
        {
            'id': 2,
            'title': u'Learn Python',
            'description': u'Need to find a good Python tutorial on the web',
            'done': False
        }
    ]
    
    @app.route("/tasks", methods=['GET'])
    def get_tasks():
        return jsonify({'tasks': tasks})
    
    
    
    if __name__ == "__main__":
        app.run(debug=True)

    测试

    $ curl -i http://localhost:5000/tasks
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100   218  100   218    0     0    931      0 --:--:-- --:--:-- --:--:--   931HTTP/1.0 200 OK
    Content-Type: application/json
    Content-Length: 218
    Server: Werkzeug/1.0.1 Python/3.6.0
    Date: Mon, 23 Nov 2020 13:45:24 GMT
    
    {"tasks":[{"description":"Milk, Cheese, Pizza, Fruit, Tylenol","done":false,"id":1,"title":"Buy groceries"},{"description":"Need to find a good Python tutorial on the web","done":false,"id":2,"title":"Learn Python"}]}

    获取其中一个

    from flask import Flask,request,abort,jsonify
    
    app = Flask(__name__)
    
    tasks = [
        {
            'id': 1,
            'title': u'Buy groceries',
            'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
            'done': False
        },
        {
            'id': 2,
            'title': u'Learn Python',
            'description': u'Need to find a good Python tutorial on the web',
            'done': False
        }
    ]
    
    @app.route("/tasks/<int:task_id>", methods=['GET'])
    def get_task(task_id):
        task = list(filter(lambda t: t['id'] == task_id, tasks))
        if len(task) == 0:
            abort(404)
        return jsonify({'task': task[0]})
    
    if __name__ == "__main__":
        app.run(debug=True)

    测试

    $ curl -i http://localhost:5000/tasks/1
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100   142  100   142    0     0    606      0 --:--:-- --:--:-- --:--:--   606HTTP/1.0 200 OK
    Content-Type: application/json
    Content-Length: 142
    Server: Werkzeug/1.0.1 Python/3.6.0
    Date: Mon, 23 Nov 2020 14:31:42 GMT
    
    {
      "task": {
        "description": "Milk, Cheese, Pizza, Fruit, Tylenol",
        "done": false,
        "id": 1,
        "title": "Buy groceries"
      }
    }

    2.POST

    创建资源

    from flask import Flask,request,abort,jsonify
    
    app = Flask(__name__)
    
    tasks = [
        {
            'id': 1,
            'title': u'Buy groceries',
            'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
            'done': False
        },
        {
            'id': 2,
            'title': u'Learn Python',
            'description': u'Need to find a good Python tutorial on the web',
            'done': False
        }
    ]
    
    @app.route('/tasks', methods=['POST'])
    def create_task():
        if not request.json or not 'title' in request.json:
            abort(400)
        task = {
            'id': tasks[-1]['id'] + 1,
            'title': request.json['title'],
            'description': request.json.get('description', ""),
            'done': False
        }
        tasks.append(task)
        return jsonify({'newTask': task,'list':tasks}), 201
    
    if __name__ == "__main__":
        app.run(debug=True)

    测试

    $ curl -i -H "Content-Type: application/json" -X POST -d '{"title":"ABC"}' http://localhost:5000/tasks
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100   528  100   513  100    15   2192     64 --:--:-- --:--:-- --:--:--  2256HTTP/1.0 201 CREATED
    Content-Type: application/json
    Content-Length: 513
    Server: Werkzeug/1.0.1 Python/3.6.0
    Date: Mon, 23 Nov 2020 14:38:50 GMT
    
    {
      "list": [
        {
          "description": "Milk, Cheese, Pizza, Fruit, Tylenol",
          "done": false,
          "id": 1,
          "title": "Buy groceries"
        },
        {
          "description": "Need to find a good Python tutorial on the web",
          "done": false,
          "id": 2,
          "title": "Learn Python"
        },
        {
          "description": "",
          "done": false,
          "id": 3,
          "title": "ABC"
        }
      ],
      "newTask": {
        "description": "",
        "done": false,
        "id": 3,
        "title": "ABC"
      }
    }

    3.PUT

    更新资源

    from flask import Flask,request,abort,jsonify
    
    app = Flask(__name__)
    
    tasks = [
        {
            'id': 1,
            'title': u'Buy groceries',
            'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
            'done': False
        },
        {
            'id': 2,
            'title': u'Learn Python',
            'description': u'Need to find a good Python tutorial on the web',
            'done': False
        }
    ]
    @app.route('/tasks/<int:task_id>', methods=['PUT'])
    def update_task(task_id):
        task = list(filter(lambda t:t['id']==task_id,tasks))
        if len(task)==0:
            abort(404)
        if not request.json:
            abort(400)
        if 'title' in request.json and not isinstance(request.json['title'],str):
            abort(400)
        if 'description' in request.json and not isinstance(request.json['description'],str):
            abort(400)
        if 'done' in request.json and not isinstance(request.json['done'],bool):
            abort(400)
        task[0]['title'] = request.json.get('title',task[0]['title'])
        task[0]['description'] = request.json.get('description', task[0]['description'])
        task[0]['done'] = request.json.get('done', task[0]['done'])
        return jsonify({'task':task[0]})  
    
    if __name__ == "__main__":
        app.run(debug=True)

    测试

    $ curl -i -H "Content-Type: application/json" -X PUT -d '{"title":"ABC"}' http://localhost:5000/tasks/1
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100   147  100   132  100    15    564     64 --:--:-- --:--:-- --:--:--   628HTTP/1.0 200 OK
    Content-Type: application/json
    Content-Length: 132
    Server: Werkzeug/1.0.1 Python/3.6.0
    Date: Mon, 23 Nov 2020 15:00:31 GMT
    
    {
      "task": {
        "description": "Milk, Cheese, Pizza, Fruit, Tylenol",
        "done": false,
        "id": 1,
        "title": "ABC"
      }
    }

    4.DELETE

    删除资源

    from flask import Flask,request,abort,jsonify
    
    app = Flask(__name__)
    
    tasks = [
        {
            'id': 1,
            'title': u'Buy groceries',
            'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
            'done': False
        },
        {
            'id': 2,
            'title': u'Learn Python',
            'description': u'Need to find a good Python tutorial on the web',
            'done': False
        }
    ]
    @app.route('/tasks/<int:task_id>',methods=['DELETE']) 
    def delete_task(task_id):
        task = list(filter(lambda t: t['id']==task_id,tasks))
        if len(task) ==0:
            abort(404)
        tasks.remove(task[0])
        return jsonify({'result': True,'list':tasks})
    
    if __name__ == "__main__":
        app.run(debug=True)

    测试

    $ curl -i -H "Content-Type: application/json" -X DELETE http://localhost:5000/tasks/1
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100   191  100   191    0     0    812      0 --:--:-- --:--:-- --:--:--   812HTTP/1.0 200 OK
    Content-Type: application/json
    Content-Length: 191
    Server: Werkzeug/1.0.1 Python/3.6.0
    Date: Mon, 23 Nov 2020 15:02:52 GMT
    
    {
      "list": [
        {
          "description": "Need to find a good Python tutorial on the web",
          "done": false,
          "id": 2,
          "title": "Learn Python"
        }
      ],
      "result": true
    }
  • 相关阅读:
    到底什么级别才算是高并发?
    阿里大佬教你,如何写好 Java 代码!
    Java 13 发布了!
    年轻人的第一个自定义 Spring Boot Starter!
    懵圈了,面试官问一个 TCP 连接可发多少个 HTTP 请求?
    Java 和操作系统交互,你猜会发生什么?
    不用找了,基于 Redis 的分布式锁实战来了!
    中国剩余定理
    欧几里德与扩展欧几里德
    大数mod的技巧
  • 原文地址:https://www.cnblogs.com/baby123/p/14024016.html
Copyright © 2011-2022 走看看