我需要將所有數據從Django中的表單發送到其他應用程序(通過REST API)。 問題是與轉發InMemoryUploadedFile(我從要求捕捉它)。 構建新請求時遇到很大問題:文件的內容始終爲空(上傳的文件爲空)。 我不得不創建我自己的request.body構建器方法(encode_multipart_formdata)cus請求,我不知道爲什麼,不能正確地做到這一點。當我打電話時,在這個函數裏面:tmpfile.read() 我得到了空字符串,但是當我嘗試之前爲ex執行此操作時。在addContent()一切正常..如何將文件從請求轉發到Django中的其他應用程序?
views.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--
在身體方面應該也是c二進制文件的文本,但不是..
解決: 成立溶液上http://code.activestate.com/recipes/146306-http-client-to-post-using-multipartform-data/ 代替:主體= CRLF.join(L) 執行此操作:s = BytesIO()for L中的元素: s.write(str(element)) s.write(CRLF)body = s.getvalue() – wierzbiks 2013-05-11 13:37:56