8 Flask-Restfull风格API

使用 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-RESTfulFlask-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 请求,尤其是在 POSTPUT 请求中。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 身份验证

  1. 获取 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 字段。
  2. 访问受保护资源

    • 使用获取到的 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 方法(如 getpost)。
  • 处理 JSON 请求与响应:使用 reqparse 解析请求中的 JSON 数据,返回 JSON 格式的响应。
  • API 身份验证:使用 Flask-JWT-Extended 扩展实现基于 JWT 的身份验证,保护需要身份验证的资源。

通过这些步骤,你可以创建一个功能丰富的 RESTful API,并确保 API 的安全性。Flask 和 Flask-RESTful 提供了强大的灵活性,让你能够快速构建、扩展和管理 Web 服务。如果你有任何问题或进一步的需求,欢迎留言讨论!

更多请关注WX公众号 “学GIS的小宝同学”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值