Sorl-thumbnail: ์ •์  ํŒŒ์ผ ์ œ๊ณต

์— ๋งŒ๋“  2011๋…„ 09์›” 20์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: jazzband/sorl-thumbnail

์ •์ (STATIC_ROOT) ํŒŒ์ผ์„ ์ถ•์†ŒํŒ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์™ธ๋ถ€(http://....) ๋ฐ ๋ฏธ๋””์–ด(MEDIA_ROOT) ํŒŒ์ผ์—์„œ๋งŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ •์  ์ด๋ฏธ์ง€์˜ ์ถœ๋ ฅ ํฌ๊ธฐ๊ฐ€ ํ•ญ์ƒ ๊ฐ™์ง€ ์•Š์„ ๋•Œ(์‚ฌ์šฉ์ž ํ™˜๊ฒฝ ์„ค์ •, ํ…Œ๋งˆ ๋“ฑ์„ ํ†ตํ•ด) ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‹ค์Œ์€ ํŒจ์น˜์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. https://github.com/marcinn/sorl-thumbnail/commit/61557b41169f0656063c557735ef62908a5fcaab

ํŽธ์ง‘ : ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. thumbnail.url ์˜ ์ถœ๋ ฅ์ด ์œ ํšจํ•œ ๊ฒƒ ๊ฐ™์ง€๋งŒ cached.url ์—์„œ ๊ฒ€์ƒ‰ํ•  ๋•Œ /static/ /media/ ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€์— ๋” ๋ถ€์„œ์ง„ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

EDIT (2) : ์Šคํ† ๋ฆฌ์ง€ ์ฝ”๋“œ๋ฅผ ์—ญ์ง๋ ฌํ™”ํ•˜๋Š” ๋ฐ ์„ค๊ณ„ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ† ๋ฆฌ์ง€ ํด๋ž˜์Šค๊ฐ€ ๋กœ๋“œ๋˜๊ณ  ๊ธฐ์กด ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™”๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, sorl.thumbnail์€ ์Šคํ† ๋ฆฌ์ง€ ์ธ์Šคํ„ด์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ณ ์œ ํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค(๋‹ค๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋จ). ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ FileSystemStorage์—์„œ ์ƒ์†ํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ง€์ • ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์„ ์ ์šฉํ•œ ํ›„์—๋Š” ๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ฒŒ ๋ฌด์—‡์ด๋“  ์ธ๋„ค์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ •์˜ ํ…œํ”Œ๋ฆฟ ํƒœ๊ทธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from django.core.files.storage import FileSystemStorage
from django.conf import settings
from django import template
from sorl.thumbnail.templatetags.thumbnail import ThumbnailNode


register = template.Library()

class StaticThumbnailStorage(FileSystemStorage):
    def __init__(self, *args, **kw):
        super(StaticThumbnailStorage, self).__init__(
            *args, location='/path/to/custom/static/'
            base_url=settings.STATIC_URL, **kw)

storage = StaticThumbnaikStorage()

class StaticThumbnailNode(ThumbnailNode):
    def _get_thumbnail(self, file_, geometry, **options):
        options['storage'] = storage
        return super(StaticThumbnailNode, self)._get_thumbnail(
                file_, geometry, **options)


@register.tag
def static_thumbnail(parser, token):
    return StaticThumbnailNode(parser, token)

์„ค์ •์„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  3 ๋Œ“๊ธ€

STATIC_ROOT๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ถ€ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 'django.core.files.storage.FileSystemStorage'๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  location=settings.STATIC_ROOT ๋ฐ base_url=settings.STATIC_URL๋กœ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์—์„œ ๊ณ„์† ์ง„ํ–‰ํ•˜์‹ญ์‹œ์˜ค. ๋ฒŒ๋ ˆ.

5๋…„์ด ์ง€๋‚œ ํ›„์—๋„ https://github.com/mariocesar/sorl-thumbnail/blob/master/sorl/thumbnail/base.py#L100 ๋•Œ๋ฌธ์— DEFAULT ์ €์žฅ์†Œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ •์  ํŒŒ์ผ์—์„œ ์ธ์„ ์ƒ์„ฑํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.
StackOverflow๋Š” ๊ตฌํ˜„์œผ๋กœ ์ธํ•ด ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์„ ๊ณ ์น  ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? get_thumbnail() ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ง€์ • ์Šคํ† ๋ฆฌ์ง€ ์ธ์Šคํ„ด์Šค๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ํŒจ์น˜์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. https://github.com/marcinn/sorl-thumbnail/commit/61557b41169f0656063c557735ef62908a5fcaab

ํŽธ์ง‘ : ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. thumbnail.url ์˜ ์ถœ๋ ฅ์ด ์œ ํšจํ•œ ๊ฒƒ ๊ฐ™์ง€๋งŒ cached.url ์—์„œ ๊ฒ€์ƒ‰ํ•  ๋•Œ /static/ /media/ ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€์— ๋” ๋ถ€์„œ์ง„ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

EDIT (2) : ์Šคํ† ๋ฆฌ์ง€ ์ฝ”๋“œ๋ฅผ ์—ญ์ง๋ ฌํ™”ํ•˜๋Š” ๋ฐ ์„ค๊ณ„ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ† ๋ฆฌ์ง€ ํด๋ž˜์Šค๊ฐ€ ๋กœ๋“œ๋˜๊ณ  ๊ธฐ์กด ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™”๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, sorl.thumbnail์€ ์Šคํ† ๋ฆฌ์ง€ ์ธ์Šคํ„ด์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ณ ์œ ํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค(๋‹ค๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋จ). ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ FileSystemStorage์—์„œ ์ƒ์†ํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ง€์ • ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์„ ์ ์šฉํ•œ ํ›„์—๋Š” ๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ฒŒ ๋ฌด์—‡์ด๋“  ์ธ๋„ค์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ •์˜ ํ…œํ”Œ๋ฆฟ ํƒœ๊ทธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from django.core.files.storage import FileSystemStorage
from django.conf import settings
from django import template
from sorl.thumbnail.templatetags.thumbnail import ThumbnailNode


register = template.Library()

class StaticThumbnailStorage(FileSystemStorage):
    def __init__(self, *args, **kw):
        super(StaticThumbnailStorage, self).__init__(
            *args, location='/path/to/custom/static/'
            base_url=settings.STATIC_URL, **kw)

storage = StaticThumbnaikStorage()

class StaticThumbnailNode(ThumbnailNode):
    def _get_thumbnail(self, file_, geometry, **options):
        options['storage'] = storage
        return super(StaticThumbnailNode, self)._get_thumbnail(
                file_, geometry, **options)


@register.tag
def static_thumbnail(parser, token):
    return StaticThumbnailNode(parser, token)

์„ค์ •์„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰