百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Flask-RESTful 用法指南(flask写restful接口)

zhezhongyun 2025-05-05 20:10 27 浏览

Flask-RESTful 是一个 Flask 扩展,用于快速构建 RESTful API。它提供了简单的语法来创建资源路由,并内置了请求解析和响应格式化功能。


## 安装


首先安装 Flask-RESTful:


```bash

pip install flask-restful

```


## 基本用法


### 1. 创建 API 和资源


```python

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, '/')

```


### 2. 运行应用


```python

if __name__ == '__main__':

app.run(debug=True)

```


## 资源路由


### 带参数的路由


```python

class Greet(Resource):

def get(self, name):

return {'message': f'Hello, {name}!'}


api.add_resource(Greet, '/greet/<string:name>')

```


### 多路由


```python

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

```


## 请求方法


支持标准的 HTTP 方法:


```python

class Todo(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]}

def delete(self, todo_id):

del todos[todo_id]

return '', 204


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

```


## 请求解析


Flask-RESTful 提供了 `reqparse` 模块来处理请求数据:


```python

from flask_restful import reqparse


parser = reqparse.RequestParser()

parser.add_argument('rate', type=int, help='Rate cannot be converted')

parser.add_argument('name', required=True, help="Name cannot be blank!")


class ParseDemo(Resource):

def post(self):

args = parser.parse_args()

return {'data': args}

```


## 响应格式化


使用 `marshal_with` 装饰器格式化响应:


```python

from flask_restful import fields, marshal_with


resource_fields = {

'name': fields.String,

'address': fields.String,

'date_updated': fields.DateTime(dt_format='rfc822'),

}


class User(Resource):

@marshal_with(resource_fields)

def get(self):

return get_user() # 返回的字典会自动格式化

```


## 完整示例


```python

from flask import Flask

from flask_restful import Api, Resource, reqparse, fields, marshal_with


app = Flask(__name__)

api = Api(app)


todos = {}


todo_fields = {

'task': fields.String,

'uri': fields.Url('todo')

}


class Todo(Resource):

def __init__(self):

self.parser = reqparse.RequestParser()

self.parser.add_argument('task', type=str, required=True,

help='No task provided')

@marshal_with(todo_fields)

def get(self, todo_id):

return todos[todo_id]

@marshal_with(todo_fields)

def put(self, todo_id):

args = self.parser.parse_args()

todos[todo_id] = {'task': args['task']}

return todos[todo_id]

def delete(self, todo_id):

del todos[todo_id]

return '', 204


api.add_resource(Todo, '/todos/<int:todo_id>')


if __name__ == '__main__':

app.run(debug=True)

```


## 最佳实践


1. **错误处理**:使用 `abort` 返回 HTTP 错误

```python

from flask_restful import abort

if todo_id not in todos:

abort(404, message="Todo {} doesn't exist".format(todo_id))

```


2. **认证**:可以添加装饰器来处理认证


3. **数据库集成**:通常与 SQLAlchemy 或 Flask-SQLAlchemy 一起使用


4. **蓝图**:对于大型应用,使用 Flask 蓝图组织 API


Flask-RESTful 提供了简单而强大的工具来构建 RESTful API,适合中小型项目。对于更复杂的 API,可以考虑 Flask-RESTPlus 或 FastAPI。

相关推荐

VRay材质 VRayALSurfaceMtl(VRay材质库下载)

本期给大家提供V-RayalSurface材质的详细信息。V-RayALSurfaceshader是V-Ray对AndersLangland的alShader的实现,它被设计用来重现皮肤的外...

JavaScript 强制回流问题及优化方案

JavaScript代码在运行过程中可能会强制触发浏览器的回流(Reflow),导致主线程被阻塞。回流(Reflow)是浏览器重新计算页面元素布局的过程(如位置、大小等),属于高开销操作。频繁或同...

前端每日一读,大厂面试无忧:网络与安全—浏览器渲染流程、重排

哈咯~大家好~又是美好的一天,前端小菜鸟上线啦,为大家带来今天的“前端每日一读,大厂面试无忧”——浏览器渲染流程,重排、重绘,以及如何避免重排和重绘浏览器的渲染流程是一个包含多个步骤的复杂过程,主...

移动端浏览器性能优化探索(主流移动端浏览器的开发模式和特性)

鲁田(程禄)大淘宝技术2023-05-2416:20发表于浙江在移动端的页面开发过程中,我们经常提及页面性能优化、消除页面卡顿的话题,如何·确定优化策略,我们首先应当对页面卡顿的行为有所认知...

大厂都在用的10个css高级技巧,我敢说你最多用过3个!不服来辩!

1.clamp()函数:流体布局神器应用场景:苹果官网响应式字号、淘宝商品卡片宽度自适应。代码案例:<style>.clamp-text{font-size:clamp(1...

Qt Quick模块之Item(qt item model)

QtQuick模块简介QtQuick模块作为一个编写QML应用程序的标准库,提供了用于创建用户界面的所有基本类型,使用这些类型可以创建动态可视化组件、接收用户输入、创建数据模型和视图。QtQu...

零基础教你学前端——44、矩形、圆形和椭圆形

使用SVG绘制矩形、圆形和椭圆形。SVG有一些预定义的形状元素,可以供开发者使用。这些元素分别是矩形、圆形circle、椭圆ellipse、线条line、多线条polyline、多边形po...

Three.JS教程5 threejs中的材质(threejs自定义材质)

Three.js中的材质(Material)是实现引人注目的3D效果的关键组件之一。本篇博客中,我们将深入探讨Three.js中的材质类型、属性和用法。一、什么是Three.js材质?在Three.j...

WinForm开发是如何美化表单?这个小控件意外好用

点击“了解更多”获取DevExpressv20.2完整版下载DevExpressskins和LookAndFeelandSkinning技术只能应用于DevExpress控件,为了在整个应...

前端开发必备!Swiper 轮播与 Lightbox 灯箱组件深度解析

在互联网产品不断迭代升级的今天,用户对于页面交互和视觉效果的要求越来越高。想要快速打造出吸睛又实用的项目,合适的组件必不可少。今天就为大家推荐两款超好用的组件——Swiper轮播组件和Light...

「网络安全」常见攻击篇(20)——点击劫持

什么是点击劫持?点击劫持(Clickjacking)技术又称为界面伪装攻击(UIredressattack),是一种视觉上的欺骗手段。通常有两种方式:攻击者使用一个透明的iframe,覆盖...

QML属性大总结(qml 默认属性)

一、公共属性QML里的各个可视化对象均继承与Item类,因此公共属性也就是Item的属性注意:Item本身是不可视化的1、标识符:id功能:标识对象,方便引用特点:必须唯一(可省略非必需),不然使用的...

原来隐藏一个DOM元素可以有这么多种方式,最后一种你肯定不知道

我们在日常编码的时候,隐藏一个dom元素有很多种方式,今天我们来盘点一下隐藏dom元素有哪些方式,最后一种,你绝对没有用过。display:none作为经常用来隐藏元素的css属性,di...

10个案例详解AnimatableExtend装饰器定义可动画属性

Hello,大家好,我是V哥。HarmonyOSNEXT开发中,使用@AnimatableExtend装饰器来定义可动画属性是个很好玩的事情,废话不多说,马上进入主题,先来看一下基本语法,接着...

不看必后悔!15个三星GoodLock隐藏小技巧~(上)

很多刚用三星手机的星粉们,一定对三星GoodLock这个宝藏App还不是很了解,今天就带大家一起详细去看看GoodLock这个大家族究竟有多少宝藏功能及成员呢?让我们一起来看看吧~由于Good...