GET是HTTP协议中最常用的请求方法之一,主要用于从服务器获取资源。在Flask中处理GET请求是构建Web应用的基础操作。
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/projects', methods=['GET'])
def get_projects():
# 获取查询参数
search_term = request.args.get('search', '')
page = request.args.get('page', default=1, type=int)
per_page = request.args.get('per_page', default=10, type=int)
# 这里应该是从数据库获取项目的逻辑
# 示例数据
projects = [
{"id": 1, "name": "Project A", "status": "active"},
{"id": 2, "name": "Project B", "status": "completed"},
{"id": 3, "name": "Project C", "status": "active"}
]
# 简单的过滤逻辑
if search_term:
projects = [p for p in projects if search_term.lower() in p['name'].lower()]
# 分页逻辑
start = (page - 1) * per_page
end = start + per_page
paginated_projects = projects[start:end]
return jsonify({
"data": paginated_projects,
"total": len(projects),
"page": page,
"per_page": per_page
})
if __name__ == '__main__':
app.run(debug=True)
@app.route('/projects/<int:project_id>', methods=['GET'])
def get_project(project_id):
# 这里应该是从数据库获取单个项目的逻辑
# 示例数据
project = {"id": project_id, "name": f"Project {project_id}", "status": "active"}
if project:
return jsonify(project)
else:
return jsonify({"error": "Project not found"}), 404
问题:request.args.get()
返回None或默认值
原因:客户端没有发送对应的查询参数
解决:总是设置默认值或进行参数验证
# 不好的做法
page = request.args.get('page') # 可能为None
# 好的做法
page = request.args.get('page', default=1, type=int)
问题:当数据量大时,分页查询性能差 解决:使用数据库的分页功能而不是在内存中分页
# 使用SQLAlchemy的示例
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)
@app.route('/projects')
def get_projects():
page = request.args.get('page', 1, type=int)
per_page = request.args.get('per_page', 10, type=int)
# 使用SQLAlchemy的分页
pagination = Project.query.paginate(page=page, per_page=per_page)
return jsonify({
"data": [p.to_dict() for p in pagination.items],
"total": pagination.total,
"pages": pagination.pages,
"current_page": page
})
问题:客户端可能发送无效的参数值 解决:添加参数验证
from flask import abort
@app.route('/projects')
def get_projects():
page = request.args.get('page', 1, type=int)
if page < 1:
abort(400, description="Page must be greater than 0")
# 其他逻辑...
没有搜到相关的文章