Custom Search

Monday, April 26, 2010

django sorl-thumbnail X-Accel-Redirect

django sorl-thumbnail X-Accel-Redirect
django sorl-thumbnail X-Accel-Redirect Customization
nginx x-accel-redirect protection of static files sorl-thumbnail django

---------------- in settings.py

MEDIA_ROOT = os.path.join(PROJECT_PATH, 'media')

MEDIA_URL = '/media/'
UPLOAD_PATH = 'upload/projects'
THUMBNAIL_X_ACCEL_REDIRECT_UPLOAD_DIR = 'upload/'
THUMBNAIL_X_ACCEL_REDIRECT_APP_DIR = '/siren/'

---------------- in template

{% load thumbnail %}

<a href="">
<img src="{% thumbnail mockup.image 100x100 %}" alt="{{ mockup.caption }}" title="{{ mockup.caption }}"/>
</a>

---------------- in /sorl/thumbnail/main.py

import os

from django.conf import settings
from django.utils.encoding import iri_to_uri, force_unicode

from sorl.thumbnail.base import Thumbnail
from sorl.thumbnail.processors import dynamic_import
from sorl.thumbnail import defaults


def get_thumbnail_setting(setting, override=None):
"""
Get a thumbnail setting from Django settings module, falling back to the
default.

If override is not None, it will be used instead of the setting.
"""
if override is not None:
return override
if hasattr(settings, 'THUMBNAIL_%s' % setting):
return getattr(settings, 'THUMBNAIL_%s' % setting)
else:
return getattr(defaults, setting)


def build_thumbnail_name(source_name, size, options=None,
quality=None, basedir=None, subdir=None, prefix=None,
extension=None):
quality = get_thumbnail_setting('QUALITY', quality)
basedir = get_thumbnail_setting('BASEDIR', basedir)
subdir = get_thumbnail_setting('SUBDIR', subdir)
prefix = get_thumbnail_setting('PREFIX', prefix)
extension = get_thumbnail_setting('EXTENSION', extension)
path, filename = os.path.split(source_name)
basename, ext = os.path.splitext(filename)
name = '%s%s' % (basename, ext.replace(os.extsep, '_'))
size = '%sx%s' % tuple(size)

# Handle old list format for opts.
options = options or {}
if isinstance(options, (list, tuple)):
options = dict([(opt, None) for opt in options])

opts = options.items()
opts.sort() # options are sorted so the filename is consistent
opts = ['%s_' % (v is not None and '%s-%s' % (k, v) or k)
for k, v in opts]
opts = ''.join(opts)
extension = extension and '.%s' % extension
thumbnail_filename = '%s%s_%s_%sq%s%s' % (prefix, name, size, opts,
quality, extension)
return os.path.join(basedir, path, subdir, thumbnail_filename)


class DjangoThumbnail(Thumbnail):
imagemagick_file_types = get_thumbnail_setting('IMAGEMAGICK_FILE_TYPES')

def __init__(self, relative_source, requested_size, opts=None,
quality=None, basedir=None, subdir=None, prefix=None,
relative_dest=None, processors=None, extension=None):
relative_source = force_unicode(relative_source)
# Set the absolute filename for the source file
source = self._absolute_path(relative_source)

quality = get_thumbnail_setting('QUALITY', quality)
convert_path = get_thumbnail_setting('CONVERT')
wvps_path = get_thumbnail_setting('WVPS')
if processors is None:
processors = dynamic_import(get_thumbnail_setting('PROCESSORS'))

# Call super().__init__ now to set the opts attribute. generate() won't
# get called because we are not setting the dest attribute yet.
super(DjangoThumbnail, self).__init__(source, requested_size,
opts=opts, quality=quality, convert_path=convert_path,
wvps_path=wvps_path, processors=processors)

# Get the relative filename for the thumbnail image, then set the
# destination filename
if relative_dest is None:
relative_dest = \
self._get_relative_thumbnail(relative_source, basedir=basedir,
subdir=subdir, prefix=prefix,
extension=extension)
relative_dest_url_x_accel_redirect = relative_dest.replace(settings.THUMBNAIL_X_ACCEL_REDIRECT_UPLOAD_DIR, '') #<---- Inside IF statement
filelike = not isinstance(relative_dest, basestring)
if filelike:
self.dest = relative_dest
else:
self.dest = self._absolute_path(relative_dest)

# Call generate now that the dest attribute has been set
self.generate()

# Set the relative & absolute url to the thumbnail
if not filelike:
self.relative_url = \
iri_to_uri('/'.join(relative_dest_url_x_accel_redirect.split(os.sep))) #<----
self.absolute_url = '%s%s' % (settings.THUMBNAIL_X_ACCEL_REDIRECT_APP_DIR,
self.relative_url) #<---- Inside IF statement
#self.absolute_url = '%s%s' % (settings.MEDIA_URL,
self.relative_url)

def _get_relative_thumbnail(self, relative_source,
basedir=None, subdir=None, prefix=None,
extension=None):
"""
Returns the thumbnail filename including relative path.
"""
return build_thumbnail_name(relative_source, self.requested_size,
self.opts, self.quality, basedir, subdir,
prefix, extension)

def _absolute_path(self, filename):
absolute_filename = os.path.join(settings.MEDIA_ROOT, filename)
return absolute_filename.encode(settings.FILE_CHARSET)

def __unicode__(self):
return self.absolute_url


----------------

***************************

No comments:

Post a Comment