Django 存储 amazon S3 给出 400 错误请求异常

Django storages amazon S3 giving 400 bad request exception

这是我第一次尝试使用 AWS S3 进行媒体存储。该应用程序托管在 Heroku 中,对于静态文件来说这不是问题,所以我不想更改静态文件,但希望应用程序用户上传我希望存储在 S3 中的文件和图像。到目前为止,我已经花了 2-3 天,但没有找到合适的解决方案,因为我在没有正当理由的情况下得到 400 异常。 这是我提到的文档: http://tech.marksblogg.com/file-uploads-amazon-s3-django.html 所以,我现在的设置:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

AWS_S3_ACCESS_KEY_ID='dummyid'
AWS_S3_SECRET_ACCESS_KEY='dummykey'
AWS_STORAGE_BUCKET_NAME='dummyname'
AWS_QUERYSTRING_AUTH = False
AWS_HEADERS = {'Cache-Control': 'max-age=86400', }
MEDIAFILES_LOCATION = 'media'
MEDIA_URL = 'http://%s.s3.amazonaws.com/media/' % AWS_STORAGE_BUCKET_NAME

我的模型:

class DummyDocuments(models.Model): document = models.FileField(upload_to='documents')

我的表格:

class DummyUploadForm(forms.Form): documents = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}))

这是视图,我正在使用它:

def upload(request):
    if request.method == 'POST':
        form = DummyUploadForm(request.POST, request.FILES)
        if form.is_valid():
            files = request.FILES.getlist('documents')
            for file in files:
                instance = DummyDocuments(document=file)
                instance.save()
            return redirect('activation_upload')
    else:
        form = DummyUploadForm()

    documents = DummyDocuments.objects.all()

    return render(request, 'activation/dummyupload.html', {'form': form, 'documents': documents})

这是我在 AWS 上的 CORS 配置:

<?xml version="1.0" encoding="UTF-8"?> <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <CORSRule> <AllowedOrigin>*</AllowedOrigin> <AllowedMethod>GET</AllowedMethod> <AllowedMethod>POST</AllowedMethod> <AllowedMethod>PUT</AllowedMethod> <AllowedHeader>*</AllowedHeader> </CORSRule> </CORSConfiguration>

这是我得到的异常:

我可以知道到底哪里出了问题吗?


解决方案


所有这些 django 存储库都没有记录。我浏览了很多不同的文章来弄清楚这一点。 您需要此设置:

AWS_S3_HOST = 's3.ca-central-1.amazonaws.com'

并且,~/.boto 配置内容:

[Credentials]
aws_access_key_id=yourid
aws_secret_access_key=yourkey

[s3]

host=s3.ca-central-1.amazonaws.com

我认为这是由 this issue 引起的(假设所有凭据和其他设置都正确,但它抛出 400 错误而不是 403)。

结果,两个选项好像是:

  1. 切换区域(如评论中所述,我昨天在安装新的 boto 时遇到了这个问题,然后从伦敦切换到都柏林,在没有进一步更改的情况下纠正了它 )
  2. 添加文件 ~/.boto 并根据该线程上的 Martin's 评论放入以下内容。:

    [s3]

    host=s3.eu-central-1.amazonaws.com

替换为您的适当区域。您可以通过 touch ~/.boto 创建文件并从那里编辑它,或者简单地执行 nano ~/.boto 并保存它。

实际上,对我有用的是在不同的区域创建一个新的存储桶。似乎 boto 包在连接到特定区域的 s3 存储桶时存在问题。我的 settings.py 文件

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = 'your-access-key'
AWS_SECRET_ACCESS_KEY = 'your-secret-access-key'
AWS_STORAGE_BUCKET_NAME = 'mybucketname'

当主机区域为 s3-website-us-west-2.amazonaws.com

时不需要 boto 文件