2017-04-20 9 views
2

静的ファイルとメディアファイルをホストするAmazon s3を使用して、HerokuでDjangoアプリケーションの設定を取得しました。私はこのガイドhttps://www.caktusgroup.com/blog/2014/11/10/Using-Amazon-S3-to-store-your-Django-sites-static-and-media-files/に従っており、何千もの他のリソースのように見えますが、collectstaticは動作しており、herokuはそれを展開していますが、400エラーが表示されます。私が試してみて、それをローカルに実行すると、私はより多くの情報を得る:Amazon S3から静的ファイルを呼び出す疑わしい操作

Attempted access to '/css/reset.css' denied. 

はこれがハイライト表示されますラインです:

<link rel="stylesheet" type="text/css" href="{% static '/css/reset.css' %}"> 

私は私からそれをつかむ場合、私は静的ファイルはURLから直接読み込むことができますs3の管理パネルだから私はバケツのポリシーの問題ではないと思ったので、私はhttps/httpオプションを使いこなしましたが、喜びはありませんでした。だから私は間違ったパスが何とかコード内で呼び出されている必要があります - 私はちょうどどこに見えないことがわかった!

私は約4時間まっすぐまっすぐに思ったことはありません。

トレースバック:

File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/storages/backends/s3boto.py" in _normalize_name 
    358.    return safe_join(self.location, name) 

File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/storages/backends/s3boto.py" in safe_join 
    59.   raise ValueError('the joined path is located outside of the base path' 

During handling of the above exception (the joined path is located outside of the base path component), another exception occurred: 

File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner 
    41.    response = get_response(request) 

File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "/home/devtop/webdev/projects/intro/intro/profiles/views.py" in index 
    14.  return render(request, 'home.html', {'welcome':welcome}) 

File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/shortcuts.py" in render 
    30.  content = loader.render_to_string(template_name, context, request, using=using) 

File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/template/loader.py" in render_to_string 
    68.  return template.render(context, request) 

File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/template/backends/django.py" in render 
    66.    return self.template.render(context) 

File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/template/base.py" in render 
    207.      return self._render(context) 

File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/template/base.py" in _render 
    199.   return self.nodelist.render(context) 

File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/template/base.py" in render 
    990.     bit = node.render_annotated(context) 

File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/template/base.py" in render_annotated 
    957.    return self.render(context) 

File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/template/loader_tags.py" in render 
    177.    return compiled_parent._render(context) 

File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/template/base.py" in _render 
    199.   return self.nodelist.render(context) 

File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/template/base.py" in render 
    990.     bit = node.render_annotated(context) 

File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/template/base.py" in render_annotated 
    957.    return self.render(context) 

File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/templatetags/static.py" in render 
    105.   url = self.url(context) 

File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/templatetags/static.py" in url 
    102.   return self.handle_simple(path) 

File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/templatetags/static.py" in handle_simple 
    117.    return staticfiles_storage.url(path) 

File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/storages/backends/s3boto.py" in url 
    487.   name = self._normalize_name(self._clean_name(name)) 

File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/storages/backends/s3boto.py" in _normalize_name 
    361.          name) 

Exception Type: SuspiciousOperation at/
Exception Value: Attempted access to '/css/reset.css' denied. 

settings.py

AWS_ACCESS_KEY_ID=os.environ.get('AWS_ACCESS_KEY_ID',None) 
AWS_SECRET_KEY=os.environ.get('AWS_SECRET_KEY',None) 
AWS_SECRET_ACCESS_KEY=os.environ.get('AWS_SECRET_KEY', None) 
AWS_STORAGE_BUCKET_NAME = 'intro-story' 
AWS_S3_HOST='s3.us-east-2.amazonaws.com' 
AWS_S3_CUSTOM_DOMAIN = 's3.us-east-2.amazonaws.com/%s' % AWS_STORAGE_BUCKET_NAME 

AWS_S3_SECURE_URLS = False 

STATICFILES_LOCATION = 'static' 
STATICFILES_STORAGE = 'custom_storages.StaticStorage' 
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION) 

MEDIAFILES_LOCATION = 'media' 
MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION) 
DEFAULT_FILE_STORAGE = 'custom_storages.MediaStorage' 


try: 
    from .local_settings import * 
except ImportError: 
    pass 

local_settings.py

AWS_ACCESS_KEY_ID = "xxx" 
AWS_SECRET_ACCESS_KEY = "yyy" 

custom_storages.py

from django.conf import settings 
from storages.backends.s3boto import S3BotoStorage 

class StaticStorage(S3BotoStorage): 
    location = settings.STATICFILES_LOCATION 

class MediaStorage(S3BotoStorage): 
    location = settings.MEDIAFILES_LOCATION 

EDIT:


私はそれはsettings.pyでさまざまな値をいじりで働いて得ることができたが、それでも右ではありません。

from django.conf import settings 
from storages.backends.s3boto import S3BotoStorage 

class StaticStorage(S3BotoStorage): 
    location = settings.STATICFILES_LOCATION 

class MediaStorage(S3BotoStorage): 
    location = settings.MEDIAFILES_LOCATION 

を今、私は

STATICFILES_STORAGE = 'custom_storages.StaticStorage' 
をコメントアウトした場合:ここで

は、静的およびメディアのパスに関連するすべてのもの。ここ

STATICFILES_LOCATION = 'static' 
MEDIAFILES_LOCATION = 'media' 

import custom_storages 

STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION) 
STATICFILES_STORAGE = 'custom_storages.StaticStorage' 

MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION) 
DEFAULT_FILE_STORAGE = 'custom_storages.MediaStorage' 

は私が輸入だcustom_storageです

S3から静的ファイルを読み込み、すべて正常ですが、collectstaticは失敗します。その行のコメントを外すと、collectstaticは動作しますが、サイトをロードしようとするとエラーが発生します。

# Ensure final_path starts with base_path and that the next character after 
    # the final path is '/' (or nothing, in which case final_path must be 
    # equal to base_path). 
    base_path_len = len(base_path) 
    if (not final_path.startswith(base_path) or 
      final_path[base_path_len:base_path_len + 1] not in ('', '/')): 
     raise ValueError('the joined path is located outside of the base path' ... 
         ' component') 
    return final_path.lstrip('/') 

だから、はっきりと何かがそのcustom_storage部をアップしているが、私は考え何を持っていません:エラーがある/

+0

'reset.css'の' href'を右クリックして調べると、あなたは何を得ますか?別のブラウザを開いてそのURLを貼り付けると、それを見ることができますか? –

+0

また、S3パネルの内部にある場合、そのファイルのアクセス権をクリックすると、何が得られますか?あなたは 'Group'の下に' everyone'の値を持ち、 'Object access'の下に' Read'の値を持っていますか? –

+0

私は本当にhrefリンクを見ることができません - 私が試してみると、私は400エラー(Heroku)かDjangoのデバッグ画面を得て、上記の情報のほとんどが解消されました。 「Everyone」の権限は読み取りに設定されているため、「Any AWS認証済みユーザー」となり、IAMを使用して作成した1人のユーザーは読み取り/書き込みに設定されます。 また、S3 Adminからこのreset.cssファイルへの完全なURLを取得して({%static%}タグを使用する代わりに)パスをハードコードすると、動作して次のファイルに問題が見つかるだけでHTMLのスタイルシート。 – DrakeRamoray

答えて

3

ソートを!予想通り、それは面倒くさい単純なものでしたが、おそらくこれは同じ壁に当たる誰かを助けるでしょう。

この:

<link rel="stylesheet" type="text/css" href="{% static 'css/reset.css' %}"> 

すなわち:このする必要が

<link rel="stylesheet" type="text/css" href="{% static '/css/reset.css' %}"> 

hrefに先行するスラッシュはありません。ローカルの静的ファイルストレージを使用して正常に動作しましたが、S3リンクを壊しました。

関連する問題