You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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请求仍未解决。

错误原因

  1. URL路径参数语法错误:Django路径参数必须用尖括号<>包裹,原URL配置path('api/export/str:model_name/str:format/', ...)缺少尖括号,导致路由无法识别参数。
  2. 参数传递方式不匹配:视图类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,提问作者Иван Емельяненков

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 07:58:23