通过POST发送文件,Django / python请求obj无法正确存储

时间:2014-01-04 23:57:52

标签: django rest http post django-file-upload

我正在使用一个简单的REST客户端进行测试。发送简单的JPEG,尝试以下内容类型: 内容类型:image / jpeg 内容类型:multipart / form-data

另请注意,csrftoken身份验证已关闭,以允许外部第三方REST连接。

(图像通过其他客户端附加) 根据上述参数设置已检查的wireshark和数据包。

Django - 请求对象有几个变量: request.body request.FILES

Django服务器收到POST后,请求对象始终将所有数据/有效负载存储到request.body中。不应该将图像或任何附加文件放入request.FILES?是否在内容类型或POST上设置了错误。

非常简单的代码。只是试图打印到日志中。 post中的所有对象都继续发送到request.body

def testPost(request):
     print request.body
     print request.FILES
     return HttpResponse()

Wireshark数据包:

Hypertext Transfer Protocol
POST /testPost/ HTTP/1.1\r\n
Host: MYURL.com:8000\r\n
Connection: keep-alive\r\n
Content-Length: 8318\r\n
Origin: chrome-extension://aejoelaoggembcahagimdiliamlcdmfm\r\n
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36\r\n
Content-Type: image/jpeg\r\n
Accept: */*\r\n
Accept-Encoding: gzip,deflate,sdch\r\n
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4\r\n
Cookie: ******; csrftoken=**********\r\n
\r\n
[Full request URI: http://MYURL.com:8000/testPost/]
[HTTP request 1/1]

JPEG文件交换格式

1 个答案:

答案 0 :(得分:0)

以下是我处理文件上传的方法:在这种情况下恰好是图像。我争吵了一段时间的问题之一就是request.FILES可以输入多个密钥而且我一直想要最后一个。

注意:request.FILES只包含以下数据:

  1. 请求是POST
  2. 请求的属性为'enctype =“multipart / form-data”'
  3. 有关详细信息,请参阅Django File-uploads文档。

    模型:首先有一个带有ImageField的模型:models.py

    photos_dir = settings.MEDIA_ROOT + "/photos" + "/%Y/%m/%d/"
    
    class Photo(models.Model):
       image    = models.ImageField(upload_to=photos_dir, null=True, blank=True, default=None)
       filename = models.CharField(max_length=60, blank=True, null=True)
    

    views.py中的视图处理帖子:

    from django.core.files.images import ImageFile
    
    def upload_image( request ):
    
       file_key=None
       for file_key in sorted(request.FILES):
          pass
    
       wrapped_file = ImageFile(request.FILES[file_key])
       filename = wrapped_file.name
    
       # new photo table-row 
       photo = Photo()
       photo.filename = filename
       photo.image = request.FILES[file_key]
    
       try:
          photo.save()
       except OSError:
          print "Deal with this situation"
    
       # do your stuff here.
       return HttpResponse("boo", "text/html");
    

    Standlone Poster:一些python代码可以刺激你的django视图。

    参考:我实际上使用了这个lib:poster.encode来“刺激数据”到我的django view.py

    from poster.streaminghttp import register_openers
    from poster.encode import multipart_encode
    import urllib2
    
    server = "http://localhost/"
    headers = {}
    
    # Register the streaming http handlers with urllib2
    register_openers()
    
    img="path/to/image/image.png"
    
    data = {'media' : open( img ),
            'additionalattr': 111,
    }
    datagen, headers = multipart_encode(data)
    
    headers['Connection']='keep-alive'
    request = urllib2.Request('%s/upload_image/' % ( server ), datagen, headers)
    
    print urllib2.urlopen(request).read()