Недавно я перенес свое приложение из python2 / pylons в python3 / pyramid.
В моем приложении plyons я использовал приведенный ниже код для отправки POST-запроса на сторонний php-сайт (также поддерживается мной).
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')
}
Любая помощь приветствуется
Я не уверен насчет вашего кода PHP, но ниже приведен правильный способ размещения файлов & данные на удаленный URL с Python 3 и запросы:
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)
Других решений пока нет …