Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python请求:不带编码的URL_Python_Amazon S3_Python Requests_Pre Signed Url - Fatal编程技术网

python请求:不带编码的URL

python请求:不带编码的URL,python,amazon-s3,python-requests,pre-signed-url,Python,Amazon S3,Python Requests,Pre Signed Url,我知道请求库在内部编码URL类似于urllib.parse.quote()。早些时候,这在请求中使用config={'encode_uri':False}进行配置,但此配置已停止 我需要把一个AWS S3预签名的URL,其中包含一个签名。当我将requests.put()用于接收到的URL时,我得到了带有SignatureDesNotMatch的403响应 提供给requests.put()的URL的签名部分是 Bf%2BBufRIxITziSJGuAq9cYFbxBM%3D 服务器将其视为:

我知道请求库在内部编码URL类似于urllib.parse.quote()。早些时候,这在请求中使用config={'encode_uri':False}进行配置,但此配置已停止

我需要把一个AWS S3预签名的URL,其中包含一个签名。当我将requests.put()用于接收到的URL时,我得到了带有SignatureDesNotMatch的403响应

提供给requests.put()的URL的签名部分是

Bf%2BBufRIxITziSJGuAq9cYFbxBM%3D

服务器将其视为:

Bf+BufRIxITziSJGuAq9cYFbxBM=


这是否与对URL进行编码的请求库以及可能如上所述转换签名部分有关?如果是这样,是否有任何方法阻止它并让它使用传递的URL?

覆盖编码函数

import requests, urllib

class NoQuotedCommasSession(requests.Session):
    def send(self, *a, **kw):
        # a[0] is prepared request
        a[0].url = a[0].url.replace(urllib.quote(","), ",")
        return requests.Session.send(self, *a, **kw)

s = NoQuotedCommasSession()
s.get("http://somesite.com/an,url,with,commas,that,won't,be,encoded.")

我们可能应该后退一点,了解你到底想做什么。S3API仅支持使用预签名URL的
GET
HEAD
PUT
DELETE
请求。。。不
POST
。我想不出有什么例外,但我可能弄错了
POST
(基于浏览器的对象上载)请求使用web表单传递策略、签名和其他值,而不是预先签名的URL。此外,您的签名看起来是正确的,并且没有明显的理由希望避免这种情况。在SigV2签名中,
+
/
=
被正确地转义为
%2B
%2F
%3E
。你说得对,Michael,它本不应该发布,我已经更新了。关于签名,AWS似乎不需要转义字符hanks,在我的例子中,我必须使用[0].url.replace(urllib.parse.unquote(“%2B”),“%2B”)