一、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服务器运行应用。
八、总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论