Как загрузить файл с Django Rest APi
может кто-нибудь помочь мне загрузить файл с помощью метода POST в django rest api,
например, когда я запускаю
curl -X POST 127.0.0.1:8000/api/v1/assets/ -d '{"name" = "my image ","source"="/root/images/my_image2.jpg"}' -H "Content-Type: application/json"
Я хочу загрузить my_image2.jpg
serializers.py:
from django.forms import widgets
from rest_framework import serializers
from .models import Asset
class AssetSerializer(serializers.ModelSerializer):
class Meta:
model = Asset
views.py:
from .serializers import AssetSerializer
from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework import status
from rest_framework.decorators import api_view
class AssetAdd(APIView):
def post(self, request, format=None):
serializer = AssetSerializer(data=request.DATA)
print serializer.data
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
models.py
class Asset(models.Model):
key = models.CharField(max_length=8, unique=True, editable=False)
name = models.CharField(_('name'), max_length=200)
source = models.FileField(_('file'), upload_to=upload_to, storage=default_storage)
ext = models.CharField(max_length=15, editable=False)
type = models.PositiveIntegerField(choices=ASSET_TYPE, max_length=15, editable=False)
size = models.PositiveIntegerField(max_length=32, default=0, editable=False)
_file_meta = models.TextField(editable=False, null=True, blank=True)
public = models.BooleanField(default=False)
position = models.PositiveIntegerField(default=1)
object_id = models.PositiveIntegerField(default=1)
content_type = models.ForeignKey(ContentType, blank=True, null=True)
content_object = generic.GenericForeignKey('content_type', 'object_id')
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now_add=True, auto_now=True)
Я новичок в API Django REST, я читаю документацию http://www.django-rest-framework.org/api-guide/parsers.html#fileuploadparser, но все еще не расстроен, как это сделать
Ответы
Ответ 1
Прежде всего вам нужно определить парсер в вашем представлении. Это связано с тем, что API должен знать, какие заголовки искать. Браузеры передают файлы как данные формы, поэтому вам нужно использовать MultiPartParser и FormParser вместе. Вы также можете использовать FileUploadParser, но вам нужно убедиться, что ваш клиент отправляет правильные заголовки HTTP.
from rest_framework.parsers import MultiPartParser, FormParser
class AssetAdd(APIView):
parser_classes = (MultiPartParser, FormParser,)
Затем в методе post ваш файл будет присутствовать в FILES QueryDict:
def post(self, request, format=None):
my_file = request.FILES['file_field_name']
filename = '/tmp/myfile'
with open(filename, 'wb+') as temp_file:
for chunk in my_file.chunks():
temp_file.write(chunk)
my_saved_file = open(filename) #there you go
Ответ 2
Напишите свои модели так:
from django.db import models
class PicModel(models.Model):
file_to_be_uploaded = models.FileField(upload_to='/directory/where/you/what/to/upload/to')
если вы загружаете изображения, тогда ImageField, но устанавливайте подушку с помощью pip install pillow
.
В вас serializers.py
если вы используете rest_framework
:
from rest_framework import serializers
from app_name.models import PicModel
class PicSerializer(serializers.ModelSerializer):
class Meta:
model = PicModel
fields = '__all__' #or any way you may like to display you fields
В ваш views.py
предполагая, что вы используете базовые представления классов:
from app_name.models import PicModel
from app_name.serializers import PicModelSerializer
#other necessary imports
class PicList(APIView):
def post(self, request, format=None):#or format can be json or api
serializer = PicModelSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
............more code
Для проверки данных в формате json напишите:
{
"file_to_be_uploaded":"//path//to//file//on//local//machine"
}