当前位置: 代码网 > it编程>前端脚本>Python > Python用Flask封装API及调用详解

Python用Flask封装API及调用详解

2025年08月11日 Python 我要评论
一、flask的优势轻量级:核心功能简单,易于学习和使用灵活性:可以通过扩展添加所需功能易扩展性:丰富的扩展生态系统(如flask-restful、flask-jwt等)开发效率高:快速原型开发,适合

一、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查询字符串传递:
    - query: 必需,字符串类型
    - 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响应
    return 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",
    json=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=)request.form
post json现代api,复杂数据结构http bodyrequests.post(json=)request.get_json()

实践建议

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

七、启动

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

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

八、总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com