2016-03-22 1 views
0

うまくいけば、誰かがこれを手伝ってくれることを願っています。見ていただきありがとうございます!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/' 
+0

どのようにあなたのアプリにs3ストレージを追加し、ヒロクがどのようにサポートしましたか? – niklas

+0

私は最初の質問にs3設定を追加しました。私はheroku設定を使用してすべての設定変数を設定しました: –

+0

最初に設定を制御し、私の見た目はかなり異なっています:[比較](https://gist.github.com/niklasp/2fff10d48839d15e6ba1) – niklas

答えて

0

私はこの行を変更することで、この作業を得た:

fh = storage.open(self.avatar.name, "w") 

をこの

fh = storage.open(self.avatar.name, "wb") 

this素晴らしく役に立つ答えを見つけた後。私はまだそれが英雄で働いていたが、ローカルではなかったのかまだ分かっていないが、 "wb"はバイナリでそれを開き、どちらの場合でもうまく働く。

関連する問題