4

この質問は、静的コンテンツを提供するためにHeroku、django-storages(s3の場合はboto付き)、およびCloudFrontを使用するセットアップに関係します。

過去数時間、静的ファイルをHerokuアプリに正常にロードしようとしています。Cloudfrontをs3バケットに正常に接続し、バケットが適切に設定されているように見えますが、何らかの理由で、の値がAWS_STORAGE_BUCKET_NAME適切に登録されていないようです。

誰かがこれをデバッグする方法について何か手がかりやアイデアを持っているなら、私は大いに義務づけられるでしょう。私は私の機知に富んでいます。読んでくれてありがとう。

settings.py(重要なもの):

try:
  from settings_local import *
except:
  import s3utils
DEBUG = False
#s3 stuff
DEFAULT_FILE_STORAGE = 's3utils.MediaRootS3BotoStorage'
STATICFILES_STORAGE = 's3utils.StaticRootS3BotoStorage'  
STATIC_URL = 'https://[domain].cloudfront.net/'
#use heroku postgres database
import dj_database_url
DATABASES['default'] =  dj_database_url.config()

s3utils.py

from storages.backends.s3boto import S3BotoStorage
from django.utils.functional import SimpleLazyObject
import os

AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
AWS_STORAGE_BUCKET_NAME = 'static.[website].org'

StaticRootS3BotoStorage = lambda: S3BotoStorage(location='static')
MediaRootS3BotoStorage  = lambda: S3BotoStorage(location='media')

これは、「herokurun」またはProcfileのいずれかを介して収集しようとしたときに取得するトレースバックです。

  Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/app/.heroku/python/lib/python2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
    utility.execute()
  File "/app/.heroku/python/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/app/.heroku/python/lib/python2.7/site-packages/django/core/management/base.py", line 196, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/app/.heroku/python/lib/python2.7/site-packages/django/core/management/base.py", line 232, in execute
    output = self.handle(*args, **options)
  File "/app/.heroku/python/lib/python2.7/site-packages/django/core/management/base.py", line 371, in handle
    return self.handle_noargs(**options)
  File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 163, in handle_noargs
    collected = self.collect()
  File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 113, in collect
    handler(path, prefixed_path, storage)
  File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 287, in copy_file
    if not self.delete_file(path, prefixed_path, source_storage):
  File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 215, in delete_file
    if self.storage.exists(prefixed_path):
  File "/app/.heroku/python/lib/python2.7/site-packages/storages/backends/s3boto.py", line 284, in exists
    return k.exists()
  File "/app/.heroku/python/lib/python2.7/site-packages/boto/s3/key.py", line 399, in exists
    return bool(self.bucket.lookup(self.name))
  File "/app/.heroku/python/lib/python2.7/site-packages/boto/s3/bucket.py", line 148, in lookup
    return self.get_key(key_name, headers=headers)
  File "/app/.heroku/python/lib/python2.7/site-packages/boto/s3/bucket.py", line 181, in get_key
    query_args=query_args)
  File "/app/.heroku/python/lib/python2.7/site-packages/boto/s3/connection.py", line 458, in make_request
    auth_path = self.calling_format.build_auth_path(bucket, key)
  File "/app/.heroku/python/lib/python2.7/site-packages/boto/s3/connection.py", line 92, in build_auth_path
    path = '/' + bucket
TypeError: cannot concatenate 'str' and 'NoneType' objects

ドメイン名などを省略していることに注意してください。実際には、コードに[domain]や[website]は含まれていません。

4

1 に答える 1

14

あなたが言っているのではないfrom s3utils import *のでAWS_STORAGE_BUCKET_NAME、設定モジュールにインポートされることはありません。

S3BotoStorage環境変数からプルAWS_ACCESS_KEY_IDおよびプルしますが、で設定する必要があります。これは奇妙な矛盾のように見えますが、これは実際にはパラメータであり、そうではないためだと思います(env変数からクレデンシャルを取得します)。*AWS_SECRET_ACCESS_KEYAWS_STORAGE_BUCKET_NAMEsettings.pyAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYbotoAWS_STORAGE_BUCKET_NAMEboto

s3utilsへの他の参照は明示的です:

DEFAULT_FILE_STORAGE = 's3utils.MediaRootS3BotoStorage'
STATICFILES_STORAGE = 's3utils.StaticRootS3BotoStorage'

したがって、処理されない唯一の設定はAWS_STORAGE_BUCKET_NAMEであり、それがエラーの原因になります。

*django-storagesがenvvars(12-Factor App、誰か?)から他の設定を受け入れることを望み、問題を開く/その効果にプルリクエストを送信することを検討しています。

于 2013-04-10T21:24:27.920 に答える