无法向文件发送POST请求到另一个php网站

时间:2018-08-03 05:43:57

标签: php request python-3.5 urllib2

最近我已经将应用程序从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')
                 } 

任何帮助表示赞赏

1 个答案:

答案 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)