基于Flask的 api(三)详解编程语言

使用flask的RESTful扩展库 flask-restful

安装

pip install flask-restful

eg:

最简单的api

from flask import Flask 
from flask_restful import Api, Resource 
 
app = Flask(__name__) 
api = Api(app) 
 
class HelloWorld(Resource): 
    def get(self): 
        return {'hello': 'world'} 
api.add_resource(HelloWorld, '/') 
 
if __name__ == "__main__": 
    app.run(debug=True,port=5000)

测试

$ curl -i http://localhost:5000 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current 
                                 Dload  Upload   Total   Spent    Left  Speed 
100    25  100    25    0     0     25      0  0:00:01 --:--:--  0:00:01   123HTTP/1.0 200 OK 
Content-Type: application/json 
Content-Length: 25 
Server: Werkzeug/1.0.1 Python/3.7.7 
Date: Tue, 24 Nov 2020 04:31:12 GMT 
 
{ 
    "hello": "world" 
}

restful api

from flask import Flask 
from flask_restful import reqparse, abort, Api, Resource 
 
app = Flask(__name__) 
api = Api(app) 
 
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 
    } 
] 
 
def abort_if_todo_doesnt_exist(task,id): 
    if len(task) ==0: 
        abort(404, message="task {} doesn't exist".format(id)) 
 
parser = reqparse.RequestParser() 
parser.add_argument('title') 
parser.add_argument('description') 
parser.add_argument('done') 
 
# (put/get/delete)Task 
class Task(Resource): 
    def get(self, id): 
        task = list(filter(lambda t: t['id']==id,tasks)) 
        abort_if_todo_doesnt_exist(task,id) 
        return task 
 
    def delete(self, id): 
        task = list(filter(lambda t: t['id']==id,tasks)) 
        abort_if_todo_doesnt_exist(task,id) 
        tasks.remove(task[0]) 
        return {'result': True,'list':tasks} 
 
    def put(self, id): 
        task = list(filter(lambda t: t['id']==id,tasks)) 
        abort_if_todo_doesnt_exist(task,id) 
        args = parser.parse_args() 
        task[0]['title'] = args['title'] 
        task[0]['description'] = args['description'] 
        task[0]['done'] = args['done'] 
        return task, 201 
 
#(post/get)TaskList 
class TaskList(Resource): 
    def get(self): 
        return tasks 
 
    def post(self): 
        args = parser.parse_args() 
        task = { 
            'id': tasks[-1]['id'] + 1, 
            'title': args['title'], 
            'description': args['description'], 
            'done': False 
        } 
        tasks.append(task) 
        return task, 201 
 
# 设置路由 
api.add_resource(TaskList, '/tasks') 
api.add_resource(Task, '/tasks/<int:id>') 
 
if __name__ == "__main__": 
    app.run(debug=True,port=5000)

说明:

  RequestParser参数解析类,可以很方便的解析请求中的-d参数,并进行类型转换

  使用add_resource设置路由

  

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/20457.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论