Python Flask:利用路由写RESTful API

来自CloudWiki
跳转至: 导航搜索

功能简介

这里又两种方法构造服务,第一中就是利用flask的路由进行构造,另外一种就是利用flask 的扩展插件来构造。首先我们假定一种业务场景: 做一个最简单的图书馆里系统,实现如下功能


   返回图书列表 
   返回指定图书的信息(书名,价格,作者)
   新增一本书: (POST方法)
   删除一本书   :(DELETE方法)
   更新书本的信息(涨价了)

使用flask构建REST服务

了解过HTTP的都了解这该如何做,那么使用flask 会怎么构造服务呢?又两种办法

1. 利用路由写。

2.利用flask的扩展插件写接卸来就开始介绍这两种方法如何实现吧!

接口列表

   图书列表返回 :(GET方法)/bookstore/api/v1/books
   返回指定图书的信息(书名,价格,作者):(GET方法) /bookstore/api/v1/books/<int:id>
   新增一本书: (POST方法)/bookstore/api/v1/books/
   删除一本书   :(DELETE方法)/bookstore/api/v1/books/<int:id>
   更新书本的信息(涨价了):(PUT方法)/bookstore/api/v1/books/<int:id>

代码

from flask import Flask, jsonify, abort, request
app = Flask(__name__)
books = [
    {
        'id': 1,
        'title': u'论语',
        'auther': u'孔子',
        'price': 18
    },
    {
        'id': 2,
        'title': u'道德经',
        'auther': u'老子',
        'price': 15
    }
]

#find all books,GET操作
@app.route('/bookstore/api/v1/books', methods=['GET'])
def get_tasks():
    return jsonify({'books': books})

#get one specific book,GET操作
@app.route('/bookstore/api/v1/books/<int:id>', methods=['GET'])
def get_task(id):
    for book in books:
        if book['id']==id:
            return jsonify({'book': book})
    abort(404)

#insert a new book,POST操作
@app.route('/bookstore/api/v1/books/', methods=['POST'])
def create_task():
    if not request.form or not 'title' in request.form:
        abort(400)
    book = {
        'id': books[-1]['id'] + 1,
        'title': request.form['title'],
        'auther': request.form['auther'],
        'price': request.form['price'],
    }
    books.append(book)
    return jsonify({'book': book})

#update a book,PUT操作
@app.route('/bookstore/api/v1/books/<int:id>', methods=['PUT'])
def update_book(id):
    for book in books:
        if book['id']==id:
            book["title"] = request.form['title']
            book["auther"] = request.form['auther']
            book["price"] = request.form['price']
        return jsonify({'books': books})
    abort(400)

#delete a book,DELETE操作
@app.route('/bookstore/api/v1/books/<int:id>', methods=['DELETE'])
def delete_task(id):
    for book in books:
        if book['id']==id:
            books.remove(book)
            return jsonify({'result': True})
    abort(404)

    return jsonify({'result': True})


if __name__ == '__main__':
    app.run(host='0.0.0.0',debug=True)

测试

测试工具:

浏览器

只能针对GET请求:

浏览器输入 http://121.36.58.65:5000/bookstore/api/v1/books

显示:

{
  "books": [
    {
      "auther": "\u5b54\u5b50", 
      "id": 1, 
      "price": 18, 
      "title": "\u8bba\u8bed"
    }, 
    {
      "auther": "\u8001\u5b50", 
      "id": 2, 
      "price": 15, 
      "title": "\u9053\u5fb7\u7ecf"
    }
  ]
}

API POST 或 POSTMAN

POST请求

参见: https://blog.csdn.net/weixin_44159454/article/details/108467380

Python2022071401.png

PUT请求

Python2022071402.png

DELETE请求

Python2022071403.png

参考文档.: https://www.jianshu.com/p/bee9e61aca14

http://www.pythondoc.com/flask-restful/second.html