2016-10-24 98 views
3

我在尝试从python脚本上传图像到Django时遇到了麻烦。我尝试了一些我发现的解决方案,但都没有成功。从Python脚本上传图片到Django

这是我的简化模型:

class ExampleModel(models.Model): 
    address = models.CharField(
     _('address'), 
     max_length=200, 
     blank=True, 
    ) 
    photo = models.ImageField(
     verbose_name='photo', 
     upload_to=path_for_photo, 
     null=True, 
     blank=True, 
     validators=[FileValidator(max_size=settings.MAX_PHOTO_SIZE, 
           allowed_mimetypes=settings.ALLOWED_CONTENT_TYPES, 
           allowed_extensions=settings.ALLOWED_EXTENSIONS),] 
) 

现在,我的看法是这样的:

def update(self, request, *args, **kwargs): 
    instance = self.get_object() 
    serializer = self.get_serializer(instance, data=request.data, partial=partial) 
    serializer.is_valid(raise_exception=True) 
    self.perform_update(serializer) 
    return Response(serializer.data) 

这是剧本我都在Python:

with open('test.jpg', 'rb') as payload: 
    headers = {'content-type': 'application/x-www-form-urlencoded'} 
    files = { 
     'file': payload, 
     'Content-Type': 'image/jpeg' 
    } 
    r = requests.put('http://localhost:8000/v1/myendpoint', 
         auth=('[email protected]', 'example'), 
         verify=False, files=files, headers=headers) 

但我不知道如何修改我的更新方法来更新图像。我已经尝试了几种方法:将它作为json发送(改变'content-type'并发送requests.put的'data'参数中的信息),将它作为InMemoryUploadedFile发送,还有一些其他我发现googleing的解决方案周围。

我从来没有想过,从Python上传一个简单的图像会很难!我可以在html表单中轻松做到这一点,但我需要从Python脚本中进行设置。

回答

2

试试这个:

with open('test.jpg', 'rb') as payload: 
    files = { 
     'photo': payload, 
     'Content-Type': 'image/jpeg' 
    } 
    r = requests.put(
     'http://localhost:8000/sendfiles/1/', 
     verify=False, files=files 
    ) 
    print(r) 

请求将看到“文件”参数的内容,并设置相应的头文件。


+0

坦克你@blazaid。我的标题是问题。最好。 – mcamacho