λ€μκ³Ό κ°μ νλμ κ΄μ°°νμ΅λλ€.
λ΄ νμ΄μ§μλ {% thumbnail %}
ν
νλ¦Ώ νκ·Έμ λν λ λ²μ νΈμΆμ΄ μμΌλ©° κ°κ° λ€λ₯Έ ν¬κΈ°μ λμΌν μμ€ μ΄λ―Έμ§μ μΆμνμ μμ²ν©λλ€. μ΄μ κ°μ΄:
{% thumbnail user.get_profile.avatar_image "46x46" crop="center" as im %} .. {% endthumbnail %}
{% thumbnail user_profile.avatar_image "187x187" crop="center" as im %} .. {% endthumbnail %}
(νΈμΆμ λ€λ₯Έ Django ν νλ¦Ώμμ μ΄λ£¨μ΄μ§λλ€)
sorl-thumbnailμ΄ μΈλ€μΌμ μ°Ύμ μ μμΌλ©΄ μμλλ‘ μμ±λ©λλ€. κ·Έλ¬λ μΆμν μ€ νλκ° ν€ κ° μ μ₯μμ sorl-thumbnail||thumbnails||xxx
νλͺ©μμ μ°Έμ‘°λμ§ μμ΅λλ€.
νμ΄μ§κ° λ λλ§λ ν ν€ κ° μ μ₯μλ λ€μκ³Ό κ°μ΅λλ€.
# select * from thumbnail_kvstore;
key | value
--------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------
sorl-thumbnail||image||3314722c993608c1dab30949d2504172 | {"storage": "outdoorish.storage.OverwriteStorage", "name": "profiles/avatars/2205.jpg", "size": [300, 423]}
sorl-thumbnail||image||4d545ece8fb09c9176996000cddc0fac | {"storage": "django.core.files.storage.FileSystemStorage", "name": "cache/7c/ab/7cab89bcadad6122d441e6d5443fccc2.jpg", "size": [187, 187]}
sorl-thumbnail||thumbnails||3314722c993608c1dab30949d2504172 | ["4d545ece8fb09c9176996000cddc0fac"]
sorl-thumbnail||image||256cd182b71debc11e8aae0ed8ee1a9d | {"storage": "django.core.files.storage.FileSystemStorage", "name": "cache/b2/71/b27103adff0bdbba7d05fc98a51be131.jpg", "size": [46, 46]}
(4 rows)
μ΄λ―Έμ§ μ€ νλκ° μμ€ νμΌμ μ°κ²°λμ§ μμ μ΄μ λ 무μμ
λκΉ? μ΄ νλμ΄ μλμ μ
λκΉ? ( sorl.thumbnail.delete
νΈμΆν λ μΈλ€μΌμ΄ μμ λμ§ μλ μμΈμ΄λΌκ³ μκ°νκΈ° λλ¬Έμ
λλ€.)
sorl-thumbnail==11.12.1b
μ΄κ²μ μΈλ€μΌ μμ±μ Django λ‘κ·Έμ λλ€.
첫 λ²μ§Έ μΈλ€μΌ κ°μ Έμ€κΈ°/μμ± λ‘κ·Έ:
2014-10-14 14:58:35,131 DEBUG base Getting thumbnail for file [profiles/avatars/2205.jpg] at [187x187] | File:/home/anton/.virtualenvs/outdoorish/lib/python2.7/site-packages/sorl/thumbnail/base.py:67 (get_thumbnail), PID:8096 Thread:140412452124416
2014-10-14 14:58:35,182 DEBUG util (0.001) SELECT "thumbnail_kvstore"."key", "thumbnail_kvstore"."value" FROM "thumbnail_kvstore" WHERE "thumbnail_kvstore"."key" = 'sorl-thumbnail||image||4d545ece8fb09c9176996000cddc0fac' ; args=(u'sorl-thumbnail||image||4d545ece8fb09c9176996000cddc0fac',) | File:/home/anton/.virtualenvs/outdoorish/lib/python2.7/site-packages/django/db/backends/util.py:50 (execute), PID:8096 Thread:140412452124416
2014-10-14 14:58:35,210 DEBUG base Creating thumbnail file [cache/7c/ab/7cab89bcadad6122d441e6d5443fccc2.jpg] at [187x187] with [{'rounded': None, 'padding_color': '#ffffff', 'format': 'JPEG', 'colorspace': 'RGB', 'cropbox': None, 'padding': False, 'upscale': True, 'crop': u'center', 'image_info': {'jfif_version': (1, 1), 'jfif': 257, 'jfif_unit': 1, 'jfif_density': (72, 72), 'dpi': (72, 72)}, 'quality': 95}] | File:/home/anton/.virtualenvs/outdoorish/lib/python2.7/site-packages/sorl/thumbnail/base.py:148 (_create_thumbnail), PID:8096 Thread:140412452124416
2014-10-14 14:58:35,248 DEBUG util (0.001) SELECT "thumbnail_kvstore"."key", "thumbnail_kvstore"."value" FROM "thumbnail_kvstore" WHERE "thumbnail_kvstore"."key" = 'sorl-thumbnail||image||3314722c993608c1dab30949d2504172' ; args=(u'sorl-thumbnail||image||3314722c993608c1dab30949d2504172',) | File:/home/anton/.virtualenvs/outdoorish/lib/python2.7/site-packages/django/db/backends/util.py:50 (execute), PID:8096 Thread:140412452124416
2014-10-14 14:58:35,273 DEBUG util (0.001) SELECT "thumbnail_kvstore"."key", "thumbnail_kvstore"."value" FROM "thumbnail_kvstore" WHERE "thumbnail_kvstore"."key" = 'sorl-thumbnail||image||3314722c993608c1dab30949d2504172' ; args=(u'sorl-thumbnail||image||3314722c993608c1dab30949d2504172',) | File:/home/anton/.virtualenvs/outdoorish/lib/python2.7/site-packages/django/db/backends/util.py:50 (execute), PID:8096 Thread:140412452124416
2014-10-14 14:58:35,308 DEBUG util (0.001) INSERT INTO "thumbnail_kvstore" ("key", "value") VALUES ('sorl-thumbnail||image||3314722c993608c1dab30949d2504172', '{"storage": "outdoorish.storage.OverwriteStorage", "name": "profiles/avatars/2205.jpg", "size": [300, 423]}'); args=(u'sorl-thumbnail||image||3314722c993608c1dab30949d2504172', '{"storage": "outdoorish.storage.OverwriteStorage", "name": "profiles/avatars/2205.jpg", "size": [300, 423]}') | File:/home/anton/.virtualenvs/outdoorish/lib/python2.7/site-packages/django/db/backends/util.py:50 (execute), PID:8096 Thread:140412452124416
2014-10-14 14:58:35,345 DEBUG util (0.001) SELECT "thumbnail_kvstore"."key", "thumbnail_kvstore"."value" FROM "thumbnail_kvstore" WHERE "thumbnail_kvstore"."key" = 'sorl-thumbnail||image||4d545ece8fb09c9176996000cddc0fac' ; args=(u'sorl-thumbnail||image||4d545ece8fb09c9176996000cddc0fac',) | File:/home/anton/.virtualenvs/outdoorish/lib/python2.7/site-packages/django/db/backends/util.py:50 (execute), PID:8096 Thread:140412452124416
2014-10-14 14:58:35,371 DEBUG util (0.000) INSERT INTO "thumbnail_kvstore" ("key", "value") VALUES ('sorl-thumbnail||image||4d545ece8fb09c9176996000cddc0fac', '{"storage": "django.core.files.storage.FileSystemStorage", "name": "cache/7c/ab/7cab89bcadad6122d441e6d5443fccc2.jpg", "size": [187, 187]}'); args=(u'sorl-thumbnail||image||4d545ece8fb09c9176996000cddc0fac', '{"storage": "django.core.files.storage.FileSystemStorage", "name": "cache/7c/ab/7cab89bcadad6122d441e6d5443fccc2.jpg", "size": [187, 187]}') | File:/home/anton/.virtualenvs/outdoorish/lib/python2.7/site-packages/django/db/backends/util.py:50 (execute), PID:8096 Thread:140412452124416
2014-10-14 14:58:35,426 DEBUG util (0.001) SELECT "thumbnail_kvstore"."key", "thumbnail_kvstore"."value" FROM "thumbnail_kvstore" WHERE "thumbnail_kvstore"."key" = 'sorl-thumbnail||thumbnails||3314722c993608c1dab30949d2504172' ; args=(u'sorl-thumbnail||thumbnails||3314722c993608c1dab30949d2504172',) | File:/home/anton/.virtualenvs/outdoorish/lib/python2.7/site-packages/django/db/backends/util.py:50 (execute), PID:8096 Thread:140412452124416
2014-10-14 14:58:35,449 DEBUG util (0.001) SELECT "thumbnail_kvstore"."key", "thumbnail_kvstore"."value" FROM "thumbnail_kvstore" WHERE "thumbnail_kvstore"."key" = 'sorl-thumbnail||thumbnails||3314722c993608c1dab30949d2504172' ; args=(u'sorl-thumbnail||thumbnails||3314722c993608c1dab30949d2504172',) | File:/home/anton/.virtualenvs/outdoorish/lib/python2.7/site-packages/django/db/backends/util.py:50 (execute), PID:8096 Thread:140412452124416
2014-10-14 14:58:35,472 DEBUG util (0.000) INSERT INTO "thumbnail_kvstore" ("key", "value") VALUES ('sorl-thumbnail||thumbnails||3314722c993608c1dab30949d2504172', '["4d545ece8fb09c9176996000cddc0fac"]'); args=(u'sorl-thumbnail||thumbnails||3314722c993608c1dab30949d2504172', '["4d545ece8fb09c9176996000cddc0fac"]') | File:/home/anton/.virtualenvs/outdoorish/lib/python2.7/site-packages/django/db/backends/util.py:50 (execute), PID:8096 Thread:140412452124416
λ λ²μ§Έ μΈλ€μΌ κ°μ Έμ€κΈ°/μμ± λ‘κ·Έ:
2014-10-14 14:58:37,314 DEBUG base Getting thumbnail for file [profiles/avatars/2205.jpg] at [46x46] | File:/home/anton/.virtualenvs/outdoorish/lib/python2.7/site-packages/sorl/thumbnail/base.py:67 (get_thumbnail), PID:8096 Thread:140412426946304
2014-10-14 14:58:37,333 DEBUG util (0.001) SELECT "thumbnail_kvstore"."key", "thumbnail_kvstore"."value" FROM "thumbnail_kvstore" WHERE "thumbnail_kvstore"."key" = 'sorl-thumbnail||image||256cd182b71debc11e8aae0ed8ee1a9d' ; args=(u'sorl-thumbnail||image||256cd182b71debc11e8aae0ed8ee1a9d',) | File:/home/anton/.virtualenvs/outdoorish/lib/python2.7/site-packages/django/db/backends/util.py:50 (execute), PID:8096 Thread:140412426946304
2014-10-14 14:58:37,345 DEBUG base Creating thumbnail file [cache/b2/71/b27103adff0bdbba7d05fc98a51be131.jpg] at [46x46] with [{'rounded': None, 'padding_color': '#ffffff', 'format': 'JPEG', 'colorspace': 'RGB', 'cropbox': None, 'padding': False, 'upscale': True, 'crop': u'center', 'image_info': {'jfif_version': (1, 1), 'jfif': 257, 'jfif_unit': 1, 'jfif_density': (72, 72), 'dpi': (72, 72)}, 'quality': 95}] | File:/home/anton/.virtualenvs/outdoorish/lib/python2.7/site-packages/sorl/thumbnail/base.py:148 (_create_thumbnail), PID:8096 Thread:140412426946304
2014-10-14 14:58:37,386 DEBUG util (0.001) SELECT "thumbnail_kvstore"."key", "thumbnail_kvstore"."value" FROM "thumbnail_kvstore" WHERE "thumbnail_kvstore"."key" = 'sorl-thumbnail||image||256cd182b71debc11e8aae0ed8ee1a9d' ; args=(u'sorl-thumbnail||image||256cd182b71debc11e8aae0ed8ee1a9d',) | File:/home/anton/.virtualenvs/outdoorish/lib/python2.7/site-packages/django/db/backends/util.py:50 (execute), PID:8096 Thread:140412426946304
2014-10-14 14:58:37,390 DEBUG util (0.001) INSERT INTO "thumbnail_kvstore" ("key", "value") VALUES ('sorl-thumbnail||image||256cd182b71debc11e8aae0ed8ee1a9d', '{"storage": "django.core.files.storage.FileSystemStorage", "name": "cache/b2/71/b27103adff0bdbba7d05fc98a51be131.jpg", "size": [46, 46]}'); args=(u'sorl-thumbnail||image||256cd182b71debc11e8aae0ed8ee1a9d', '{"storage": "django.core.files.storage.FileSystemStorage", "name": "cache/b2/71/b27103adff0bdbba7d05fc98a51be131.jpg", "size": [46, 46]}') | File:/home/anton/.virtualenvs/outdoorish/lib/python2.7/site-packages/django/db/backends/util.py:50 (execute), PID:8096 Thread:140412426946304
2014-10-14 14:58:37,429 DEBUG util (0.001) SELECT "thumbnail_kvstore"."key", "thumbnail_kvstore"."value" FROM "thumbnail_kvstore" WHERE "thumbnail_kvstore"."key" = 'sorl-thumbnail||thumbnails||3314722c993608c1dab30949d2504172' ; args=(u'sorl-thumbnail||thumbnails||3314722c993608c1dab30949d2504172',) | File:/home/anton/.virtualenvs/outdoorish/lib/python2.7/site-packages/django/db/backends/util.py:50 (execute), PID:8096 Thread:140412426946304
μ΄μ λν μ λ°μ΄νΈκ° μμ΅λκΉ? μ΄λ―Έμ§ μ€ νλκ° ν€ κ° μ μ₯μμ μμ€ νμΌμ μ°κ²°λμ§ μμ μ΄μ λ₯Ό μ€λͺ ν μ μλ μ¬λμ΄ μμ΅λκΉ?
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ λ° λμμ μ£Όκ³ μΆμ§λ§ μ΄λμλΆν° μμν΄μΌ νλμ§μ λν ν¬μΈν°κ° νμν©λλ€!
μ½λλ₯Ό μ‘°κΈ νν€μ³λ³΄λ KVStore._set_raw()
( cached_db_kvstore.py
) κΈ°λ₯μ λ¬Έμ κ° μλ κ² κ°μ΅λλ€ (μ½λ λΌμΈ λ§ν¬: https://github.com/mariocesar/sorl- μΈλ€μΌ/blob/master/sorl/thumbnail/kvstores/cached_db_kvstore.py#L43 )
μν©μ λ€μκ³Ό κ°μ΅λλ€.
_set_raw()
ν¨μλ λ€μ 맀κ°λ³μ(A)λ‘ νΈμΆλ©λλ€.
key: thumbnail||thumbnails||3314722c993608c1dab30949d2504172
value: ["4d545ece8fb09c9176996000cddc0fac", "256cd182b71debc11e8aae0ed8ee1a9d"]
KV μ μ₯μ(Postgres λ°μ΄ν°λ² μ΄μ€)μ λ€μ 맀κ°λ³μ(B)κ° μλ νλͺ©μ΄ μ΄λ―Έ μμ΅λλ€.
key: thumbnail||thumbnails||3314722c993608c1dab30949d2504172
value: ["4d545ece8fb09c9176996000cddc0fac"]
μ΄κ² λ¬Έμ μΌ:
μ΄μ _set_raw()
λ KVStoreModel.objects.get_or_create()
νΈμΆνκ³ λ°μ΄ν°λ² μ΄μ€((A), νλμ μΈλ€μΌμ΄ μ°Έμ‘°λλ νλͺ©)μμ νλͺ©μ κ°μ Έμ΅λλ€. κ·Έλ° λ€μ λ κ°μ μΆμν(B)μ λν μ°Έμ‘°κ° μλ νλͺ©μ μΊμ( django.core.cache.backends.locmem.LocMemCache
)μ μ μ₯ν©λλ€.
νλͺ©(B)μ μ λ²μ μ λ°μ΄ν°λ² μ΄μ€μ μ μ₯λμ§ μμ΅λλ€. μ΄λ―Έμ§λ₯Ό λ³κ²½νλ©΄ μΆμν μ€ νλλ§ μ
λ°μ΄νΈλκ³ λ€λ₯Έ νλλ κ·Έλλ‘ μ μ§λ©λλ€. thumbnail||thumbnails||3314722c993608c1dab30949d2504172
νλͺ©μμ μ°Έμ‘°νμ§ μκΈ° λλ¬Έμ
λλ€.
κ΄λ¦¬μ μ€ ν λͺ μ΄ λ¬Έμ λ₯Ό μ¬νν μ μλλ‘ λ¬Έμ λ₯Ό μ€λͺ νμΌλ©΄ ν©λλ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ λ° λμμ΄ λλ€λ©΄ μ λ§ μ’μ κ²μ λλ€! κ°μ¬ ν΄μ!
λλ νΌμκ° μλλλ€ :) μ λ°, μ΄ μμ μ¬νμ λ³ν©νμμμ€. λ§€μ° νμν©λλ€!
κ°μ₯ μ μ©ν λκΈ
μ½λλ₯Ό μ‘°κΈ νν€μ³λ³΄λ
KVStore._set_raw()
(cached_db_kvstore.py
) κΈ°λ₯μ λ¬Έμ κ° μλ κ² κ°μ΅λλ€ (μ½λ λΌμΈ λ§ν¬: https://github.com/mariocesar/sorl- μΈλ€μΌ/blob/master/sorl/thumbnail/kvstores/cached_db_kvstore.py#L43 )μν©μ λ€μκ³Ό κ°μ΅λλ€.
_set_raw()
ν¨μλ λ€μ 맀κ°λ³μ(A)λ‘ νΈμΆλ©λλ€.KV μ μ₯μ(Postgres λ°μ΄ν°λ² μ΄μ€)μ λ€μ 맀κ°λ³μ(B)κ° μλ νλͺ©μ΄ μ΄λ―Έ μμ΅λλ€.
μ΄κ² λ¬Έμ μΌ:
μ΄μ
_set_raw()
λKVStoreModel.objects.get_or_create()
νΈμΆνκ³ λ°μ΄ν°λ² μ΄μ€((A), νλμ μΈλ€μΌμ΄ μ°Έμ‘°λλ νλͺ©)μμ νλͺ©μ κ°μ Έμ΅λλ€. κ·Έλ° λ€μ λ κ°μ μΆμν(B)μ λν μ°Έμ‘°κ° μλ νλͺ©μ μΊμ(django.core.cache.backends.locmem.LocMemCache
)μ μ μ₯ν©λλ€.νλͺ©(B)μ μ λ²μ μ λ°μ΄ν°λ² μ΄μ€μ μ μ₯λμ§ μμ΅λλ€. μ΄λ―Έμ§λ₯Ό λ³κ²½νλ©΄ μΆμν μ€ νλλ§ μ λ°μ΄νΈλκ³ λ€λ₯Έ νλλ κ·Έλλ‘ μ μ§λ©λλ€.
thumbnail||thumbnails||3314722c993608c1dab30949d2504172
νλͺ©μμ μ°Έμ‘°νμ§ μκΈ° λλ¬Έμ λλ€.κ΄λ¦¬μ μ€ ν λͺ μ΄ λ¬Έμ λ₯Ό μ¬νν μ μλλ‘ λ¬Έμ λ₯Ό μ€λͺ νμΌλ©΄ ν©λλ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ λ° λμμ΄ λλ€λ©΄ μ λ§ μ’μ κ²μ λλ€! κ°μ¬ ν΄μ!