一、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 body | requests.post(data=) | request.form |
post json | 现代api,复杂数据结构 | http body | requests.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服务器运行应用。
八、总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论