使用 Flask-RESTful 创建和管理 RESTful API
Flask 是一个非常适合快速开发 Web 应用的框架,配合 Flask-RESTful 扩展,我们可以轻松地构建 RESTful API。RESTful API 已成为现代 Web 服务的标准之一,广泛应用于前后端分离的项目和移动端开发。本文将向你展示如何使用 Flask 和 Flask-RESTful 创建 RESTful API,包括如何处理 JSON 请求与响应,以及如何实现基本的 API 身份验证(如使用 JWT)。
1. 安装 Flask-RESTful 和其他依赖
首先,我们需要安装 Flask-RESTful 和 Flask-JWT-Extended(用于 JWT 身份验证):
pip install flask-restful flask-jwt-extended
2. 创建 RESTful API
2.1 设置 Flask 项目结构
创建一个基础的 Flask 项目结构:
my_flask_api/
│
├── app.py # Flask 主程序
├── resources.py # 定义资源和视图
└── config.py # 配置文件
2.2 初始化 Flask 和 Flask-RESTful
在 app.py
中,初始化 Flask 和 Flask-RESTful:
from flask import Flask
from flask_restful import Api
from flask_jwt_extended import JWTManager
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key' # 设置密钥
app.config['JWT_ACCESS_TOKEN_EXPIRES'] = 3600 # JWT token 过期时间(秒)
api = Api(app) # 初始化 API
jwt = JWTManager(app) # 初始化 JWT 扩展
2.3 定义资源
Flask-RESTful 中的核心概念是资源(Resource),每个资源通常映射到 RESTful API 中的一种实体。
在 resources.py
文件中,定义一个简单的资源 HelloWorld
:
from flask_restful import Resource
class HelloWorld(Resource):
def get(self):
return {'message': 'Hello, World!'}
2.4 将资源添加到 API
接下来,我们将 HelloWorld
资源添加到 API 中,允许访问:
from flask import Flask
from flask_restful import Api
from resources import HelloWorld
app = Flask(__name__)
api = Api(app)
api.add_resource(HelloWorld, '/hello')
if __name__ == '__main__':
app.run(debug=True)
在浏览器或 Postman 中访问 http://127.0.0.1:5000/hello
,你应该能看到返回的 JSON 响应:
{
"message": "Hello, World!"
}
3. 处理 JSON 请求与响应
3.1 处理 JSON 请求
在 RESTful API 中,我们经常需要处理 JSON 请求,尤其是在 POST 或 PUT 请求中。Flask-RESTful 提供了一个方便的方式来接收和解析 JSON 数据。
from flask_restful import reqparse
class User(Resource):
def post(self):
# 解析请求中的 JSON 数据
parser = reqparse.RequestParser()
parser.add_argument('name', type=str, required=True, help="Name cannot be blank")
parser.add_argument('age', type=int, required=True, help="Age cannot be blank")
args = parser.parse_args() # 获取请求数据
# 处理数据并返回响应
return {'message': f'User {args["name"]} is {args["age"]} years old.'}, 201
3.2 处理 JSON 响应
在 Flask-RESTful 中,你可以通过简单地返回一个字典(它将自动转换为 JSON 格式)来发送 JSON 响应。例如:
class Greeting(Resource):
def get(self):
return {'message': 'Hello, Flask-RESTful!'}, 200
3.3 示例:使用 POST 请求发送 JSON 数据
使用 Postman 或 curl 发送以下请求:
POST http://127.0.0.1:5000/user
Content-Type: application/json
{
"name": "Alice",
"age": 30
}
你会得到如下响应:
{
"message": "User Alice is 30 years old."
}
4. API 身份验证:使用 JWT
在实际应用中,API 通常需要对请求进行身份验证。JSON Web Tokens(JWT)是一种流行的身份验证方法。下面是如何在 Flask 中使用 Flask-JWT-Extended 实现基本的 JWT 身份验证。
4.1 设置 JWT
首先,导入必要的模块并配置 Flask-JWT-Extended:
from flask_jwt_extended import create_access_token, jwt_required, get_jwt_identity
在 app.py
中,设置 Flask 配置和初始化 JWT 扩展:
app.config['JWT_SECRET_KEY'] = 'your_jwt_secret_key' # 设置 JWT 密钥
jwt = JWTManager(app) # 初始化 JWT
4.2 创建登录端点
创建一个登录端点,验证用户凭证并生成 JWT token。
from flask import request
from flask_jwt_extended import create_access_token
@app.route('/login', methods=['POST'])
def login():
# 获取请求中的用户名和密码
username = request.json.get('username', None)
password = request.json.get('password', None)
# 假设用户名和密码为 admin/secret
if username != 'admin' or password != 'secret':
return {'message': 'Invalid credentials'}, 401
# 创建并返回 JWT token
access_token = create_access_token(identity=username)
return {'access_token': access_token}, 200
4.3 保护需要身份验证的资源
使用 @jwt_required()
装饰器保护需要身份验证的资源。例如,只有通过 JWT 验证的用户才能访问 /profile
资源:
from flask_jwt_extended import jwt_required, get_jwt_identity
class Profile(Resource):
@jwt_required()
def get(self):
# 获取当前用户的身份信息
current_user = get_jwt_identity()
return {'message': f'Hello {current_user}'}
4.4 测试 JWT 身份验证
-
获取 JWT token:
- 使用
POST /login
请求获取 JWT token(用户名为admin
,密码为secret
)。
POST http://127.0.0.1:5000/login Content-Type: application/json { "username": "admin", "password": "secret" }
- 返回的响应中会包含一个
access_token
字段。
- 使用
-
访问受保护资源:
- 使用获取到的
access_token
作为 Bearer Token 访问/profile
。
GET http://127.0.0.1:5000/profile Authorization: Bearer <your_access_token>
如果身份验证成功,返回:
{ "message": "Hello admin" }
- 使用获取到的
在本文中,我们介绍了如何使用 Flask-RESTful 扩展来构建 RESTful API,包括:
- 创建资源和视图:通过继承
Resource
类定义 API 资源,并实现相应的 HTTP 方法(如get
、post
)。 - 处理 JSON 请求与响应:使用
reqparse
解析请求中的 JSON 数据,返回 JSON 格式的响应。 - API 身份验证:使用 Flask-JWT-Extended 扩展实现基于 JWT 的身份验证,保护需要身份验证的资源。
通过这些步骤,你可以创建一个功能丰富的 RESTful API,并确保 API 的安全性。Flask 和 Flask-RESTful 提供了强大的灵活性,让你能够快速构建、扩展和管理 Web 服务。如果你有任何问题或进一步的需求,欢迎留言讨论!
更多请关注WX公众号 “学GIS的小宝同学”