gpt4 book ai didi

Django 在发布请求后下载 csv

转载 作者:行者123 更新时间:2023-12-02 19:26:46 25 4
gpt4 key购买 nike

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

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

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

我的主要问题是我无法在验证之后返回导出函数

这是我的文件

#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')

以及 View 文件在此文件中,我创建了导出函数来尝试导出 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

关于Django 在发布请求后下载 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62315904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com