我想知道我是否在python中规范化了一个URL.
例如,如果我有一个url字符串,如:" http://www.example.com/foo goo/bar.html"
我需要一个python中的库,它将额外的空间(或任何其他非规范化的字符)转换为正确的URL.
我正在使用Django,S3Boto并且只要签名中有'+'签名,我就会得到一个403 Forbidden.如果'+'签名中没有签名,我就可以获得资源.这可能有什么问题?
更新:
回购邮件位于:https://github.com/boto/boto
有关文件是:
boto/utils.py
boto/s3/connection.py
Run Code Online (Sandbox Code Playgroud)
注意: 我是Python的新手.我尝试修改代码,但仍然无法正确完成编码.
我正在尝试设置一个Django应用程序以允许CORS上传到Amazon S3存储桶 - 运气不错.我一直在Firefox和Chrome上获得403 Forbidden消息,无论是在localhost还是从Web服务器.我已经验证我的签名正确计算(如下所述),我的存储桶策略是允许origin*,允许PUT/POST/GET方法,并允许标题*.我的访问密钥/密钥对是正确的,允许我通过Cyberduck等软件访问存储桶.我还能检查什么,或者我如何进一步调试?我觉得我已经探索了所有可能的途径
我正在尝试按照此演示,只需修改编码以匹配此SO问题.这允许我的签名与此Amazon S3测试文件匹配.我的签名生成代码在这里:
s3_bucket_name = settings.S3_BUCKET_NAME
s3_access_key = settings.S3_ACCESS_KEY
s3_secret_key = settings.S3_SECRET_KEY
object_name = request.GET.get('s3_object_name')
mime_type = request.GET.get('s3_object_type')
expires = int(time.time()+300)
amz_headers = "x-amz-acl:public-read"
put_request = "PUT\n\n%s\n%d\n%s\n/%s/%s" % (mime_type, expires, amz_headers, s3_bucket_name, object_name)
hashed = hmac.new(s3_secret_key, put_request, sha1)
signature = binascii.b2a_base64(hashed.digest())[:-1]
signature = urllib.quote_plus(signature.strip())
url = 'https://%s.s3.amazonaws.com/%s' % (s3_bucket_name, object_name)
signed_request = '%s?AWSAccessKeyId=%s&Expires=%d&Signature=%s' % (url, s3_access_key, expires, signature)
pdb.set_trace()
return HttpResponse(json.dumps({
'signed_request': signed_request,
'url': url
}), mimetype='application/json')
Run Code Online (Sandbox Code Playgroud)
我的上传功能:
function s3_upload(filename) …Run Code Online (Sandbox Code Playgroud)