Django导出XLSX/CSV接口请求返回404错误求助
Django 导出XLSX/CSV接口404错误排查与修复
问题概述
编写ExportXLSXandCSV(APIView)视图类实现按参数导出XLSX或CSV文件,配置URL后发送请求http://127.0.0.1:8000/api/export/?model_name=Car&format=xlsx,终端返回404错误,错误日志显示请求路径异常:"GET /api/export/http://127.0.0.1:8000/api/export/?model_name=Car&format=xlsx HTTP/1.1" 404 6238,调整参数或使用Postman请求仍未解决。
错误原因
- URL路径参数语法错误:Django路径参数必须用尖括号
<>包裹,原URL配置path('api/export/str:model_name/str:format/', ...)缺少尖括号,导致路由无法识别参数。 - 参数传递方式不匹配:视图类
get方法定义接收路径参数model_name和format,但请求时使用的是查询参数(URL中?后的参数),两者不匹配导致路由无法匹配,触发404。
修复方案
根据当前请求方式(查询参数),修改视图类从请求的查询参数中获取值,同时修正URL配置:
1. 修正视图类代码
将get方法改为从request.query_params提取参数,不再依赖路径参数,同时补全参数校验和CSV生成逻辑:
class ExportXLSXandCSV(APIView): def get(self, request): # 从查询参数中获取model_name和format model_name = request.query_params.get('model_name') format = request.query_params.get('format') # 校验必填参数 if not model_name or not format: return Response({"detail": "model_name和format为必填参数。"}, status=400) models = { 'Country': Country, 'Car': Car, 'Manufacturer': Manufacturer, 'Comments': Comments } if model_name not in models: return Response({"detail": "无效的模型名称。"}, status=400) # 校验格式合法性 if format not in ['xlsx', 'csv']: return Response({"detail": "仅支持xlsx和csv格式。"}, status=400) model = models[model_name] data = model.objects.all() serializer_data = serializers.serialize('python', data) if format == 'xlsx': df = pd.DataFrame(serializer_data) response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') response['Content-Disposition'] = f'attachment; filename={model_name.lower()}_export.xlsx' df.to_excel(response, engine='openpyxl', index=False) return response elif format == 'csv': df = pd.DataFrame(serializer_data) response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = f'attachment; filename={model_name.lower()}_export.csv' df.to_csv(response, index=False) return response
2. 修正URL配置
去掉路径参数,改为匹配/api/export/基础路径:
path('api/export/', ExportXLSXandCSV.as_view(), name='export_data')
关键说明
原代码中serializer.serialize_csv(response, data)是错误写法,Django序列化器无此方法,改用pandas将序列化后的数据转换为CSV格式,保证逻辑正确性。
测试验证
重启服务后,发送原请求http://127.0.0.1:8000/api/export/?model_name=Car&format=xlsx即可正常导出文件。
内容的提问来源于stack exchange,提问作者Иван Емельяненков
相关产品推荐
相关产品推荐

