collectstatic无法推送到S3文件

7

编辑:

我发现从我的settings.py文件中删除import django_heroku,就可以将静态文件推送到我的AWS存储桶中。当我取消注释import django_heroku后,collectstatic会将我的文件推送到staticfiles文件夹。

manage.py collectstatic#import django_heroku:

您要求在设置中指定的目标位置收集静态文件。

manage.py collectstaticimport django_heroku:

您要求在设置中指定的目标位置收集静态文件: /path/to/project/staticfiles

我不知道为什么会这样,也不知道如何解决这个问题。现在的问题是: 如何在Heroku上运行django应用程序的collectstatic? 或者我需要用nostatic运行我的heroku实例吗? (例如runserver --nostatic

问题:

每当我运行python manage.py collectstatic时,所有的静态文件都被放置在一个本地的“staticfiles”文件夹中。我设置了STATICFILES_STORAGE = myapp.aws.utils.StaticRootS3Boto3Storage,但是文件总是在“myapp/staticfiles”中。

Settings.py:

AWS_ACCESS_KEY_ID = config('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = config('AWS_SECRET_ACCESS_KEY')
AWS_FILE_EXPIRE = 200
AWS_PRELOAD_METADATA = True
AWS_QUERYSTRING_AUTH = True

DEFAULT_FILE_STORAGE = 'myapp.aws.utils.MediaRootS3Boto3Storage'
STATICFILES_STORAGE = 'myapp.aws.utils.StaticRootS3Boto3Storage'
AWS_STORAGE_BUCKET_NAME = config('AWS_STORAGE_BUCKET_NAME')
S3DIRECT_REGION='us-east-1'

AWS_S3_URL = '//s3.amazonaws.com/%s' % AWS_STORAGE_BUCKET_NAME

MEDIA_URL = 'http://s3.amazonaws.com/%s/media/' % AWS_STORAGE_BUCKET_NAME
MEDIA_ROOT = MEDIA_URL

STATIC_URL = AWS_S3_URL + '/static/'
STATICFILES_LOCATION = STATIC_URL
MEDIAFILES_LOCATION = 'media'
ADMIN_MEDIA_PREFIX = STATIC_URL + 'admin/'

AWS_HEADERS = {
    'Expires': 'Thu, 31 Dec 2099 20:00:00 GMT',
    'CacheControl': 'max-age=94608000',
}

myapp / aws / utils.py:

from storages.backends.s3boto3 import S3Boto3Storage

StaticRootS3Boto3Storage = lambda: S3Boto3Storage(location='static')
MediaRootS3Boto3Storage  = lambda: S3Boto3Storage(location='media')

项目结构:

myproject/
 |-- myapp/
 |    |-- aws/
 |    |    |-- __init__.py
 |    |    |-- utils.py
 |    |-- __init__.py
 |    |-- settings.py
 |    |-- urls.py
 |    +-- wsgi.py
 +-- manage.py
 |-- static/
 |   |-- scss
 |   |-- css
 |   |-- js
 |   |-- images
 |-- staticfiles/
 |    |-- **ALL STATIC FILES END UP HERE** 

注:

  • 更改STATICFILES_STORAGE似乎对输出没有影响
  • python manage.py collectstatic的结果如下:

    You have requested to collect static files at the destination location as specified in your settings:
    /Users/nickmancini/Development/myapp/staticfiles

  • 我没有收到任何错误信息。所有文件都成功创建在本地的静态文件夹中。

  • 媒体文件已成功上传到我的S3存储桶,但静态文件总是到/Users/me/myproject/myapp/staticfiles

  • 根据文档,在设置STATICFILES_STORAGES后,“您所要做的就是运行collectstatic命令,然后您的静态文件将通过您的存储包传送到S3中”。

问题:

  • 我可以提供哪些其他有用的信息?

我查阅的资源:


你尝试过使用STATIC_ROOT吗?https://docs.djangoproject.com/en/2.0/ref/settings/#std:setting-STATIC_ROOT 我之前将STATIC_ROOT设置为空,结果所有文件都被放到了C盘。 - dfundako
1
@dfundako 我已经尝试将 STATIC_ROOT 设置为 ' ' 和 AWS_S3_URL,但都没有对 collectstatic 产生影响。我应该将 STATIC_ROOT 设置为 AWS 存储桶(例如 AWS_S3_URL)吗? - Nick Mancini
将其设置为任何值,然后查看是否将所有静态文件推到 /Users/nickmancini/Development/myapp/staticfiles 以外的其他位置。如果是,那我猜你走对了路。 - dfundako
1个回答

12

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接