【问题标题】:Django, boto, S3 and easy_thumbnails not working in production environmentDjango、boto、S3 和 easy_thumbnails 在生产环境中不起作用
【发布时间】:2015-03-03 20:30:13
【问题描述】:

我正在使用 Django、django-storages 和 S3 (boto) 以及简单的缩略图。在我的本地机器上,一切都按预期工作:如果缩略图不存在,它会被创建并上传到 S3 并保存在 easy-thumbnails 数据库表中。但问题是,当我将代码推送到生产服务器时,它不起作用,easy-thumbnails 输出一个空图像 SRC。

我已经注意到,当我在本地机器上创建缩略图时,简单缩略图路径使用反斜杠,而我的 Linux 服务器需要正斜杠。如果我更改数据库中的斜线,缩略图会显示在我的 Linux 机器上,但它仍然无法在 Linux(生产)机器上生成缩略图。

简单的 django-storages 测试失败:

>>> import django
>>> from django.core.files.storage import default_storage
>>> file = default_storage.open('storage_test', 'w')

输出: django.core.exceptions.ImproperlyConfigured:请求设置 DEFAULT_FILE_STORAGE,但未配置设置。您必须在访问设置之前定义环境变量 DJANGO_SETTINGS_MODULE 或调用 settings.configure()。

如果我这样做:

>>> from base.settings import staging
>>> from django.conf import settings
>>> settings.configure(staging)

这可行(我有一个 settings 目录,其中包含 4 个设置文件:base.py、staging.py、development.py 和 production.py)

似乎在我的生产服务器上,配置文件没有正确加载(但是网站的其余部分工作正常)。如果我将THUMBNAIL_DEBUG = True 添加到我的设置文件,但easy-thumbnails 的调试仍然不起作用(它在我的本地机器上工作)。

可能是什么问题?我已经调试了 10 多个小时了。

【问题讨论】:

标签: django amazon-s3 boto


【解决方案1】:

尝试重构您的设置以使用更加面向对象的结构。 [来自 Disqus 的 David Cramer 概述了一个很好的例子:

http://justcramer.com/2011/01/13/settings-in-django/

您可以将任何特定于服务器的设置放在local_settings.py 文件中,并且可以将精简后的版本作为example_local_settings.py 存储在您的存储库中。

如果您有很多特定于暂存或审核服务器的设置,您仍然可以使用单独的设置文件,但您不希望将完整的数据库凭据存储在代码仓库中,因此您必须自定义 @ 987654325@ 无论如何。您可以通过在local_settings.py 顶部添加导入来定义要包含的设置:

from project.conf.settings.dev import *

然后,您可以将DJANGO_SETTINGS_MODULE 设置为始终指向同一个地方。这将而不是调用settings.configure(),如 Django 文档中所述:

https://docs.djangoproject.com/en/dev/topics/settings/#either-configure-or-django-settings-module-is-required

这样,您就知道您在生产服务器上的设置肯定会被导入,因为local_settings.py 始终会被导入。

【讨论】:

    【解决方案2】:

    首先尝试使用:

    python manage.py shell --settings=settings/staging
    

    使用正确的设置文件加载 shell,然后尝试调试

    【讨论】:

      【解决方案3】:

      出于某种原因,S3 和模板语言中的简单缩略图似乎无法相互配合......一些路径问题可能在某个时候可以解决。

      我的解决方案(阅读:解决方法)是将缩略图生成移动到图像字段本身的模型中,例如:

      avatar = ThumbnailerImageField(upload_to = avatar_file_name, resize_source=dict(size=(125, 125), crop="smart"), blank = True)
      

      为了完整起见:

      def avatar_file_name(instance, filename):
          path = "%s/avatar.%s" % (str(instance.user.username), filename.split('.')[1])
          if os.path.exists(settings.MEDIA_ROOT + path):
              os.remove(settings.MEDIA_ROOT + path)   
          return path
      

      【讨论】:

        猜你喜欢
        • 2017-04-29
        • 1970-01-01
        • 2015-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多