django - Django在发布请求后下载csv
问题描述
我想创建一个端点,在这个端点可以发送 POST 请求,如果 POST 请求被验证,那么页面下载一个 csv
我创建了序列化程序表单以轻松验证接收到的数据
我的问题是 csv 很容易在 HttpResponse 中下载,但我需要在发布请求中创建端点并验证数据。
我的主要问题是我不能返回export
下一个函数validation
这是我的文件
#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
推荐阅读
- c - c 代码:防止在具有巨大模块的模块化操作中溢出(接近溢出阈值的模块)
- ssh - 无法在我的局域网外使用 webmin:VMWARE 上的 UBUNTU SERVER
- java - 使用递归和数组确保矩阵相邻
- c# - 如何避免在通过策略模式实现的控制器内部创建新的类实例?
- javascript - 删除列中的所有空单元格,然后将所有非空单元格向上移动
- xml - XPath 用分隔符连接选定的字符串或文本节点?
- python - ModuleNotFoundError:导入模块时没有名为“x”的模块
- stata - 编辑 hbar 图 (Stata)
- python - 如何使用 Jinja 循环遍历对象、字典和输出数据到表的数组?
- graphql - 如何在一个事务中进行相关的插入和更新?