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。