1

我正在使用 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 多个小时。

4

3 回答 3

1

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

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

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

如果您有很多特定于暂存或审查服务器的设置,您仍然可以使用单独的设置文件,但您不希望将完整的数据库凭据存储在代码仓库中,因此您必须自定义这些文件local_settings.py。您可以通过在顶部添加导入来定义要包含的设置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总是被导入。

于 2013-03-20T18:47:49.163 回答
0

出于某种原因,模板语言中的 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
于 2014-01-11T20:10:28.910 回答
0

首先尝试使用:

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

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

于 2013-03-25T15:06:18.743 回答