本文目录导读:

在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:全功能,适合大型项目
根据具体使用场景选择合适的方式即可。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播