Flask-RESTful API开发实战:从基础路由到参数解析与CRUD操作

沈知远
沈知远
发布时间:2026-10-13 | 4人浏览过
原创

本文深入讲解Flask-RESTful库的核心用法,涵盖Resource类构建多HTTP方法路由、Endpoint机制解析、reqparse参数验证工具以及完整的增删改查(CRUD)实战案例。通过具体代码示例,帮助开发者快速掌握Flask RESTful API的设计与实现,解决表单数据获取、动态路由参数处理及错误状态码返回等常见问题。

Flask-RESTful基础:Hello World与Resource路由

1. 基础API接口:Hello World案例


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)

2. API接口核心:利用Resource类实现路由映射

根据官方文档说明,Flask-RESTful最核心的基础组件是资源(Resources)。资源类建立在Flask的可插拔视图(Pluggable Views)之上,开发者只需在资源类中定义相应的方法,即可轻松支持多种HTTP请求方法。

简单来说,这意味着在Resource定义的路由上,通过定义不同的方法(如get、post、put等),可以实现对同一URL路径的不同HTTP请求处理,从而丰富接口的功能。


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

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)

具体解释如下: (1)TodoSimple类中定义了两个方法,最终在地址 /string:todo_id 下,即可支持两种不同的请求方式。 (2)在add_resource方法中,第一个参数传入视图函数类名,第二个参数指定具体的路由地址。其中 <string:todo_id> 表示该路由接收一个名为todo_id的字符串参数,且为必填项。 (3)通过 request.form['data'] 可以获取POST请求中form表单里key为'data'的参数值。如果请求中不包含data参数,程序将报错;若存在多个参数,系统仅提取名为data的那个参数。

Step 1:为字典todos初始化参数,设置key为todo1。

Step 2:从todos字典中获取todo1对应的参数值。

Step 3:更新现有数据,并在请求中额外传递其他参数。

Step 4:获取并返回更新后的最新参数值。

Step 5:不传递data参数,观察系统的报错反馈情况。

深入理解Endpoint机制

3. API接口概念解析:Endpoint(端点)的作用

关于此问题的详细解释,可参考以下博文,文中已给出详尽说明: https://www.jb51.net/article/176173.htm

简单理解如下: URL通过endpoint来查找对应的视图函数(通常endpoint名称与视图函数名一致)。但在某些场景下,如endpoint名称与视图函数名不一致,或需要在多个蓝图中指定执行特定的视图函数时,就必须明确指定具体的endpoint。

参数解析与验证工具reqparse

4. API接口进阶:参数解析与验证

官方文档指出: (1)虽然Flask可以直接访问请求数据(如查询字符串或POST表单编码数据),但验证表单数据往往较为繁琐。Flask-RESTful内置了对请求数据的验证支持,其机制类似于argparse库。 (2)需要注意的是,与argparse模块不同,reqparse.RequestParser.parse_args() 方法返回的是一个Python字典,而非自定义的数据结构对象。


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

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

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


# 获取 & 更新
class Get_Modify(Resource):
 def post(self):
  args = parser.parse_args()
  print(args)
  return args, 201


api.add_resource(Get_Modify, '/get_modify')

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

Step 1:从form表单中提取预先定义好的参数。

解释: 即使请求中传递了其他未定义的参数,最终系统也只会读取并返回预先定义的两个参数的值。 通过上述代码示例可知:reqparse.RequestParser.parse_args() 方法(即代码中的args变量)能够获取request中form表单的参数,最终结果以字典形式呈现。

实战案例:Form表单传参与CRUD操作

5. API接口实战案例一:通过Form表单传递参数


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

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

Tasks = {
 't1': {'task': 'eat an app'},
 't2': {'task': 'play football'},
 't3': {'task': 'watching TV'},
}

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


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


# 获取 & 更新
class Get_Modify(Resource):
 def get(self):
  return Tasks

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


# 设置每个视图函数的访问格式
api.add_resource(Get_Modify, '/get_modify')

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

代码逻辑解释: (1)上述函数中,get方法用于获取完整的Tasks列表。 (2)post方法用于添加新的键值对,其中新key的值以“t”开头,数字部分自动递增。 (3)max(Tasks.keys()) 用于获取Tasks列表中索引最大的key值。在未添加新数据前,最大索引为t3。 (4)x_string.lstrip('t') 用于截取字符串x_string中去除开头't'后的剩余部分。例如,对't3'执行此操作得到'3',进而转换为整数。int(max(Tasks.keys()).lstrip('t')) + 1 这一行的含义是:获取当前最大key的索引值,并自增1,从而生成下一个新key的索引。 (5)若希望在form表单中传递参数,需在函数内部使用 args = parser.parse_args() 来接收传递的参数,具体的key值通过add_argument函数进行设置。

Step 1:首次发起get请求,获取原始的Tasks列表数据。

Step 2:第二次发起post请求,添加value值为'studying';随后第三次发起get请求,查看更新后的最新Tasks列表。

实战案例:URL参数查询与动态路由

6. API接口实战案例二:通过URL参数进行查询


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

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

Tasks = {
 't1': {'task': 'eat an app'},
 't2': {'task': 'play football'},
 't3': {'task': 'watching TV'},
}


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


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


# 更新 & 删除 任务
class Updata_Delete(Resource):
 def get(self, t_id):    # 根据t_id获取对应的value
  abort_if_todo_doesnt_exist(t_id)
  return Tasks[t_id]

 def delete(self, t_id):   # 根据t_id删除对应的value
  abort_if_todo_doesnt_exist(t_id)
  del Tasks[t_id]
  return 'delete success', 204

 def post(self, t_id):   # 判断t_id是否存在,并返回Tasks整个列表
  abort_if_todo_doesnt_exist(t_id)
  return Tasks,201

 def put(self, t_id):   # 根据t_id添加对应的value,并返回所有值
  args = parser.parse_args()
  task = {'task': args['task']}
  Tasks[t_id] = task
  return Tasks, 201


api.add_resource(Updata_Delete, '/update_delete/<t_id>')

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

Step 1:查看Tasks的完整信息。

Step 2:添加一条新信息,key值为't5',内容为'studying'。

Step 3:查看key为't5'的具体值情况。

Step 4:删除key为't1'的记录,然后查看更新后的Tasks完整信息。

解释: (1)通过URL传递参数给视图函数,这种方式通常适用于GET请求;而POST请求通过form表单形式传递数据更为实用。 (2)若通过URL传递参数,定义函数时需使用形参t_id,并在add_resource()函数的路由参数末尾添加 <t_id> 变量,例如 '/update_delete/<t_id>' 这种形式。 (3)delete函数最终执行删除操作是成功的,但并未返回预期的字符串'delete success'。具体原因尚不明确,可能是用法存在偏差,后续将在更新中说明。(注:若需返回成功字符串,可将 'delete success', 204 中的状态码204移除即可)。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表