首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Collectstatic创建空文件

Collectstatic创建空文件
EN

Stack Overflow用户
提问于 2018-04-24 18:37:48
回答 1查看 368关注 0票数 5

我正在尝试将一个应用程序升级到Django 1.11,但在使用collectstatic时遇到问题。

旧版本:

代码语言:javascript
复制
django 1.8.17 
django-storages 1.5.1

新版本:

代码语言:javascript
复制
django 1.11.12
django-storages 1.6.6

存储:

代码语言:javascript
复制
class StaticS3BotoStorage(ManifestFilesMixin, S3BotoStorage):
    location = 'static'
    file_overwrite = True
    preload_metadata = True

代码语言:javascript
复制
class StaticS3BotoStorage(CachedFilesMixin, S3BotoStorage):
    location = 'static'
    file_overwrite = True
    preload_metadata = True

在旧版本中,包括collectstatic --clear在内,collectstatic工作得很好。

升级后,collectstatic --clear会失败(不会删除任何文件)。collectstatic确实会复制文件,但是,有时它会创建同一文件的两个版本。在这个特定的例子中,我得到了base.hash1.cssbase.hash2.cssbase.hash2.css为空,因此页面将打开,但无法正确呈现。

如果我不使用CachedFilesMixinManifestFilesMixincollectstatic可以正常工作,但clear仍然失败。

我测试了django 1.11和django-storages的不同组合,但它们似乎都表现相同。

其他人也遇到过类似的问题吗?

EN

回答 1

Stack Overflow用户

发布于 2018-07-11 01:02:30

我们也遇到过同样的问题。

我认为,潜在的问题有多个问题/来源:

  • ManifestFilesMixin使用和重用ContentFile对象来生成散列文件,并多次保存这些文件。不重置ContentFile对象(通过对它们调用.seek(0) )。
  • S3BotoStorage保存这些文件,而不检查它们是否在正确的位置。将其与FileSystemStorage进行比较:始终通过迭代文件的.chuncks()从头开始读取文件。

我们通过重写S3BotoStorage解决了空文件问题:

代码语言:javascript
复制
class PatchedS3StaticStorage(S3BotoStorage):
    def _save(self, name, content):
        if hasattr(content, 'seek') and hasattr(content, 'seekable') and content.seekable():
            content.seek(0)
        return super()._save(name, content)

简而言之,我们在保存文件之前先查找文件的开头。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49999582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档