post 请求后 Django 下载 csv

Django Download csv after post request

我想创建一个端点,在这个端点可以发送 POST 请求,如果 POST 请求 已验证,然后页面下载一个 csv

我创建了序列化器表单来轻松验证接收到的数据

我的问题是 csv 很容易在 HttpResponse 中下载,但我需要在 post 请求中创建端点和数据验证。

我的主要问题是我无法 return validation

export 函数

这是我的文件

#urls.py

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^hello-view/', views.HelloApiView.as_view()),
]

序列化程序

#serializers.py
from rest_framework import serializers

class HelloSerializer(serializers.Serializer):
    """Serializes a name field """

    name = serializers.CharField(max_length=100)
    seller_id =  serializers.CharField(max_length=100)

    def validate_name(self, dob):
        UnitOfMeasureName = ["Each", "Grams", "Ounces", "Pounds", "Kilograms", "Metric Tons"]
        if dob in UnitOfMeasureName:
            return dob
        else:
            raise serializers.ValidationError('Wrong username')

和视图文件 在此文件中,我创建了导出功能以尝试导出 csv 数据,但不起作用

import csv
from django.shortcuts import render
from django.http import HttpResponse
from rest_framework import viewsets
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

from . import serializers


class HelloApiView(APIView):

    def export(self, request):
        response = HttpResponse(content_type='text/csv')
        writer = csv.writer(response)
        writer.writerow(['First name', 'Last name', 'ID'])

        response['Content-Disposition'] = 'attachment; filename="one.csv"'
        return response

    serializer_class = serializers.HelloSerializer

    def get(self, request, format=None):

        an_apiview = [
            'Uses HTTP METHOD as function',
            'Its is similar to a traditional django view'
        ]

        return Response({'message': 'Hello', 'anapi': an_apiview})

    def post(self, request):
        serializer = serializers.HelloSerializer(data = request.data)

        if serializer.is_valid():
                in this place i want to return the file


        else:
            return Response(
                serializer.errors, status = status.HTTP_400_BAD_REQUEST)

向您的 urls.py 文件添加一个新端点

#urls.py

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^hello-view/', views.HelloApiView.as_view()),
    url(r'^csv_download/$', views.csv_download, name="csv_download"),
]

然后在您的 views.py 文件中,添加一个名为 csv_download 的函数并将您所有的东西移到那里(这可能是不必要的,但它确实使代码更清晰、更易读)

# views.py

import csv
from django.shortcuts import render
from django.http import HttpResponse
from rest_framework import viewsets
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

from . import serializers


class HelloApiView(APIView):
    def get(self, request, format=None):
        an_apiview = [
            'Uses HTTP METHOD as function',
            'Its is similar to a traditional django view'
        ]
        return Response({'message': 'Hello', 'anapi': an_apiview})


def csv_download(request):


    if request.method == 'POST':
        serializer_class = serializers.HelloSerializer
        serializer = serializers.HelloSerializer(data = request.data)
        if serializer.is_valid():
            response = HttpResponse(content_type='text/csv')
            response['Content-Disposition'] = 'attachment; filename="one.csv"'
            writer = csv.writer(response,delimiter=',') # I always like to specify the delimeter
            writer.writerow(['First name', 'Last name', 'ID'])



            #Then you may actually want to write some data to the CSV file, currently, you've only defined the headers (first row). An example would be like:
            for value in list_of_objects:
                writer.writerow([
                value.first_name,
                value.last_name,
                value.id
                ])

            return response


        else:
            return Response(
                serializer.errors, status = status.HTTP_400_BAD_REQUEST)

    else:
        # redirect them or do something here if they hit this URL without a POST request