顾乔芝士网

持续更新的前后端开发技术栈

Flask-RESTful 用法指南

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。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言