首页>Python>正文

Python Flask实战:从零搭建HTTP微服务

Feng 56 阅读 Python

Python Flask实战:从零搭建HTTP微服务

Flask是一个轻量级的Python Web框架,以其”微内核”设计哲学闻名。所谓”微”并非指功能简单,而是指核心简洁、高度可扩展——Flask只提供最基础的Web服务能力,其他所有功能都可通过丰富的扩展生态系统按需添加。这种设计让开发者能够从几行代码的简单应用开始,逐步构建出复杂的企业级系统。

一、环境搭建与依赖安装

1. 准备开发环境

确保已安装Python(建议版本3.7+),然后通过pip安装Flask依赖:

pip install flask

pip3 install flask

2. 验证安装是否成功

安装完成后,创建一个简单的应用来验证Flask是否正确安装并正常工作:

from flask import Flask  

app = Flask(__name__)  

@app.route('/', methods=['GET'])  
def hello():  
    """  
    处理根路径GET请求的处理函数  
    当用户访问网站根路径时,此函数会被调用  
    """    
    return "Flask安装成功!"  

if __name__ == '__main__':  
    app.run(debug=True)

运行上述代码后访问 http://127.0.0.1:5000,看到”Flask安装成功!”即表示环境配置完成。

二、基础HTTP接口实现

掌握Flask基础安装后,接下来学习如何实现常用的HTTP接口。涵盖GET和POST两种最常用的HTTP方法。

1. GET接口

GET请求用于从服务器获取数据,是最常用的HTTP方法。Flask提供了简洁的路由装饰器语法来处理不同类型的GET请求。

1.1 不带参数的GET接口

以下示例演示了最基本的路由定义,不接收任何参数,返回固定的JSON数据:

from flask import Flask, jsonify, request  

app = Flask(__name__)  

@app.route('/api/hello', methods=['GET'])  
def hello_world():  
    """  
    最简单的GET接口示例:不接收任何参数,返回固定的欢迎消息。常用于接口连通性测试。  
    """    
    return jsonify({  
        'message': 'Hello, World!',  
        'method': 'GET',  
        'status': 'success'  
    })  

if __name__ == '__main__':  
    app.run(debug=True, port=5000)
1.2 带路径参数的GET接口

路径参数是URL中可变的部分,用于标识特定资源。Flask通过<变量名>语法定义路径参数:

@app.route('/api/user/<int:user_id>', methods=['GET'])  
def get_user(user_id):  
    """  
    获取用户信息接口  
    路径参数:user_id - 用户ID(整数类型)  
    """    
    # 模拟从数据库查询用户  
    user = {  
        'id': user_id,  
        'name': f'用户{user_id}',  
        'email': f'user{user_id}@example.com'  
    }  
    return jsonify({  
        'data': user,  
        'method': 'GET',  
        'status': 'success'  
    })  
1.3 带查询参数的GET接口

查询参数是URL中?后面的部分,用于过滤或分页。Flask通过request.args获取:

@app.route('/api/users', methods=['GET'])  
def get_users():  
    """  
    获取用户列表接口  
    查询参数:page(页码)、per_page(每页数量)  
    """    
    page = request.args.get('page', 1, type=int)  
    per_page = request.args.get('per_page', 10, type=int)  

    # 模拟分页数据  
    users = [{'id': i, 'name': f'用户{i}'} for i in range(1, 21)]  
    start = (page - 1) * per_page  
    end = start + per_page  
    paginated_users = users[start:end]  

    return jsonify({  
        'data': paginated_users,  
        'pagination': {  
            'page': page,  
            'per_page': per_page,  
            'total': len(users)  
        },  
        'status': 'success'  
    })  

2. POST接口

POST请求用于向服务器提交数据,常用于创建资源或执行操作。

2.1 基础POST接口
@app.route('/api/user', methods=['POST'])  
def create_user():  
    """  
    创建用户接口  
    请求体:JSON格式的用户数据  
    """    
    # 获取请求体中的JSON数据  
    data = request.get_json()  

    # 验证必填字段  
    if not data or 'name' not in data or 'email' not in data:  
        return jsonify({  
            'error': '缺少必填字段:name和email',  
            'status': 'error'  
        }), 400  

    # 模拟创建用户  
    new_user = {  
        'id': 21,  # 模拟自增ID  
        'name': data['name'],  
        'email': data['email']  
    }  

    return jsonify({  
        'data': new_user,  
        'message': '用户创建成功',  
        'status': 'success'  
    }), 201  
2.2 带数据验证的POST接口
import re  

@app.route('/api/user/validated', methods=['POST'])  
def create_user_validated():  
    """  
    带数据验证的创建用户接口  
    验证邮箱格式和用户名长度  
    """    
    data = request.get_json()  

    # 验证邮箱格式  
    email_pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'  
    if not re.match(email_pattern, data.get('email', '')):  
        return jsonify({  
            'error': '邮箱格式不正确',  
            'status': 'error'  
        }), 400  

    # 验证用户名长度  
    name = data.get('name', '')  
    if len(name) < 2 or len(name) > 50:  
        return jsonify({  
            'error': '用户名长度必须在2-50个字符之间',  
            'status': 'error'  
        }), 400  

    # 创建用户逻辑...  
    return jsonify({  
        'message': '用户创建成功',  
        'status': 'success'  
    }), 201  

三、错误处理与响应格式化

1. 统一错误处理

@app.errorhandler(404)  
def not_found(error):  
    """404错误处理"""    
    return jsonify({  
        'error': '资源不存在',  
        'status': 'error'  
    }), 404  

@app.errorhandler(500)  
def internal_error(error):  
    """500错误处理"""    
    return jsonify({  
        'error': '服务器内部错误',  
        'status': 'error'  
    }), 500  

2. 统一响应格式

def success_response(data, message='操作成功'):  
    """成功响应格式"""    
    return jsonify({  
        'data': data,  
        'message': message,  
        'status': 'success'  
    })  

def error_response(message, status_code=400):  
    """错误响应格式"""    
    return jsonify({  
        'error': message,  
        'status': 'error'  
    }), status_code  

四、项目结构与部署

1. 推荐项目结构

my_flask_app/  
├── app/  
│   ├── __init__.py      # Flask应用工厂  
│   ├── routes/          # 路由模块  
│   ├── models/          # 数据模型  
│   ├── services/        # 业务逻辑  
│   └── utils/           # 工具函数  
├── config.py            # 配置文件  
├── requirements.txt     # 依赖列表  
└── run.py              # 启动入口  

2. 生产环境部署

# 使用gunicorn部署(Linux/Mac)  
gunicorn -w 4 -b 0.0.0.0:5000 app:create_app()  

# 使用waitress部署(Windows)  
waitress-serve --port=5000 app:create_app()  

五、总结

Flask以其简洁的设计和强大的扩展性,成为Python Web开发的首选框架之一。通过本文的学习,你已经掌握了:

  1. Flask环境的搭建与配置
  2. GET和POST接口的实现方法
  3. 路径参数和查询参数的处理
  4. 数据验证与错误处理
  5. 项目结构设计与生产部署

Flask的”微”哲学鼓励开发者从简单开始,按需扩展。随着业务复杂度的增加,你可以逐步引入数据库集成(Flask-SQLAlchemy)、用户认证(Flask-Login)、API文档(Flask-RESTx)等扩展,构建出完整的企业级应用。

记住,好的代码不是一次写成的,而是在不断迭代中完善的。从今天开始,用Flask搭建你的第一个API接口吧!

ID:318

Feng
这位作者很神秘,还没有填写简介。