85_Python Flask开发RESTful API Python Flask开发RESTful API构建规范化的前后端接口文章目录Python Flask开发RESTful API构建规范化的前后端接口前言一、RESTful设计原则速览二、项目初始化与基础配置三、构建RESTful用户资源接口3.1 标准JSON响应封装3.2 GET - 获取资源列表3.3 GET - 获取单个资源3.4 POST - 创建资源3.5 PUT - 全量更新资源3.6 DELETE - 删除资源四、参数校验使用Marshmallow五、蓝图Blueprint模块化组织API完整蓝图示例结构六、错误处理与状态码总结✅ 亮点总结适用场景扩展方向前言在现代Web开发中前后端分离已成为主流架构。前端React、Vue、小程序通过HTTP请求与后端通信后端只需提供RESTful API接口返回JSON数据。这种模式下后端不再关心视图渲染专注于数据逻辑和业务规则天然支持多端Web、App、小程序共享同一套API。本文将基于Flask从零构建一个符合REST规范的API系统涵盖资源设计、JSON响应、参数校验、错误处理和蓝图组织帮助你写出别人拿到URL就知道怎么用的专业API。RESTful API为什么重要如果你给前端同事的接口是一个/deleteUser?id1GET方法执行删除操作他可能会骂你。REST不是教条而是一套让团队协作成本最小化的约定——所有人遵循同一套URL设计和HTTP方法语义文档可以减少80%的沟通成本。面试中能清晰解释GET/POST/PUT/DELETE的语义区别是后端开发的基本功。一、RESTful设计原则速览RESTRepresentational State Transfer不是标准而是架构风格核心原则包括资源导向把一切视为资源Resource每个资源有唯一URL无状态每个请求包含所有必要信息服务器不保存客户端状态统一接口使用HTTP方法表达操作语义返回资源表示返回JSON或XML表示的资源状态HTTP方法与资源操作的对应关系HTTP方法操作路径示例说明GET查询/api/users获取用户列表GET查询/api/users/1获取ID为1的用户POST创建/api/users创建新用户PUT全量更新/api/users/1更新用户全部字段PATCH部分更新/api/users/1更新用户部分字段DELETE删除/api/users/1删除用户二、项目初始化与基础配置mkdirflask_api_democdflask_api_demo python-mvenv venv# 激活虚拟环境 (Windows)venv\Scripts\activate pipinstallflask创建基础的Flask API应用# app.pyfromflaskimportFlask,jsonify,request appFlask(__name__)app.config[JSON_AS_ASCII]False# 支持中文JSON输出# 模拟数据库users[{id:1,name:张三,email:zhangsanexample.com,age:28},{id:2,name:李四,email:lisiexample.com,age:32},{id:3,name:王五,email:wangwuexample.com,age:25},]if__name____main__:app.run(debugTrue,port5000)JSON_AS_ASCII False确保中文在JSON响应中正常显示而非被转义为\uXXXX。三、构建RESTful用户资源接口3.1 标准JSON响应封装一致的响应格式是API设计的第一步defmake_response(dataNone,messagesuccess,code200):统一响应格式return{code:code,message:message,data:data},code3.2 GET - 获取资源列表app.route(/api/users,methods[GET])defget_users():获取用户列表# 支持分页pagerequest.args.get(page,1,typeint)per_pagerequest.args.get(per_page,10,typeint)# 支持搜索keywordrequest.args.get(q,)ifkeyword:filtered[uforuinusersifkeywordinu[name]]else:filteredusers# 简单分页start(page-1)*per_page endstartper_page page_datafiltered[start:end]returnjsonify(make_response(data{users:page_data,total:len(filtered),page:page,per_page:per_page}))3.3 GET - 获取单个资源app.route(/api/users/int:user_id,methods[GET])defget_user(user_id):获取单个用户usernext((uforuinusersifu[id]user_id),None)ifuserisNone:returnjsonify(make_response(messagef用户{user_id}不存在,code404)),404returnjsonify(make_response(data{user:user}))3.4 POST - 创建资源app.route(/api/users,methods[POST])defcreate_user():创建新用户datarequest.get_json(silentTrue)# 参数校验ifnotdata:returnjsonify(make_response(message请求体不能为空,code400)),400namedata.get(name,).strip()emaildata.get(email,).strip()errors{}ifnotname:errors[name]姓名不能为空ifnotemailornotinemail:errors[email]邮箱格式不正确iferrors:returnjsonify(make_response(message参数校验失败,code422,data{errors:errors})),422# 创建用户new_idmax(u[id]foruinusers)1ifuserselse1new_user{id:new_id,name:name,email:email,age:data.get(age,0)}users.append(new_user)returnjsonify(make_response(message创建成功,code201,data{user:new_user})),2013.5 PUT - 全量更新资源app.route(/api/users/int:user_id,methods[PUT])defupdate_user(user_id):全量更新用户usernext((uforuinusersifu[id]user_id),None)ifuserisNone:returnjsonify(make_response(messagef用户{user_id}不存在,code404)),404datarequest.get_json(silentTrue)ifnotdata:returnjsonify(make_response(message请求体不能为空,code400)),400# PUT要求提供所有字段required[name,email,age]forfieldinrequired:iffieldnotindata:returnjsonify(make_response(messagef缺少必填字段:{field},code422)),422user[name]data[name]user[email]data[email]user[age]data[age]returnjsonify(make_response(message更新成功,data{user:user}))3.6 DELETE - 删除资源app.route(/api/users/int:user_id,methods[DELETE])defdelete_user(user_id):删除用户globalusers usernext((uforuinusersifu[id]user_id),None)ifuserisNone:returnjsonify(make_response(messagef用户{user_id}不存在,code404)),404users[uforuinusersifu[id]!user_id]returnjsonify(make_response(message删除成功,code200))四、参数校验使用Marshmallow当接口参数变复杂时比如创建用户的接口需要校验姓名不为空、邮箱格式正确、年龄在0-150之间手动写一堆if not name、if not in email会让代码迅速膨胀且容易遗漏。Marshmallow库正是为解决这个问题而生——它将校验规则声明式地写在Schema类中校验、序列化、反序列化三位一体。pipinstallmarshmallowMarshmallow的核心概念Schema.load(data)做反序列化——将JSON字典转为Python对象并执行校验Schema.dump(obj)做序列化——将Python对象转为JSON字典。在你的API中接收请求时用load()校验入参返回响应时用dump()格式化出参。这种对称的设计让数据在客户端的JSON和服务端的Python对象之间无缝穿梭。frommarshmallowimportSchema,fields,ValidationError,validateclassUserSchema(Schema):用户数据校验规则namefields.String(requiredTrue,validatevalidate.Length(min1,max50))emailfields.Email(requiredTrue)agefields.Integer(validatevalidate.Range(min0,max150))# 在视图函数中使用app.route(/api/v2/users,methods[POST])defcreate_user_v2():datarequest.get_json(silentTrue)schemaUserSchema()try:validatedschema.load(data)exceptValidationErroraserr:returnjsonify(make_response(message参数校验失败,code422,data{errors:err.messages})),422new_user{id:max(u[id]foruinusers)1,**validated}users.append(new_user)returnjsonify(make_response(message创建成功,code201,data{user:new_user})),201Marshmallow不仅做校验还能做序列化和反序列化是RESTful API开发的利器。五、蓝图Blueprint模块化组织API当API接口增多全部写在一个文件中会变得难以维护。蓝图允许你按功能模块拆分应用# api/users.pyfromflaskimportBlueprint,request,jsonify users_bpBlueprint(users,__name__,url_prefix/api/users)# 模拟数据存储实际项目中使用数据库user_list[...]users_bp.route(/,methods[GET])defget_users():returnjsonify({users:user_list})users_bp.route(/int:user_id,methods[GET])defget_user(user_id):...users_bp.route(/,methods[POST])defcreate_user():...# 注册到app# app.pyfromapi.usersimportusers_bp app.register_blueprint(users_bp)完整蓝图示例结构flask_api_demo/ ├── app.py # 应用入口 ├── api/ │ ├── __init__.py │ ├── users.py # 用户相关接口 │ ├── products.py # 产品相关接口 │ └── auth.py # 认证相关接口 └── validators/ ├── __init__.py └── schemas.py # Marshmallow校验规则六、错误处理与状态码优雅的错误处理是成熟API的标志fromwerkzeug.exceptionsimportHTTPExceptionapp.errorhandler(HTTPException)defhandle_http_exception(e):统一处理HTTP异常responsee.get_response()response.datajsonify(make_response(messagee.description,codee.code)).get_data()response.content_typeapplication/jsonreturnresponseapp.errorhandler(404)defnot_found(e):returnjsonify(make_response(message请求的资源不存在,code404)),404app.errorhandler(500)definternal_error(e):returnjsonify(make_response(message服务器内部错误,code500)),500总结构建一个规范化的RESTful API需要关注多个层面URL设计要资源导向、名词复数HTTP方法要语义清晰响应格式要统一规范code、message、data参数校验使用Marshmallow等专业库应用结构通过蓝图按模块拆分错误处理提供友好的提示信息。这些看似额外的工作在项目规模增长时会带来巨大的维护收益。下一篇我们将转向Django框架入门体验大而全的全栈框架的魅力。✅ 亮点总结RESTful URL设计遵循资源导向、名词复数原则让API语义清晰、符合直觉统一的响应格式code message data是规范化API的基石前端可据此统一处理Marshmallow序列化器将参数校验与数据序列化合二为一告别手工校验的繁琐Flask蓝图按功能模块拆分路由让大型项目的代码结构清晰可维护全局错误处理器捕获所有异常并返回友好JSON避免暴露内部细节给客户端适用场景移动端API后端为iOS/Android应用提供数据接口实现前后端完全分离微服务架构每个服务提供独立的RESTful接口团队可独立开发、部署和扩展第三方开放平台对外提供标准化API供合作伙伴集成遵循REST规范降低对接成本扩展方向API认证与授权学习JWTJSON Web Token实现无状态的身份认证和权限控制API文档自动化使用Swagger/OpenAPI如flasgger、apispec自动生成可交互的API文档推荐阅读下一篇《Django框架入门》体验全栈框架开箱即用的强大能力API设计没有银弹但遵循REST规范能让你的接口更容易被理解和消费。