本文目录导读:

在Python中,返回接口数据通常是指Web框架(如Flask、FastAPI、Django Rest Framework等)处理HTTP请求后返回JSON或XML格式的数据,以下是几种常见场景的实现方法:
Flask框架返回接口数据
from flask import Flask, jsonify, make_response
app = Flask(__name__)
# 简单JSON返回
@app.route('/api/user')
def get_user():
user_data = {
'id': 1,
'name': '张三',
'age': 25,
'email': 'zhangsan@example.com'
}
return jsonify(user_data)
# 自定义状态码和headers
@app.route('/api/error')
def error_response():
response = jsonify({
'code': 400,
'message': '参数错误',
'data': None
})
response.status_code = 400
response.headers['X-Custom-Header'] = 'custom_value'
return response
# 使用make_response
@app.route('/api/custom')
def custom_response():
data = {'key': 'value'}
response = make_response(jsonify(data))
response.status_code = 200
response.mimetype = 'application/json'
return response
if __name__ == '__main__':
app.run(debug=True)
FastAPI框架返回接口数据
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Optional
import uvicorn
app = FastAPI()
class User(BaseModel):
id: int
name: str
age: int
email: str
# 自动序列化为JSON
@app.get("/api/user/{user_id}")
async def get_user(user_id: int):
user = User(
id=user_id,
name="张三",
age=25,
email="zhangsan@example.com"
)
return user # FastAPI自动转换
# 使用Response直接控制
from fastapi import Response
from fastapi.responses import JSONResponse
@app.get("/api/direct")
async def direct_response():
content = {
'code': 200,
'message': 'success',
'data': {'key': 'value'}
}
return JSONResponse(content=content, status_code=200)
# 错误处理
@app.get("/api/error")
async def error_example():
raise HTTPException(
status_code=404,
detail="用户不存在",
headers={"X-Error": "User not found"}
)
if __name__ == '__main__':
uvicorn.run(app, host='0.0.0.0', port=8000)
Django REST Framework返回接口数据
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
class UserAPIView(APIView):
def get(self, request):
user_data = {
'id': 1,
'name': '张三',
'age': 25,
'email': 'zhangsan@example.com'
}
# 标准返回
return Response(user_data)
def post(self, request):
# 处理创建用户逻辑
return Response({
'code': 201,
'message': '创建成功'
}, status=status.HTTP_201_CREATED)
# 使用ViewSet + ModelSerializer
from rest_framework import viewsets
from .models import User
from .serializers import UserSerializer
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
def list(self, request, *args, **kwargs):
queryset = self.get_queryset()
serializer = self.get_serializer(queryset, many=True)
return Response({
'code': 200,
'data': serializer.data,
'total': queryset.count()
})
通用API设计最佳实践
统一响应格式
from typing import Any, Optional
from flask import jsonify
class APIResponse:
@staticmethod
def success(data: Any = None, message: str = "success", code: int = 200):
response = {
'code': code,
'message': message,
'data': data,
'timestamp': int(time.time())
}
return jsonify(response), code
@staticmethod
def error(message: str, code: int = 400, data: Any = None):
response = {
'code': code,
'message': message,
'data': data,
'timestamp': int(time.time())
}
return jsonify(response), code
# 使用示例
@app.route('/api/posts')
def get_posts():
try:
posts = fetch_posts_from_db()
return APIResponse.success(posts)
except Exception as e:
return APIResponse.error(str(e), code=500)
分页响应
from flask import request
def paginated_response(query, page_size=10):
page = request.args.get('page', 1, type=int)
total = query.count()
items = query.offset((page-1)*page_size).limit(page_size).all()
return {
'code': 200,
'message': 'success',
'data': {
'items': items,
'total': total,
'page': page,
'page_size': page_size,
'total_pages': (total + page_size - 1) // page_size
}
}
返回多种格式接口数据
from flask import request, jsonify, Response
import xml.etree.ElementTree as ET
import json
@app.route('/api/data')
def multi_format_response():
data = {'name': '张三', 'age': 25}
format_type = request.args.get('format', 'json')
if format_type == 'xml':
# 返回XML格式
root = ET.Element("response")
for key, value in data.items():
child = ET.SubElement(root, key)
child.text = str(value)
xml_string = ET.tostring(root, encoding='unicode')
return Response(xml_string, mimetype='text/xml')
elif format_type == 'csv':
csv_string = "key,value\n"
for key, value in data.items():
csv_string += f"{key},{value}\n"
return Response(csv_string, mimetype='text/csv')
# 默认返回JSON
return jsonify(data)
- 统一格式:使用标准化的响应格式(code, message, data)
- 状态码合理:正确使用HTTP状态码(200成功,400参数错误,500服务器错误)
- 错误处理:全局捕获异常并返回友好错误信息
- 安全性:避免泄露敏感信息,添加必要的headers
- 性能考虑:大数据集使用分页,添加缓存头
- 版本控制:API路径包含版本号(如 /api/v1/)
选择哪种框架取决于你的项目需求:
- Flask:轻量级,适合小型项目
- FastAPI:高性能,自动生成文档,适合现代API
- Django REST:全功能,适合大型项目
根据具体使用场景选择合适的方式即可。