我正在通过Zend_Rest_Route使用Zend Framework构建RESTful api.对于文件上传,我应该使用PUT还是POST来处理这个过程?我试图尽可能地与REST动词的定义保持一致.请参考:PUT或POST:故事的REST
我理解这一点的方式是,当且仅当我更新指定资源的完整内容时,我才应该使用PUT.我必须知道PUT的确切URL.另一方面,如果我使用某种服务器端算法向服务器发送命令以创建指定资源的下级,我应该使用POST.
我们假设这是一个用于图像上传的REST API.这是否意味着我应该使用POST,如果服务器要操纵图像文件(即创建缩略图,调整大小等); 如果我只是将图像原始文件保存到服务器,请使用PUT?
如果我使用PUT来处理文件上传,那么流程应该如下:
我对这些东西很陌生; 所以希望我在这里有意义......
如果您知道"最佳"方式,请随时发表评论.
我正在尝试编写一个Django Rest Framework API处理程序,它可以接收文件以及JSON有效负载.我已将MultiPartParser设置为处理程序解析器.
但是,我似乎无法做到这两点.如果我将带有文件的有效负载作为多部分请求发送,则在request.data中以错误的方式提供JSON有效负载(第一个文本部分,直到第一个冒号为键,其余为数据).我可以很好地发送标准表单参数中的参数 - 但我的其余API接受JSON有效负载,我希望保持一致.request.body因为它引发而无法读取*** RawPostDataException: You cannot access body after reading from request's data stream
例如,请求正文中的文件和此有效负载:
{"title":"Document Title", "description":"Doc Description"}
变为:
<QueryDict: {u'fileUpload': [<InMemoryUploadedFile: 20150504_115355.jpg (image/jpeg)>, <InMemoryUploadedFile: Front end lead.doc (application/msword)>], u'{%22title%22': [u'"Document Title", "description":"Doc Description"}']}>
有没有办法做到这一点?我可以吃我的蛋糕,保留它并且不会增加任何重量吗?
编辑:有人建议这可能是Django REST Framework上传图片的副本 :"提交的数据不是文件".它不是.上传和请求是在multipart中完成的,请记住文件并上传它很好.我甚至可以使用标准表单变量来完成请求.但我想知道我是否可以在那里获得JSON有效负载.
有人可以帮助我如何在django rest api中使用POST方法上传文件,例如当我启动时
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"
Run Code Online (Sandbox Code Playgroud)
我想上传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
Run Code Online (Sandbox Code Playgroud)
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() …Run Code Online (Sandbox Code Playgroud) 我需要一个图片上传指令,这是我的代码的样子:
# Model
class transporter(models.Model):
company_name = models.CharField(max_length=100)
address = models.CharField(max_length=100)
image = models.FileField(upload_to=upload_path,blank=True, null=True)
def upload_path(self, filename):
return 'photos/%s/%s' % (self.company_name, filename)
# Serializer
class transporterSerializer (serializers.HyperlinkedModelSerializer):
username = serializers.Field(source='username.username')
class Meta:
model = transporter
fields = ('id','company_name','address','image')
Run Code Online (Sandbox Code Playgroud)
它只适用于django休息框架,但如果我使用angularjs发布传输器模型,我会收到错误的请求错误.我需要上传图片并使用图片网址设置图片字段.谢谢
django image-uploading django-rest-framework angularjs-directive
所以我一直试图将文件上传到使用DRF的方法到目前为止没有运气.
我能够上传到没有问题的ModelViewSet使用(FormParser, MultiPartParser,),但我真的需要在这样的http://localhost:8000/api/v1/women/{pk}/upload_avatar/地方使用它,我想先通过id过滤女人并上传到她的头像(这是多媒体模型的外键).我尝试使用嵌套资源库而没有运气.
到目前为止我在我的modelviewset中:
class WomenNativePassportViewSet(viewsets.ModelViewSet):
queryset = Women.objects.all()
serializer_class = WomenNativePassportSerializer
authentication_classes = (NoAuthentication,)
permission_classes = (AllowAny,)
parser_classes = (FormParser, MultiPartParser,)
@detail_route(
methods=['post', 'put', 'patch', 'get'], permission_classes=[AllowAny],
authentication_classes=[NoAuthentication], serializer_class=MultimediaSerializer,
parser_classes=(FormParser, MultiPartParser,)
)
def upload_avatar(self, request, pk=None, *args, **kwargs):
if 'POST' in request._method or 'PATCH' in request._method:
# Write code to save the file??
else:
multimedia = Multimedia.objects.filter(user_profiles_avatares__pk=pk)
page = self.paginate_queryset(multimedia)
serializer = self.get_pagination_serializer(page)
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
我的模特:
class Women(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL)
avatar = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用DRF和jQuery构建文件上传.我用谷歌搜索并找到了这个样本.我在beckand上有一些类似的代码:
class Attachment(BaseModel):
file = models.FileField(upload_to=get_photo_path)
class AttachmentSerializer(serializers.ModelSerializer):
class Meta:
model = models.Attachment
fields = ('id', 'file')
class AttachmentViewSet(viewsets.ModelViewSet):
parser_classes = (FileUploadParser, )
serializer_class = serializers.AttachmentSerializer
queryset = models.Attachment.objects.all()
def pre_save(self, obj):
obj.file = self.request.FILES.get('file')
Run Code Online (Sandbox Code Playgroud)
并尝试将Angular示例转换为jQuery
var fd = new FormData()
fd.append('file', file) // file from file-field
var reader = new FileReader()
$.ajax({
url: 'http://localhost:8001/files/',
data: fd,
processData: false,
contentType: false,
type: 'POST'
}).done(...
Run Code Online (Sandbox Code Playgroud)
出于某些原因,我在尝试上传文件时后端出错:
detail: "FileUpload parse error - none of upload handlers can handle the stream"
Run Code Online (Sandbox Code Playgroud) 我在解析视图集中的request.data时遇到问题。我有一个模型,可以根据产品添加多个图像。
我想从传入数据中分离图像,将产品数据发送到 ProductSerializer,然后将图像与产品数据一起发送到其序列化器并保存。
我有两个模型,就像这样:
def Product(models.Model):
name = models.CharField(max_length=20)
color = models.ForeignKey(Color, on_delete=models.CASCADE)
def Color(models.Model):
name = models.CharField(max_length=15)
def ProductImage(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
image = models.ImageField(upload_to='product_pics/')
Run Code Online (Sandbox Code Playgroud)
我想发送到产品(127.0.0.1:8000/products/)的请求就像:
{
"name": "strawberry",
"color": {
"name": "red"
},
"productimage_set": [
{"image": "<some_encode_image_data>"}
]
}
Run Code Online (Sandbox Code Playgroud)
序列化器没有什么特别的,只是提取标签链接,所以我没有写它。如何发送多部分/表单数据以及如何在视图集中解析它?或者解决办法是什么?
python django serialization django-rest-framework django-rest-viewsets
我有两个序列化器:PostSerializer和PostImageSerializer,它们都继承了 DRF ModelSerializer。PostImage 模型通过 related_name='photos' 与 Post 相关联。
由于我希望序列化程序执行update,PostSerializer 覆盖 ModelSerializer 中的 update() 方法,如官方 DRF 文档中所述。
class PostSerializer(serializers.ModelSerializer):
photos = PostImageSerializer(many=True)
class Meta:
model = Post
fields = ('title', 'content')
def update(self, instance, validated_data):
photos_data = validated_data.pop('photos')
for photo in photos_data:
PostImage.objects.create(post=instance, image=photo)
return super(PostSerializer, self).update(instance, validated_data)
class PostImageSerializer(serializer.ModelSerializer):
class Meta:
model = PostImage
fields = ('image', 'post')
Run Code Online (Sandbox Code Playgroud)
我还定义了一个继承ModelViewSet 的 ViewSet。
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
Run Code Online (Sandbox Code Playgroud)
最后 PostViewSet …