500
在我部署到 Elastic Beanstalk 的应用程序中尝试通过 django-cms Filer 管理员上传文件时,我收到以下http 错误:
在浏览器控制台中,来自fileuploader.min.js:26
:
POST http://app-staging.us-east-1.elasticbeanstalk.com/admin/filer/clipboard/operations/upload/1/?qqfile=example.jpg 500 (Internal Server Error)
我正在使用django-cms
(因此easy-thumbnails
)django-storages
和boto3
. 部署时,collectstatic
我的.ebextensions
配置文件中的命令运行良好,文件都很好地存储在/staging/static/
.
删除DEFAULT_FILE_STORAGE
分配工作正常,但显然是站不住脚的,因为eb deploy
对 beanstalk 的任何更改都会导致一个新实例并删除以前的文件上传。
堆栈跟踪:
Internal Server Error: /admin/filer/clipboard/operations/upload/1/
Traceback (most recent call last):
File "/opt/python/run/venv/local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response
response = self._get_response(request)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
return view_func(*args, **kwargs)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/filer/admin/clipboardadmin.py", line 114, in ajax_upload
file_obj.save()
File "/opt/python/run/venv/local/lib/python3.6/site-packages/filer/models/imagemodels.py", line 53, in save
super(Image, self).save(*args, **kwargs)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/filer/models/abstract.py", line 74, in save
super(BaseImage, self).save(*args, **kwargs)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/filer/models/filemodels.py", line 194, in save
super(File, self).save(*args, **kwargs)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/polymorphic/models.py", line 74, in save
return super(PolymorphicModel, self).save(*args, **kwargs)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/django/db/models/base.py", line 806, in save
force_update=force_update, update_fields=update_fields)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/django/db/models/base.py", line 835, in save_base
self._save_parents(cls, using, update_fields)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/django/db/models/base.py", line 862, in _save_parents
self._save_table(cls=parent, using=using, update_fields=update_fields)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/django/db/models/base.py", line 922, in _save_table
result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/django/db/models/base.py", line 961, in _do_insert
using=using, raw=raw)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/django/db/models/query.py", line 1060, in _insert
return query.get_compiler(using=using).execute_sql(return_id)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1098, in execute_sql
for sql, params in self.as_sql():
File "/opt/python/run/venv/local/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1051, in as_sql
for obj in self.query.objs
File "/opt/python/run/venv/local/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1051, in <listcomp>
for obj in self.query.objs
File "/opt/python/run/venv/local/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1050, in <listcomp>
[self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "/opt/python/run/venv/local/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1000, in pre_save_val
return field.pre_save(obj, add=True)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/django/db/models/fields/files.py", line 297, in pre_save
file.save(file.name, file.file, save=False)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/filer/fields/multistorage_file.py", line 122, in save
super(MultiStorageFieldFile, self).save(name, content, save)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/easy_thumbnails/files.py", line 670, in save
super(ThumbnailerFieldFile, self).save(name, content, *args, **kwargs)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/django/db/models/fields/files.py", line 95, in save
self.name = self.storage.save(name, content, max_length=self.field.max_length)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/django/core/files/storage.py", line 54, in save
return self._save(name, content)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/storages/backends/s3boto3.py", line 452, in _save
self._save_content(obj, content, parameters=parameters)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/storages/backends/s3boto3.py", line 467, in _save_content
obj.upload_fileobj(content, ExtraArgs=put_parameters)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/boto3/s3/inject.py", line 513, in object_upload_fileobj
ExtraArgs=ExtraArgs, Callback=Callback, Config=Config)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/boto3/s3/inject.py", line 431, in upload_fileobj
return future.result()
File "/opt/python/run/venv/local/lib/python3.6/site-packages/s3transfer/futures.py", line 73, in result
return self._coordinator.result()
File "/opt/python/run/venv/local/lib/python3.6/site-packages/s3transfer/futures.py", line 233, in result
raise self._exception
File "/opt/python/run/venv/local/lib/python3.6/site-packages/s3transfer/tasks.py", line 126, in __call__
return self._execute_main(kwargs)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/s3transfer/tasks.py", line 150, in _execute_main
return_value = self._main(**kwargs)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/s3transfer/upload.py", line 685, in _main
client.put_object(Bucket=bucket, Key=key, Body=body, **extra_args)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/botocore/client.py", line 317, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/botocore/client.py", line 589, in _make_api_call
api_params, operation_model, context=request_context)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/botocore/client.py", line 624, in _convert_to_request_dict
api_params, operation_model)
File "/opt/python/run/venv/local/lib/python3.6/site-packages/botocore/validate.py", line 291, in serialize_to_request
raise ParamValidationError(report=report.generate_report())
botocore.exceptions.ParamValidationError: Parameter validation failed:
Invalid type for parameter ContentType, value: None, type: <class 'NoneType'>, valid types: <class 'str'>
设置.py
STATIC_ROOT = os.path.join(BASE_DIR, '..', 'www', 'static')
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static', 'eatingveg'),
)
MEDIA_ROOT = os.path.join(BASE_DIR, '..', 'www', 'media')
# AWS S3 Settings
AWS_STORAGE_BUCKET_NAME = os.environ.get('EV_S3_BUCKET_NAME')
AWS_S3_REGION_NAME = os.environ.get('EV_S3_REGION_NAME') # e.g. us-east-2
AWS_ACCESS_KEY_ID = os.environ.get('EV_AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('EV_AWS_SECRET')
AWS_QUERYSTRING_AUTH = False
AWS_IS_GZIPPED = True
# Tell django-storages the domain to use to refer to static files.
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
STATIC_URL = "https://%s/staging/" % AWS_S3_CUSTOM_DOMAIN
MEDIA_URL = "https://%s/staging/media/" % AWS_S3_CUSTOM_DOMAIN
# Tell the staticfiles app to use S3Boto3 (via our StaticStorage subclass)
# storage when writing the collected static files
# (when you run `collectstatic`).
STATICFILES_LOCATION = 'staging/static'
STATICFILES_STORAGE = 'custom_storages.StaticStorage'
MEDIAFILES_LOCATION = 'staging/media'
DEFAULT_FILE_STORAGE = 'custom_storages.MediaStorage'
custom_storages.py
# custom_storages.py
from django.conf import settings
from storages.backends.s3boto3 import S3Boto3Storage
class StaticStorage(S3Boto3Storage):
location = settings.STATICFILES_LOCATION
class MediaStorage(S3Boto3Storage):
location = settings.MEDIAFILES_LOCATION