5

Django REST Framework アプリでファイルを使用してデータを投稿しようとすると、非常に大きな問題が発生します。djangorestframework Web サイトの例を使用して、簡単なアプリケーションを作成しました。だから私はurlsファイルを持っています:

class MyImageResource(ModelResource):
    model = Image

そしてurlpattersで:

url(r'^image/$', ListOrCreateModelView.as_view(resource=MyImageResource)),
url(r'^image/(?P<pk>[^/]+)/$', InstanceModelView.as_view(resource=MyImageResource)),

Image モデルは単純です。

class Image(models.Model):
    image = models.ImageField(upload_to=get_file_path)
    name = models.CharField(max_length=256, blank=True)
    description = models.TextField(blank=True)

ブラウザで REST ページをテストすると、完璧に動作します。ファイル付きのデータを投稿することもできます。

私の問題は、データを投稿するための単純な python アプリケーションを作成したいということです。シンプルな urllib2 を使用しましたが、500 Internal Error または 400 Bad Request が発生します。

poza = open('poza.jpg', 'rb')


initial_data = (    
    {'name', 'Imagine de test REST'},
    {'description', 'Dude, this is awesome'},
    {'image', poza},
)

d = urllib.urlencode(initial_data)
r = urllib2.Request('http://localhost:8000/api/image/', data=d,
                headers={'Content-Type':'multipart/form-data'})
resp = urllib2.urlopen(r)
code = resp.getcode()
data = resp.read()

MultipartPostHandler でも試しました:

import MultipartPostHandler, urllib2, cookielib
cookies = cookielib.CookieJar()

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies),
                          MultipartPostHandler.MultipartPostHandler)

params = {
    "name":"bob",
    "description":"riviera",
    "content" : open("poza.jpg", "rb")
}

opener.open("http://localhost:8000/api/image/", params)

ただし、同じ: 500 または 400 エラーが発生し、サーバー (python manage.py runserver) が次のエラーで停止します。

Exception happened during processing of request from ('127.0.0.1', 64879)
Traceback (most recent call last):
  File "C:\Python27\lib\SocketServer.py", line 284, in _handle_request_noblock
    self.process_request(request, client_address)
  File "C:\Python27\lib\SocketServer.py", line 310, in process_request
    self.finish_request(request, client_address)
  File "C:\Python27\lib\SocketServer.py", line 323, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 570
, in __init__
    BaseHTTPRequestHandler.__init__(self, *args, **kwargs)
  File "C:\Python27\lib\SocketServer.py", line 641, in __init__
    self.finish()
  File "C:\Python27\lib\SocketServer.py", line 694, in finish
    self.wfile.flush()
  File "C:\Python27\lib\socket.py", line 303, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 10053] An established connection was aborted by the software in yo
ur host machine

誰かが持っている場合は、ファイルを使用してデータを投稿する例を教えてください。または、Python コードを投稿する際に何が問題なのか教えてください。これ以上の例は見つかりませんでした。

サーバーは問題ないようです。ブラウザでデータを POST できます。どうもありがとうございました。

4

1 に答える 1

1

ファイルを読み込んでいるようには見えず、代わりにファイルポインタを渡していますか?

試す:

initial_data = (    
    {'name', 'Imagine de test REST'},
    {'description', 'Dude, this is awesome'},
    {'image', poza.read()},
)
于 2013-04-10T15:31:36.847 に答える