2013-05-11 106 views
0

我需要將所有數據從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二進制文件的文本,但不是..

+0

解決: 成立溶液上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

回答

2

您也可以只使用requests.post(url, data=[('name', 'test'), ('language', 'eng'), ('type', 'stream')], files={'chaos_handdrums.wav': <file-like-object>})和請求將爲您做多部分轉換。

相關問題