Skip to main content
 首页 » 编程设计

python之Boto3 在本地和使用 django 应用程序在弹性 beantalk 上生成不同的链接

2024年11月24日32lyhabc

我现在有点困惑: 我有一个 Django 应用程序,它将文件上传到 s3 并在管理面板中生成下载链接,以在上传后检索文件。 我使用 boto3 来签署上传和下载链接。它在本地一切正常,但是一旦我将它部署到 elastic beanstalk,下载链接就不再有效,而且它似乎生成了带有旧歌唱版本的链接。上传仍然有效。

我正在生成这样的链接:

 def downloadUrl(self): 
    s3Client = boto3.client('s3') 
    bucketName = getattr(settings, "AWS_STORAGE_BUCKET_NAME", None) 
    fileurl = s3Client.generate_presigned_url('get_object', Params={'Bucket': bucketName, 'Key': self.url.split(bucketName + '/')[1]}, 
                                    ExpiresIn=100) 
    return format_html("<a href='{url}'>{url}</a>", url=fileurl) 

有趣的是它在本地工作并且生成的链接不同:

本地链接:

https://bucketname.s3.amazonaws.com/uploads/something/zips/2019/03/28/App%20Beschreibung.pdf.zip?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAJNND443OXASGOY2Q%2F201330328%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20190328T101414Z&X-Amz-Expires=100&X-Amz-SignedHeaders=host&X-Amz-Signature=4fe4d31dc1fd1f772217656654025b669513597c3f91f857fb722ff63a6c0194 

Elastic Beanstalk 部署生成的链接:

https://bucketname.s3.amazonaws.com/uploads/something/zips/2019/03/28/App%20Beschreibung.pdf.zip?AWSAccessKeyId=ASIA2K3XQKDHVDBX3GWN&Signature=w%2FWRh6tf%2Ba7k91Odop3ly9gEJDw%3D&x-amz-security-token=AgoJb3JpZ2luX2VjEHIaDGV1LWNlbnRyYWwtMSJIMEYCIQD7hU0fX24bksIM3vlQxZjYeje2sDm%2FQeeFQqUt7MwDpQIhAIozM1i1%2FmGK2Xo0RXmR7UWAB2FRPdkQy3aBOisS3BzuKuADCCsQABoMNzEwNTMwODQ2OTI3IgxfJIvFGgD5WL6TwccqvQO1Bsri%2FTmpvaARkFA%2BOnhLRUv9FFfdFf6H8W4IY38OI6CWzvct%2BgmE14D06GHaCh65wKH%2BhR9ZT3V18sW9U4RM%2FpS64hESmC8SUerzpPv9RmuXgA8hQl%2BwRJaTFLGFRFrHdHFoeJAeLIKjK2B7lDjLzNALtvegnLrBYoBtT0Ga2a7CC7avWMevvQ0jAjuSMiEOS4FjXNwHInkb%2FCrX3EXk2Me9OaufICHGH0ZTN2WNAGtOPsY15YJyLf0WgDl7SxVLuAnA4nUzeMglsdaL9ZbUlsdleJtHTQefNqCXXsm4FIup%2Fe%2FNFkn9g7XDH9%2F9IXW%2FNZyBAtfrRoPmDwvv0KpeYPpRpkVKBa5TxQU1c6ei3AiHnIQZRdO5oEqW47qv9hM8%2Fw9U9VlDqyUy5BKbGnv7GTLCdh4%2FwcYEnlfgr8QdK%2BJzyQYdgpMYqw3hj%2FTDW8mJVI9AD3RpHnD0XwIL3BBH5fUgcNZm2vGLG5nOcav7u2YaeqdFiY95SkdL5C8CLv%2BRLYABXyAbeWPUtFzgTtdUFFlv5epAQO2cPOD%2BM3V%2BjhfTQa4WUSIRCwUpSQg3dahIvV75cbKdsdZ7bL1tRMIqz8uQFOrMBC7isGac1kJ0TqHMbiQ77QauekC9c1gy6wgnKu9enc2x4VvyhClhvTvmEFm5NW3CmU5LIXf9V4Df9ML7Mf3Nf2uhuAhQdTKoAIGPiVWz%2FB3Lh%2F58%2FLbRbIRNgWk6IDg88dzgevitkXSC0OokmpB3qbBj%2BGXjIHttHqdBKnjG22aud3wrMk6YxH8b0CfelmcN5vHykpMYgdfgNHvFKrea417ozh5CLfZ9PYQoug0iqsm9nqoU%3D&Expires=1553768535 

如您所见,签名有所不同,但我不明白为什么。我还检查了 EB 上是否运行了不同的版本,但它与本地版本相同,我下载了 zip 并在本地运行它,它工作正常。

请您参考如下方法:

我现在发现了问题所在: 我忘记为 boto 库的 S3 访问 key 和 key 设置环境变量没有有效的凭据来生成链接。但是,错误消息非常具有误导性。然后,我在 Elastic Beanstalk 控制台中设置了变量,它立即起作用了。