0

Django のフォームから他のアプリケーションに (REST API を介して) すべてのデータを送信する必要があります。問題は InMemoryUploadedFile の転送にあります(これはリクエストからキャッチしています)。新しいリクエストの作成に大きな問題があります: ファイルの内容は常に空です (アップロードされたファイルは空です)。独自の request.body ビルダー メソッド (encode_multipart_formdata) cus リクエストを作成する必要がありましたが、理由がわかりません。これを適切に行うことができません。私が呼び出すとき、この関数の中で: tmpfile.read() 私は空の文字列を取得しましたが、ex. addContent() ですべて問題ありません..

ビュー.py

def addContent(request):
if request.method == 'POST':  # If the form has been submitted...
    form = ContentForm(request.POST, request.FILES)
    if form.is_valid(): 
        data = restApiController.addContent(request.POST, request.FILES)
        return HttpResponseRedirect('/content')  # Redirect after POST
else:
    form = ContentForm  # An unbound form
return render(request, 'content/addNew.html', {'form': form, })

restApiController.py

import requests
from io import BytesIO

def addContent(requestPOST, requestFILE):
   content_type, body = encode_multipart_formdata(requestPOST, requestFILE)
   h = {'Content-Type': content_type}
   r = requests.post(settings.CONTENTS_URL, auth=('user', 'pass'), headers=h, data=body)

def encode_multipart_formdata(fields, files):
   boundary = 'ARCFormBoundaryovmtr0efdw019k9'
   CRLF = '\r\n'
   L = []
 for (key, value) in fields.iteritems():
    L.append('--' + boundary)
    L.append('Content-Disposition: form-data; name="%s"' % key)
    L.append('')
    L.append(value)
 for (key, value) in files.iteritems():
    L.append('--' + boundary)
    L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % ('contentFile', files['contentFile']._name))
    L.append('Content-Type: %s' % get_content_type(files['contentFile']._name))
    L.append('')
    L.append(files['contentFile'].read())
   L.append('--' + boundary + '--')
   L.append('')
   #body = CRLF.join(L) INSTEAD DO THIS:
   s = BytesIO()
   for element in L:
     s.write(str(element))
     s.write(CRLF)
   body = s.getvalue()
content_type = 'multipart/form-data; boundary=%s' % boundary
return content_type, body

本文内容:

-----------------------------11286521771531197711838573892 
Content-Disposition: form-data; name="name" 
test 
-----------------------------11286521771531197711838573892 
Content-Disposition: form-data; name="language" 
eng 
-----------------------------11286521771531197711838573892 
Content-Disposition: form-data; name="contentFile"; filename="chaos_handdrums.wav" 
Content-Type: audio/x-wav
-----------------------------11286521771531197711838573892 
Content-Disposition: form-data; name="type" 
stream 
-----------------------------11286521771531197711838573892--

in body コンテキストは、バイナリ ファイルのコンテキストでもある必要がありますが、そうではありません。

4

1 に答える 1

2

使用することもできrequests.post(url, data=[('name', 'test'), ('language', 'eng'), ('type', 'stream')], files={'chaos_handdrums.wav': <file-like-object>})、リクエストはマルチパート変換を行います。

于 2013-05-11T15:58:32.190 に答える