Python用Flask封装API及调用详解

2025-08-11 22:50

本文主要是介绍Python用Flask封装API及调用详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项...

一、Flask的优势

  • 轻量级:核心功能简单,易于学习和使用
  • 灵活性:可以通过扩展添加所需功能
  • 易扩展性:丰富的扩展生态系统(如Flask-RESTful、Flask-JWT等)
  • 开发效率高:快速原型开发,适合中小型项目

一、基础设置

先设置基本的Flask应用结构,创建了一个Flask应用实例,并定义了一个简单的业务逻辑函数main(),它接收查询文本和结果数量参数,返回包含这些信息的字典。

from flask import Flask, request, Response, jsonify, abort
import json

app = Flask(__name__)

def main(query, k):
    """业务逻辑处理函数
    
    Args:
        query (str): 查询文本
        k (int): 返回结果数量
    
    Returns:
        dict: 包含查询参数和结果的字典
    """
    return {"query": query, "k": k, "status": "success"}

二、GET请求方式

GET请求是最常见的HTTP方法,参数通过URL传递,适合简单的数据查询。

特点

  • 参数通过URL传递(查询字符串)
  • 有长度限制(不同浏览器限制不同,通常约2048字符)
  • 请求可以被缓存、保留在浏览器历史记录中
  • 不应用于敏感数据传输

服务端代码

模拟业务逻辑

@app.route('/api/search', methods=['GET'])
def handle_get():
    """处理GET请求
    
    参数通过URL查询字符串传递:
    - querandroidy: 必需,字符串类型
    - k: 可选,整数类型,默认为1
    
    Returns:
        Response: JSON格式的响应
    """
    # 获取并验证参数
    query = request.args.get("query")
    if not query:
        abort(400, description="query参数不能为空")
    
    try:
        k = int(request.args.get("k", 1))  # 默认为1
    except ValueError:
        abort(400, description="k必须是整数")
    
    # 调用业务逻辑
    result = main(query, k)
    
    # 返回JSON响应
    return jsonify(result)

客户端调用

import requests

# 构造URL参数
params = {
    'query': 'python Flask',
    'k': 3
}

# 发送GET请求
response = requests.get(
    url="http://127.0.0.1:8000/api/search",
    params=params
)

# 处理响应
if response.status_code == 200:
    print(response.json())
else:
    print(f"请求失败,状态码: {response.status_code}, 错误: {response.text}")

三、POST表单方式

POST表单方式适合传统的网页表单提交,数据通过HTTP body以application/x-www-form-urlencoded格式传输。

特点

  • 数据通过HTTP body传输
  • 使用application/x-www-form-urlencoded编码格式
  • 没有长度限制
  • 不会显示在URL中
  • 适合提交敏感数据或大量数据

服务端代码

@app.route('/api/form-submit', methods=['POST'])
def handle_post_form():
    """处理表单POST请求
    
    参数通过表单数据传递:
    - query: 必需,字符串类型
    - k: 可选,整数类型,默认为1
    
    Returns:
        Response: JSON格式的响应
    """
    # 获取并验证参数
    query = request.form.get("query")
    if not query:
        abort(400, description="query参数不能为空")
    
    try:
        k = int(request.form.get("k", 1))  # 默认为1
    except ValueError:
        abort(400, description="k必须是整数")
    
    # 调用业务逻辑
    result = main(query, k)
    
    # 返回JSON响应
    retwww.chinasem.cnurn jsonify(result)

客户端调用

import requests

# 准备表单数据
form_data = {
    'query': '表单提交示例',
    'k': 2
}

# 发送POST请求
response = requests.post(
    url="http://127.0.0.1:8000/api/form-submit",
    data=form_data
)

# 处理响应
if response.status_code == 200:
    print(response.json())
else:
    print(f"请求失败,状态码: {response.status_code}, 错误: {response.text}")

四、POST JSON方式

POST JSON方式是现代API常用的数据交换格式,适合传输结构化数据。

特点

  • 数据通过HTTP body传输
  • 使用application/json内容类型
  • 支持复杂数据结构(嵌套对象、数组等)
  • 是现代Web和移动应用的首选方式
  • 易于与前端框架(如React、vue)集成

服务端代码

@app.route('/api/json-submit', methods=['POST'])
def handle_post_json():
    """处理JSON POST请求
    
    参数通过JSON格式传递:
    - query: 必需,字符串类型
    - k: 可选,整数类型,默认为1
    
    Returns:
        Response: JSON格式的响应
    """
    # 验证请求内容类型
    if not request.is_json:
        abort(415, description="请求必须是JSON格式")
    
    # 获取JSON数据
    data = request.get_json()
    
    # 验证参数
    query = data.get("query")
    if not query:
        abort(400, description="query参数不能为空")
    
    try:
        k = int(data.get("k", 1))  # 默认为1
    except ValueError:
        abort(400, description="k必须是整数")
    
    # 调用业务逻辑
    result = main(query, k)
    
    # 返回JSON响应
    return jsonify(result)

客户端调用

import requests

# 准备JSON数据
json_data = {
    'query': 'JSON数据示例',
    'k': 4
}

# 发送POST请求
response = requests.post(
    url="http://127.0.0.1:8000/api/json-submit",
    jhttp://www.chinasem.cnson=json_data,  # 自动设置Content-Type为application/json
    headers={'Accept': 'application/json'}  # 明确要求JSON响应
)

# 处理响应
if response.status_code == 200:
    print(response.json())
else:
    print(f"请求失败,状态码: {response.status_code}, 错误: {response.text}")

五、错误处理

Flask提供了完善的错误处理机制

@app.errorhandler(400)
def bad_request(error):
    return jsonify({
        'status': 'error',
        'message': error.description
    }), 400

@app.errorhandler(404)
def not_found(error):
    return jsonify({
        'status': 'error',
        'message': '资源不存在'
    }), 404

@app.errorhandler(415)
def unsupported_media_type(error):
    return jsonify({
        'status': 'error',
        'message': error.description
    }), 415

六、对比

方式适用场景数据位置客户端调用方法服务端获取方法
GET简单查询,参数少URL查询字符串requests.get()request.args
POST表单传统网页表单提交HTTP Bodyrequests.post(data=)reChina编程quest.form
POST JSON现代API,复杂数据结构HTTP Bodyrequests.post(json=)request.get_json()

实践建议

  • 使用jsonify()代替手动JSON序列化
  • 为所China编程有API端点添加前缀(如/api/)
  • 实现统一的错误处理
  • 为每个端点编写详细的文档字符串
  • 在生产环境使用WSGI服务器(如Gunicorn)
  • 添加适当的认证和限流机制

七、启动

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000, debug=True)

注意:生产环境不应使用debug=True,且应通过WSGI服务器运行应用。

八、总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程China编程(www.chinasem.cn)。

这篇关于Python用Flask封装API及调用详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155687

相关文章

基于Python实现数字限制在指定范围内的五种方式

《基于Python实现数字限制在指定范围内的五种方式》在编程中,数字范围限制是常见需求,无论是游戏开发中的角色属性值、金融计算中的利率调整,还是传感器数据处理中的异常值过滤,都需要将数字控制在合理范围... 目录引言一、基础条件判断法二、数学运算巧解法三、装饰器模式法四、自定义类封装法五、NumPy数组处理

Python中经纬度距离计算的实现方式

《Python中经纬度距离计算的实现方式》文章介绍Python中计算经纬度距离的方法及中国加密坐标系转换工具,主要方法包括geopy(Vincenty/Karney)、Haversine、pyproj... 目录一、基本方法1. 使用geopy库(推荐)2. 手动实现 Haversine 公式3. 使用py

Spring Integration Redis 使用示例详解

《SpringIntegrationRedis使用示例详解》本文给大家介绍SpringIntegrationRedis的配置与使用,涵盖依赖添加、Redis连接设置、分布式锁实现、消息通道配置及... 目录一、依赖配置1.1 Maven 依赖1.2 Gradle 依赖二、Redis 连接配置2.1 配置 R

Python WSGI HTTP服务器Gunicorn使用详解

《PythonWSGIHTTP服务器Gunicorn使用详解》Gunicorn是Python的WSGI服务器,用于部署Flask/Django应用,性能高且稳定,支持多Worker类型与配置,可处... 目录一、什么是 Gunicorn?二、为什么需要Gunicorn?三、安装Gunicorn四、基本使用启

python urllib模块使用操作方法

《pythonurllib模块使用操作方法》Python提供了多个库用于处理URL,常用的有urllib、requests和urlparse(Python3中为urllib.parse),下面是这些... 目录URL 处理库urllib 模块requests 库urlparse 和 urljoin编码和解码

使用Python提取PDF大纲(书签)的完整指南

《使用Python提取PDF大纲(书签)的完整指南》PDF大纲(Outline)​​是PDF文档中的导航结构,通常显示在阅读器的侧边栏中,方便用户快速跳转到文档的不同部分,大纲通常以层级结构组织,包含... 目录一、PDF大纲简介二、准备工作所需工具常见安装问题三、代码实现完整代码核心功能解析四、使用效果控

C#中的Drawing 类案例详解

《C#中的Drawing类案例详解》文章解析WPF与WinForms的Drawing类差异,涵盖命名空间、继承链、常用类及应用场景,通过案例展示如何创建带阴影圆角矩形按钮,强调WPF的轻量、可动画特... 目录一、Drawing 是什么?二、典型用法三、案例:画一个“带阴影的圆角矩形按钮”四、WinForm

MySQL ORDER BY 语句常见用法、示例详解

《MySQLORDERBY语句常见用法、示例详解》ORDERBY是结构化查询语言(SQL)中的关键字,隶属于SELECT语句的子句结构,用于对查询结果集按指定列进行排序,本文给大家介绍MySQL... 目录mysql ORDER BY 语句详细说明1.基本语法2.排序方向详解3.多列排序4.常见用法示例5.

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默