Django 静态文件 URLS 损坏

Posted

技术标签:

【中文标题】Django 静态文件 URLS 损坏【英文标题】:Django static file URLS are broken 【发布时间】:2014-05-30 14:26:40 【问题描述】:

我正在使用 Boto2 来帮助将 s3 与我在 heroku 上的 Django-admin 应用程序集成。为我的静态文件生成的一些 url 不正确。 示例:

https://BUCKET.s3.amazonaws.com/FOLDER/static/admin?Signature=XXX&Expires=YYY&AWSAccessKeyId=ZZZimg/icon_calendar.gif

应该是什么时候

https://BUCKET.s3.amazonaws.com/FOLDER/static/admin/img/icon_calendar.gif?Signature=XXX&Expires=YYY&AWSAccessKeyId=ZZZ

请注意img/icon_calendar.gif 不合适。我认为导致此问题的唯一原因是我用来在存储桶中的子文件夹上制作静态文件的代码。它基于this SO solution

#s3utils.py
from storages.backends.s3boto import S3BotoStorage
import  os

STATIC_ROOT = 'FOLDER/static'
MEDIA_ROOT = 'FOLDER/media'

StaticRootS3BotoStorage = lambda: S3BotoStorage(location=STATIC_ROOT)
MediaRootS3BotoStorage  = lambda: S3BotoStorage(location=MEDIA_ROOT)

#settings.py
...
AWS_STORAGE_BUCKET_NAME = "BUCKET"
AWS_ACCESS_KEY_ID = 'ZZZ'
AWS_SECRET_ACCESS_KEY = 'AAAA'
DEFAULT_FILE_STORAGE = 'app.s3utils.MediaRootS3BotoStorage'
STATICFILES_STORAGE = 'app.s3utils.StaticRootS3BotoStorage'

S3_URL = 'http://%s.s3.amazonaws.com/' % (AWS_STORAGE_BUCKET_NAME)

STATIC_ROOT = '/FOLDER/static/'
MEDIA_ROOT = '/FOLDER/media/'

STATIC_URL = '%sFOLDER/static/' % (S3_URL)
MEDIA_URL = '%sFOLDER/media/' % (S3_URL)

什么可能导致 URL 损坏?

【问题讨论】:

你找到解决这个问题的方法了吗@datinc?我有完全相同的设置和完全相同的问题。 我做了@espenhogbakk。我已将其设置为接受的答案。 【参考方案1】:

我在此 git repo 中找到了修复程序。我的 s3utils.py 文件现在看起来像

#s3utils.py
from storages.backends.s3boto import S3BotoStorage
import  os

STATIC_ROOT = 'FOLDER/static'
MEDIA_ROOT = 'FOLDER/media'

class FixedS3BotoStorage(S3BotoStorage):
    def url(self, name):
        url = super(FixedS3BotoStorage, self).url(name)
        if name.endswith('/') and not url.endswith('/'):
            url += '/'
        return url

StaticRootS3BotoStorage = lambda: FixedS3BotoStorage(location=STATIC_ROOT)
MediaRootS3BotoStorage  = lambda: FixedS3BotoStorage(location=MEDIA_ROOT)

【讨论】:

【参考方案2】:
AWS_QUERYSTRING_AUTH = False
AWS_ACCESS_KEY_ID = os.environ.get('your_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('your_key')
AWS_STORAGE_BUCKET_NAME = 'yourbucketname'
AWS_PRELOAD_METADATA = True #helps collectstatic do updates

STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

STATIC_URL = 'https://' + AWS_STORAGE_BUCKET_NAME + '.s3.amazonaws.com/bucket/folder/static'

MEDIA_URL = 'https://' + AWS_STORAGE_BUCKET_NAME + '.s3.amazonaws.com/ bucket/folder/media'

【讨论】:

这个系统要求文件夹结构看起来像bucket/folder/static和bucket/folder/media。使用您的设置不允许这种结构 使用新的编辑不会将文件存储在指定的文件夹中。

以上是关于Django 静态文件 URLS 损坏的主要内容,如果未能解决你的问题,请参考以下文章

Python的Django框架完成一个完整的论坛(2.urls.py配置静态文件)

Django静态图像文件无法加载资源

django 处理静态文件

django中怎么载入css等静态文件

django中怎么载入css等静态文件

Django学习——路由分发名称空间伪静态本地虚拟环境