collectstatic 不推送到文件 S3

Posted

技术标签:

【中文标题】collectstatic 不推送到文件 S3【英文标题】:collecstatic does not push to files S3 【发布时间】:2018-09-19 10:17:29 【问题描述】:

编辑:

我发现从我的 settings.py 文件中删除 import django_heroku 允许我将我的静态文件推送到我的 AWS 存储桶。当我取消注释import django_herokucollectstatic 然后将我的文件推送到staticfiles 文件夹。

manage.py collectstatic#import django_heroku

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

maange.py collectstaticimport django_heroku

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

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

问题:

每当我运行python manage.py collectstatic 时,我的所有静态文件都会被放入一个local '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

我没有收到任何错误消息。本地staticfiles文件夹中所有文件都成功创建。

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

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

问题:

我还能提供哪些其他有用的信息?

我咨询过的资源:

https://docs.djangoproject.com/en/2.0/howto/static-files/deployment/#serving-static-files-from-a-cloud-service-or-cdn https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html https://www.codingforentrepreneurs.com/blog/s3-static-media-files-for-django/

【问题讨论】:

你试过STATIC_ROOT吗? docs.djangoproject.com/en/2.0/ref/settings/…我之前已经离开了 STATIC_ROOT = '',它把所有东西都扔到了我的 C 盘上。 @dfundako 我已经尝试设置 STATIC_ROOT = ' ' & STATIC_ROOT = AWS_S3_URL 并没有对 collectstatic 产生影响。我应该将 STATIC_ROOT 设置为 AWS 存储桶(例如 AWS_S3_URL)吗? 将其设置为任何内容,看看是否会将所有静态文件推送到 /Users/nickmancini/Development/myapp/staticfiles 以外的其他位置。如果是这样,那意味着我猜你走在正确的轨道上 【参考方案1】:

对于遇到同样问题的任何人,我的解决方案是:django_heroku.settings(locals(), staticfiles=False)

which is also detailed at this github issue.

【讨论】:

以上是关于collectstatic 不推送到文件 S3的主要内容,如果未能解决你的问题,请参考以下文章

如何在不推送到服务器的情况下更新中继存储

Core Data 后台处理,保存不推送到主上下文

Django:“collectstatic”也应该收集媒体文件吗?

collectstatic 无法收集管理静态文件

Django collectstatic 没有这样的文件或目录

Django,即使在 collectstatic 之后也没有提供 uwsgi 静态文件