2015-02-06 47 views
3

任何人都可以爲我提供一步一步/鏈接資源,瞭解如何使用REST API將文件從移動/桌面應用程序上載到基於Django的服務器?嘗試使用REST框架或Tastypie將圖像上傳到FileField模型

服務器有一個名爲「縮略圖」的FileField模型。我能夠上傳其他數據,但文件似乎是一個巨大的問題。

請注意,我不是通過一個HTTP請求談論使用的瀏覽器/ Django的形式上傳,但是從一個應用程序

API:

from models import Article 

class ArticleResource(ModelResource): 

    class Meta: 
     queryset = Article.objects.all() 
     resource_name = 'article' 
     filtering = {'title': ALL} 
     authorization=Authorization() 

我使用做出獨立python腳本的Http請求(模擬移動應用)

url="http://127.0.0.1:8000/articles/api/article/" 

data={ 
    'title':'Tastypie', 
    'body':'First Restful client', 
    'pub_date':'05/02/2015', 
    } 
files= {'thumbnail': open('django.png', 'rb')} 
headers = {'content-type': 'image/png'} 
print requests.post(url, files=files) 

模型:

class Article(models.Model): 
    title = models.CharField(max_length=200) 
    body = models.TextField() 
    pub_date = models.DateTimeField('date published') 
    likes = models.IntegerField(default=0) 
    thumbnail = models.FileField(blank=True,null=True,upload_to=get_upload_file_name) 
    def __unicode__(self): 
     return str(self.title) 

編輯:

這工作:

API:

class MultipartResource(object): 
     def deserialize(self, request, data, format=None): 
      if not format: 
       format = request.META.get('CONTENT_TYPE', 'application/json') 
      if format =='application/x-www-form-urlencoded': 
       return request.POST 
      if format.startswith('multipart'): 
       data = request.POST.copy() 
       photo = Article() 
       photo.thumbnail = request.FILES['thumbnail'] 
       photo.title = request.POST.get('title') 
       photo.body=request.POST.get('body') 
       photo.pub_date = request.POST.get('pub_date') 
       photo.save() 
       # ... etc 
       return data 
      return super(ArticleResource, self).deserialize(request, data, format) 

     # overriding the save method to prevent the object getting saved twice 
     def obj_create(self, bundle, request=None, **kwargs): 
      pass 


class ArticleResource(MultipartResource,ModelResource): 

    class Meta: 
     queryset = Article.objects.all() 
     resource_name = 'article' 
     filtering = {'title': ALL} 
     authorization=Authorization() 

HTTP請求的Python腳本:

url="http://127.0.0.1:8000/articles/api/article/" 

data={ 
    'title':'Tastypie', 
    'body':'First Restful client', 
    'pub_date':'2015-02-05', 
    } 
files= {'thumbnail': open('django.png', 'rb')} 

print requests.post(url, data=data, files=files).text 
+0

當你運行腳本時會發生什麼?或者更好的是,當你使用'curl'時會發生什麼,其餘的數據是否保存,而不是文件?還是這一切錯誤? – 2015-02-06 00:52:51

+0

@LegoStormtroopr每當我運行這樣的腳本時:'headers = {'content-type':'application/json'} print requests.post(url,data = json.dumps(data),headers = headers).text ' – aggolb 2015-02-06 08:25:16

+0

@LegoStormtroopr每當我運行這樣的腳本:'headers = {'content-type':'application/json'} print requests.post(url,data = json.dumps(data),headers = headers) .text'它運行良好,但是當我編輯它來添加文件時,它給出了一個500錯誤:「error_message」:「指定'multipart/form-data'的格式沒有可用的反序列化方法。請檢查你的''formats' ''和''content_types''在你的串行器上。「 – aggolb 2015-02-06 08:41:23

回答

0

Tastypie好好嘗試一下有什麼好的辦法來挽救二進制文件。我會嘗試這樣的:

class ArticleResource(ModelResource): 

    class Meta: 
     queryset = Article.objects.all() 
     resource_name = 'article' 
     filtering = {'title': ALL} 
     authorization=Authorization()  

    # save the photo 
     def deserialize(self, request, data, format=None): 
      if not format: 
       format = request.META.get('CONTENT_TYPE', 'application/json') 

      if format.startswith('multipart'): 
       data = request.POST.copy() 
       photo = Article() 
       photo.thumbnail = request.FILES['thumbnail'] 
       photo.title = request.POST.get('title') 
       # ... etc 
       return data 
      return super(ArticleResource, self).deserialize(request, data, format) 

     # overriding the save method to prevent the object getting saved twice 
     def obj_create(self, bundle, request=None, **kwargs): 
      pass 
+0

每當我使用'print requests.post(url,data = data,files = files,headers = headers).text'時,仍然無法正常工作,我收到一條消息,指出「error_message」:「'utf8'編解碼器無法解碼在位置409字節0x89:無效起始字節。您傳入'--da8f68c94da44747ae6980923316c7ec \\ r \\ nContent-Disposition:form-data',但是當我使用'requests.post(url,data = data,files = files)時。文本'我得到'{「error_message」:「格式'multipart/form-data'沒有可用的反序列化方法。請檢查你的''格式''和''content_types' – aggolb 2015-02-06 08:40:30

+0

你爲什麼要這樣做?我不明白。 – 2015-02-06 09:06:05

+0

它實際上經過一些小的編輯,如將反序列化函數放在它們自己的類中。謝謝! – aggolb 2015-02-06 18:43:30