うまくいけば、誰かがこれを手伝ってくれることを願っています。見ていただきありがとうございます!herokuのDjangoとs3のメディアファイル。 devとprodを切り替えるためにモデル保存メソッドを編集しなければなりませんか?
私はかなり新しいジャンゴとプログラミングの一般的ですので、私に同行してください。私は、アバターImageFieldを持っているカスタムプロファイルアプリを構築しています。私は、画像のサイズを変更し、適切な向きにするために、すべてを開発中に設定しました。それをヒーローのプロダクションに押し込み、メディアにサービスを提供するためにaws s3をセットアップしなければなりませんでした。
Image.open(self.avatar.path)を使用している私のアバターの保存メソッドでエラーが発生しました。 作業を終了したソリューションはhereでした。しかし、モデルを保存する方法を変更したところ、ローカルにアップロードしようとすると次のエラーが表示されます。プロダクションと開発のための複数の保存メソッドを持つよりも優れたソリューションが必要です。しかし、私は両方の場合に対処する情報を見つけることができないようです。ありがとう!ここで
[22/Mar/2016 17:33:24] "GET /profiles/you/ HTTP/1.1" 200 6735
Internal Server Error: /profiles/you/
Traceback (most recent call last):
File "/home/vagrant/virtualenvs/venv_philabucks/lib/python3.4/site-packages/django/core/handlers/base.py", line 149, in get_response
response = self.process_exception_by_middleware(e, request)
File "/home/vagrant/virtualenvs/venv_philabucks/lib/python3.4/site-packages/django/core/handlers/base.py", line 147, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/vagrant/virtualenvs/venv_philabucks/lib/python3.4/site-packages/django/views/generic/base.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "/home/vagrant/virtualenvs/venv_philabucks/lib/python3.4/site-packages/django/views/generic/base.py", line 88, in dispatch
return handler(request, *args, **kwargs)
File "/vagrant/projects/philabucks/profiles/views.py", line 29, in post
form.save()
File "/vagrant/projects/philabucks/profiles/forms.py", line 30, in save
user.save()
File "/vagrant/projects/philabucks/profiles/models.py", line 108, in save
image.save(fh, format)
File "/home/vagrant/virtualenvs/venv_philabucks/lib/python3.4/site-packages/PIL/Image.py", line 1675, in save
save_handler(self, fp, filename)
File "/home/vagrant/virtualenvs/venv_philabucks/lib/python3.4/site-packages/PIL/PngImagePlugin.py", line 690, in _save
fp.write(_MAGIC)
TypeError: must be str, not bytes
[22/Mar/2016 17:33:45] "POST /profiles/you/ HTTP/1.1" 500 92102
は私のプロファイルモデルの関連部分
from django.db import models
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser
from PIL import Image, ExifTags
from PIL.ImageOps import fit
from django.core.files.storage import default_storage as storage
avatar = models.ImageField(upload_to='images/', null=True, blank=True)
def save(self, **kwargs):
super(Profile, self).save()
if self.avatar:
image = Image.open(storage.open(self.avatar.name))
try:
for orientation in ExifTags.TAGS.keys():
if ExifTags.TAGS[orientation]=='Orientation':
break
exif=dict(image._getexif().items())
if exif[orientation] == 3:
image=image.rotate(180, expand=True)
elif exif[orientation] == 6:
image=image.rotate(270, expand=True)
elif exif[orientation] == 8:
image=image.rotate(90, expand=True)
except (AttributeError, KeyError, IndexError):
# cases: image don't have getexif
pass
image = fit(image, (200, 200), Image.ANTIALIAS)
fh = storage.open(self.avatar.name, "w")
format = 'png' # You need to set the correct image format here
image.save(fh, format)
fh.close()
です。ここの設定/ production.py
INSTALLED_APPS += ['storages',]
AWS_QUERYSTRING_AUTH = False
AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
AWS_STORAGE_BUCKET_NAME = os.environ['S3_BUCKET_NAME']
MEDIA_URL = 'http://%s.s3.amazonaws.com/your-folder/' % AWS_STORAGE_BUCKET_NAME
DEFAULT_FILE_STORAGE = "storages.backends.s3boto.S3BotoStorage"
AWS_AUTO_CREATE_BUCKET = True
AWS_HEADERS = {
"Cache-Control": "public, max-age=86400",
}
AWS_S3_FILE_OVERWRITE = False
AWS_S3_SECURE_URLS = True
AWS_REDUCED_REDUNDANCY = False
AWS_IS_GZIPPED = False
からS3の設定があります。ここの設定/ local.pyからメディアストレージです:
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
どのようにあなたのアプリにs3ストレージを追加し、ヒロクがどのようにサポートしましたか? – niklas
私は最初の質問にs3設定を追加しました。私はheroku設定を使用してすべての設定変数を設定しました: –
最初に設定を制御し、私の見た目はかなり異なっています:[比較](https://gist.github.com/niklasp/2fff10d48839d15e6ba1) – niklas