我有一个带文件上载的Django表单。在视图中,我想将此文件传递给另一个带有urllib post请求的服务器。
我试图把这个文件放在像这样的普通post变量中。
第一台服务器上的views.py:
def loadfile(request):
server_url = "foo"
class UploadFileForm(forms.Form):
filename = forms.FileField()
context['fileform'] = UploadFileForm()
#after button is pressed
if request.method == 'POST':
upload_file(context, server_url, request.FILES['filename'])
return render_to_response("bar")
def upload_file(context, server_url, image_data):
#create a temp file to store image on sever
temp = tempfile.NamedTemporaryFile()
for chunk in image_data.chunks():
temp.write(chunk)
temp.flush()
#build filename
origfilename = str(image_data)
extention = origfilename[origfilename.rfind("."):]
filename = uuid.uuid4().hex + extention
#encode image so it can be send
with open(temp.name, "rb") as f:
data = f.read()
encoded_string = base64.urlsafe_b64encode(data)
url = "http://" + server_url + "/uploadimage?filename=" + filename
urllib2.urlopen(url, "img_data="+encoded_string)
temp.close()
如果下游服务器也是django测试服务器,这是有效的,但是使用nginx / uwsgi,我遇到了#34;坏网关"错误。我认为这是因为uwsgi的缓冲区大小很小。 因此,解决方案是进行适当的多部分发布请求。
问题是:如何在给定django fileupload请求的情况下轻松创建多部分urllib请求?
答案 0 :(得分:6)
使用requests库:
url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)