gañ*_*fla 2 csv django httpresponse django-serializer
我想创建一个端点,在此端点中可以发送 POST 请求,如果 POST 请求\nis 已验证,则页面下载 csv
\n\n我创建了序列化器表单来轻松验证收到的数据
\n\n我的问题是 csv 很容易在 HttpResponse 中下载,但我需要在发布请求中创建端点和数据验证。
\n\n我的主要问题是我不能\xc2\xb4t 返回export
下一个函数validation
这是我的文件
\n\n#urls.py\n\nfrom django.conf.urls import url\nfrom . import views\n\nurlpatterns = [\n url(r\'^hello-view/\', views.HelloApiView.as_view()),\n]\n
Run Code Online (Sandbox Code Playgroud)\n\n序列化器
\n\n#serializers.py\nfrom rest_framework import serializers\n\nclass HelloSerializer(serializers.Serializer):\n """Serializes a name field """\n\n name = serializers.CharField(max_length=100)\n seller_id = serializers.CharField(max_length=100)\n\n def validate_name(self, dob):\n UnitOfMeasureName = ["Each", "Grams", "Ounces", "Pounds", "Kilograms", "Metric Tons"]\n if dob in UnitOfMeasureName:\n return dob\n else:\n raise serializers.ValidationError(\'Wrong username\')\n
Run Code Online (Sandbox Code Playgroud)\n\n和视图文件\n在此文件中,我创建了导出函数来尝试导出 csv 数据,但不起作用
\n\nimport csv\nfrom django.shortcuts import render\nfrom django.http import HttpResponse\nfrom rest_framework import viewsets\nfrom rest_framework.views import APIView\nfrom rest_framework.response import Response\nfrom rest_framework import status\n\nfrom . import serializers\n\n\nclass HelloApiView(APIView):\n\n def export(self, request):\n response = HttpResponse(content_type=\'text/csv\')\n writer = csv.writer(response)\n writer.writerow([\'First name\', \'Last name\', \'ID\'])\n\n response[\'Content-Disposition\'] = \'attachment; filename="one.csv"\'\n return response\n\n serializer_class = serializers.HelloSerializer\n\n def get(self, request, format=None):\n\n an_apiview = [\n \'Uses HTTP METHOD as function\',\n \'Its is similar to a traditional django view\'\n ]\n\n return Response({\'message\': \'Hello\', \'anapi\': an_apiview})\n\n def post(self, request):\n serializer = serializers.HelloSerializer(data = request.data)\n\n if serializer.is_valid():\n in this place i want to return the file\n\n\n else:\n return Response(\n serializer.errors, status = status.HTTP_400_BAD_REQUEST)\n
Run Code Online (Sandbox Code Playgroud)\n
将新端点添加到您的 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"),
]
Run Code Online (Sandbox Code Playgroud)
然后在你的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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2536 次 |
最近记录: |