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

相关文章

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程

Python轻松实现Word到Markdown的转换

《Python轻松实现Word到Markdown的转换》在文档管理、内容发布等场景中,将Word转换为Markdown格式是常见需求,本文将介绍如何使用FreeSpire.DocforPython实现... 目录一、工具简介二、核心转换实现1. 基础单文件转换2. 批量转换Word文件三、工具特性分析优点局

Python中4大日志记录库比较的终极PK

《Python中4大日志记录库比较的终极PK》日志记录框架是一种工具,可帮助您标准化应用程序中的日志记录过程,:本文主要介绍Python中4大日志记录库比较的相关资料,文中通过代码介绍的非常详细,... 目录一、logging库1、优点2、缺点二、LogAid库三、Loguru库四、Structlogphp

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra