最近我已经将应用程序从python2 / pylons迁移到python3 / pyramid。
在我的plyons应用程序中,我正在使用以下代码向第三方php网站(也由我维护)发出POST请求。
register_openers()
datagen, headers = multipart_encode({
"biosamples_metadata": open(file_bs_md, "rb"),
"metastore": open(file_ds_md, "rb"),
"annotation-submit": "Validate Annotation Files"
})
# Create the Request object
url = config['php_website_url']
request = urllib.request.Request(url, datagen, headers)
# Actually do the request, and get the response
return_text = urllib.request.urlopen(request).read()
return return_text
上面的代码工作得很好。但是在python3上,不支持发帖者,并且我无法使用register_openers()
,我什至不知道该怎么做。
在python3中,我正在使用请求模块。
import requests
from requests_toolbelt import MultipartEncoder
url = config['php_website_url']
m = MultipartEncoder(
fields={'biosamples_metadata': open(file_bs_md, 'rb'),
"metastore":open(file_ds_md, "rb"),
"annotation-submit": "Validate Annotation Files"
}
)
request = requests.post(url, data=m)
return_text = request.text
但是,此代码无法正常工作。它进入php应用程序,并在您收到请求时执行应该执行的部分代码。
这是php代码的样子
public function handle_request () {
$TEMPLATE = 'content_main';
// Process POST
if ($this->isPOST()) {
$this->_annotationFiles = array();
return $this->error_span('This is Get');
}
else ($this->isGET()) {
$this->_annotationFiles = array();
return $this->error_span('This is Post')
}
任何帮助表示赞赏
答案 0 :(得分:0)
我不确定您的PHP代码,但是以下是使用Python 3和请求将文件和数据发布到远程url的正确方法:
import requests
post_addr = "https://example.com/post_url"
data = {
'foo': 'bar',
'foo_a': 'bar_a':
}
files = {'file': open('report.xls', 'rb')}
r = requests.post(post_addr, data=data, files=files)