Django存储亚马逊S3给出了400个不良请求异常

时间:2017-01-23 13:41:44

标签: django python-2.7 amazon-s3 boto django-1.8

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

Birmingham - 1900
Blackburn - 16400
London - 77666
Luton- 8000
Manchester-13200
Newcastle-15600

我的模特:

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}))

这是我在AWS上的CORS配置:

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})

以下是我得到的例外情况: enter image description here

我可以知道到底出了什么问题吗?

所有这些django存储库都没有文档。我经历了很多不同的文章来解决这个问题。 你需要这个设置:

<?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>

AWS_S3_HOST = 's3.ca-central-1.amazonaws.com' 配置内容:

~/.boto

2 个答案:

答案 0 :(得分:3)

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

因此,两个选项似乎是:

  1. 切换区域(如评论中所述,我昨天遇到了这个问题,新安装了boto,并从伦敦切换了 - &gt;都柏林,修正后没有进一步更改
  2. 添加一个文件〜/ .boto,并根据该帖子的Martin's评论输入以下内容:

    [s3]

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

  3. 替换您的适当地区。您可以touch ~/.boto创建文件并从那里进行编辑,或者只需执行nano ~/.boto并保存即可。

答案 1 :(得分:1)

实际上,对我有用的是在不同的地区创建一个新的桶。似乎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文件