首页 > 其他分享 >Flask 学习-23.restful 接口开发

Flask 学习-23.restful 接口开发

时间:2022-08-28 23:45:14浏览次数:70  
标签:__ task 23 Flask restful flask todo id

前言

Flask-RESTful 是一个 Flask 扩展,它添加了快速构建 REST APIs 的支持。它当然也是一个能够跟你现有的ORM/库协同工作的轻量级的扩展。
Flask-RESTful 鼓励以最小设置的最佳实践。如果你熟悉 Flask 的话,Flask-RESTful 应该很容易上手。

环境准备

使用 pip 安装 Flask-RESTful:

pip install flask-restful

中文官方文档:http://www.pythondoc.com/Flask-RESTful/quickstart.html
英文官网:https://flask-restful.readthedocs.io/en/latest/

快速入门

一个最简单的 Flask-RESTful API 像这样:

from flask import Flask
from flask.ext import restful

app = Flask(__name__)
api = restful.Api(app)

class HelloWorld(restful.Resource):
    def get(self):
        return {'hello': 'world'}

api.add_resource(HelloWorld, '/')

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

但是运行会发现有报错:ModuleNotFoundError: No module named 'flask.ext'

原因:新版的 flask 不再支持 'flask.ext',需要换种方式导入相应第三方库(说明官网很久没更新了)
解决办法:把 '.ext'改写为下划线'_'
于是把原来的

from flask.ext import restful

改成新的导入方式

import flask_restful as restful

其它类似的导入'flask.ext', 也可以改成_, 如下示例

from flask.ext.bootstrap import Bootstrap

改为:

from flask_bootstrap import Bootstrap

重新启动后访问http://127.0.0.1:5000/

基于资源(Resources)的路由

Flask-RESTful 提供的最主要的基础就是资源(resources)。资源(Resources)是构建在 Flask 可拔插视图 之上,只要在你的资源(resource)上定义方法就能够容易地访问多个 HTTP 方法。
一个待办事项应用程序的基本的 CRUD(增删改查) 资源看起来像这样:

from flask import Flask, request
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

todos = {}

class TodoSimple(Resource):
    def get(self, todo_id):
        return {todo_id: todos[todo_id]}

    def put(self, todo_id):
        todos[todo_id] = request.form['data']
        return {todo_id: todos[todo_id]}

api.add_resource(TodoSimple, '/<string:todo_id>')

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

Flask-RESTful 支持视图方法多种类型的返回值。同 Flask 一样,你可以返回任一迭代器,它将会被转换成一个包含原始 Flask 响应对象的响应。
Flask-RESTful 也支持使用多个返回值来设置响应代码和响应头,如下所示:

class Todo1(Resource):
    def get(self):
        # Default to 200 OK
        return {'task': 'Hello world'}

class Todo2(Resource):
    def get(self):
        # Set the response code to 201
        return {'task': 'Hello world'}, 201

class Todo3(Resource):
    def get(self):
        # Set the response code to 201 and return custom headers
        return {'task': 'Hello world'}, 201, {'Etag': 'some-opaque-string'}

端点(Endpoints)

很多时候在一个 API 中,你的资源可以通过多个 URLs 访问。你可以把多个 URLs 传给 Api 对象的 Api.add_resource() 方法。每一个 URL 都能访问到你的 Resource

api.add_resource(HelloWorld,
    '/',
    '/hello')

你也可以为你的资源方法指定 endpoint 参数。

api.add_resource(Todo,
    '/todo/<int:todo_id>', endpoint='todo_ep')

格式化完整例子

from flask import Flask
from flask_restful import reqparse, abort, Api, Resource

app = Flask(__name__)
api = Api(app)

TODOS = {
    'todo1': {'task': 'build an API'},
    'todo2': {'task': '?????'},
    'todo3': {'task': 'profit!'},
}


def abort_if_todo_doesnt_exist(todo_id):
    if todo_id not in TODOS:
        abort(404, message="Todo {} doesn't exist".format(todo_id))

parser = reqparse.RequestParser()
parser.add_argument('task', type=str)


# Todo
#   show a single todo item and lets you delete them
class Todo(Resource):
    def get(self, todo_id):
        abort_if_todo_doesnt_exist(todo_id)
        return TODOS[todo_id]

    def delete(self, todo_id):
        abort_if_todo_doesnt_exist(todo_id)
        del TODOS[todo_id]
        return '', 204

    def put(self, todo_id):
        args = parser.parse_args()
        task = {'task': args['task']}
        TODOS[todo_id] = task
        return task, 201


# TodoList
#   shows a list of all todos, and lets you POST to add new tasks
class TodoList(Resource):
    def get(self):
        return TODOS

    def post(self):
        args = parser.parse_args()
        todo_id = int(max(TODOS.keys()).lstrip('todo')) + 1
        todo_id = 'todo%i' % todo_id
        TODOS[todo_id] = {'task': args['task']}
        return TODOS[todo_id], 201

##
## Actually setup the Api resource routing here
##
api.add_resource(TodoList, '/todos')
api.add_resource(Todo, '/todos/<todo_id>')


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

标签:__,task,23,Flask,restful,flask,todo,id
From: https://www.cnblogs.com/yoyoketang/p/16634471.html

相关文章

  • Python学习笔记(十一)-- Django API RESTful
    1.Django restframework之序列化https://www.cnblogs.com/midworld/p/11380194.html  2.写API的三个重点(1)路由;(2)视图类(提供给用户访问相当于原来的视图函数);(3)序列化......
  • RESTful 风格
    一、RESTful前后端分离开发的项目中,前后端是通过接口规范进行请求和响应,后端向前端提供请求时就要对外暴露一个URL;URL的设计不是随意的,需要遵从一定的设计规范—RESTful......
  • 23.孤勇者
    都是勇敢的你额头的伤口你的不同你犯的错都不必隐藏你破旧的玩偶你的面具你的自我他们说要带着光驯服每一头怪兽他们说要缝好你的伤没有人爱小丑为何孤......
  • 2022-08-23 day33 第一小组 王鸣赫
    目录CSS三大特性1、层叠性2、继承性3、优先级常用单位字体背景列表属性盒子模型display的inline、block、inline-block的区别文档流定位定位的left和top、right和bottom和m......
  • 231. 2 的幂
     labuladong题解思路难度简单532收藏分享切换为英文接收动态反馈给你一个整数 n,请你判断该整数是否是2的幂次方。如果是,返回 true ;否则,返回 false 。如......
  • Flask 学习-22.可插拨视图MethodView类
    前言可插拨视图基于使用类来代替函数,其灵感来自于Django的通用视图。可插拨视图的主要用途是用可定制的、可插拨的视图来替代部分实现。基本原理假设有一个函数用于......
  • Flask 学习-21. 项目配置通过.env环境变量启动开发/生产环境
    前言一般一个项目会配置多套环境:开发/测试/生产环境,每套环境的配置不一样,比如不同的运行环境配置的数据库不一样。config配置在前面的配置管理中https://www.cnblogs.co......
  • CF123E Maze 题解
    提供一种不太一样的换根dp的做法。记\(u\)作为起点的概率为\(q_u\),作为终点的概率为\(p_u\)。题目给的代码可以看作一个从某个点开始,以它为根dfs到终点的步数,这......
  • Flask 学习-20. route 路由中的 endpoint 参数
    前言@app.route中的endpoint参数,就相当于django中的name参数,用来反向生成URL。url_for()函数url_for()函数用于构建指定函数的URL。它把函数名称作为第一个参数。......
  • 【转】YApi结合swag管理和生成go项目restful API文档
     原文:https://blog.csdn.net/tuobicui6522/article/details/102980653 swag命令安装: goinstallgithub.com/swaggo/swag/cmd/swag@latest swag命令对应的githu......