Django-compressor: ๋””๋ฒ„๊ทธ๊ฐ€ False๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ Django๊ฐ€ ์••์ถ• ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์Œ

์— ๋งŒ๋“  2012๋…„ 12์›” 22์ผ  ยท  5์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: django-compressor/django-compressor

๊ทธ๋ž˜์„œ Debug = False๋กœ ๊ฐœ๋ฐœ ์ค‘์ธ django-compressor๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Debug = True๋กœ ์„ค์ •ํ•˜๋ฉด django-compressor๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ URL, ํŒŒ์ผ ๋ฐ ๋ชจ๋“  ๊ฒƒ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ Django ์ž์ฒด๋Š” ํ•ด๋‹น ํŒŒ์ผ์— ๋Œ€ํ•ด 404๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐ€์ง€๊ณ ์žˆ๋‹ค

STATIC_ROOT = os.path.join(PROJECT_DIR, "static_media")

๊ทธ๋ฆฌ๊ณ  ๋‚ด ํ”„๋กœ์ ํŠธ์˜ static_media ํด๋” ์•ˆ์—๋Š” ์••์ถ•๊ธฐ์— ์˜ํ•ด ์ƒ์„ฑ๋œ CACHE/css/bfdeac875f7a.css ํŒŒ์ผ์ด ์‹ค์ œ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์ƒ์„ฑ๋œ HTML ํŒŒ์ผ ๋‚ด๋ถ€์—์„œ๋„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<link rel="stylesheet" href="/static/CACHE/css/bfdeac875f7a.css" type="text/css" />

๊ทธ๋Ÿฌ๋‚˜ ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋  ๋•Œ runserver๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•ฉ๋‹ˆ๋‹ค.

[21/Dec/2012 22:28:44] "GET /static/CACHE/css/bfdeac875f7a.css HTTP/1.1" 404 276

๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ด๋ฏธ

  • 'django.core.context_processors.static', ์— TEMPLATE_CONTEXT_PROCESSORS
  • 'compressor.finders.CompressorFinder', ์— STATICFILES_FINDERS
  • 'compressor', ์„ INSTALLED_APPS

๊ฐ์‚ฌ ํ•ด์š”!

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

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋” ์ผ์ฐ ๋†“์ณค๋‹ค๋Š” ๊ฒƒ์ด ๋ฏฟ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. DEBUG๊ฐ€ _True_์ผ ๋•Œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ๋“  ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“ . DEBUG = False์ธ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ runserver๋Š” ์„ฑ๋Šฅ ๋ฐ ๋ณด์•ˆ ๋ฌธ์ œ๋กœ ์ธํ•ด ์ •์  ํŒŒ์ผ ์ž์ฒด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ”„๋กœ๋•์…˜์—์„œ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. DEBUG๊ฐ€ False์ผ ๋•Œ ๋กœ์ปฌ์—์„œ ์ •์  ํŒŒ์ผ์„ ์ ์ ˆํ•˜๊ฒŒ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด https://docs.djangoproject.com/en/1.4/ref/contrib/staticfiles/์— ์„ค๋ช…๋œ ๊ฒƒ์ฒ˜๋Ÿผ --insecure ํ”Œ๋ž˜๊ทธ๋ฅผ runserver์— ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๊นŒ?

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

์•ˆ๋…•ํ•˜์„ธ์š”,

๊ท€ํ•˜๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ๊ท€ํ•˜์˜ ์„ค์ •์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์กฐ๊ธˆ ๋” ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • COMPRESS_* ์„ค์ •, STATIC_URL ์„ค์ •, STATICFILES_* ์„ค์ •
  • INSTALLED_APPS์— ์ •์  ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
  • Django์˜ ๋ฒ„์ „์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
  • ๋‹ค๋ฅธ ์ •์  ํŒŒ์ผ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ๋‹น์‹ ์€ ๊ทธ๋“ค์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด runserver๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ์‚ฌ ํ•ด์š”

์•ˆ๋…•ํ•˜์„ธ์š”,

๋‹ค์Œ ์„ค์ •์œผ๋กœ Django 1.4.3์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

...

# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
STATIC_ROOT = os.path.join(PROJECT_DIR, "static_media")

# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/static/'

# Additional locations of static files
STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    os.path.join(PROJECT_DIR, "static"),
)

# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
#    'django.contrib.staticfiles.finders.DefaultStorageFinder',
    'compressor.finders.CompressorFinder',
)

COMPRESS_PRECOMPILERS = (
    ('text/coffeescript', 'coffee --compile --stdio'),
    ('text/x-scss', 'sass --scss {infile} {outfile}'),
)

...

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    ...
    'compressor',
    ...
)

...

static_media ์•ˆ์— ์ˆ˜๋™์œผ๋กœ ๋„ฃ์€ ํŒŒ์ผ์€ /static/ url์—์„œ๋„ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ staticfile์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ค‘์š”ํ•˜๋‹ค๋ฉด Django 1.3์—์„œ๋„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ฌด์—‡์„ ์‹œ๋„ํ•ด์•ผํ•˜๋Š”์ง€ ์˜ˆ๊ฐ์ด ์žˆ์œผ์‹ญ๋‹ˆ๊นŒ?

๋˜ํ•œ runserver๋Š” Debug๊ฐ€ true์ผ ๋•Œ ๋‚ด static_media ํด๋”์˜ ํŒŒ์ผ์„ ์„ฑ๊ณต์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค์ง€๋งŒ false์ผ ๋•Œ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค...

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋” ์ผ์ฐ ๋†“์ณค๋‹ค๋Š” ๊ฒƒ์ด ๋ฏฟ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. DEBUG๊ฐ€ _True_์ผ ๋•Œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ๋“  ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“ . DEBUG = False์ธ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ runserver๋Š” ์„ฑ๋Šฅ ๋ฐ ๋ณด์•ˆ ๋ฌธ์ œ๋กœ ์ธํ•ด ์ •์  ํŒŒ์ผ ์ž์ฒด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ”„๋กœ๋•์…˜์—์„œ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. DEBUG๊ฐ€ False์ผ ๋•Œ ๋กœ์ปฌ์—์„œ ์ •์  ํŒŒ์ผ์„ ์ ์ ˆํ•˜๊ฒŒ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด https://docs.djangoproject.com/en/1.4/ref/contrib/staticfiles/์— ์„ค๋ช…๋œ ๊ฒƒ์ฒ˜๋Ÿผ --insecure ํ”Œ๋ž˜๊ทธ๋ฅผ runserver์— ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๊นŒ?

์˜ค ์ด๋Ÿฐ, ๋‚ด ๋‚˜์œ. ์›๋ž˜ ์งˆ๋ฌธ์—์„œ ์‹ค์ˆ˜๋กœ "True"์™€ "False"๋ฅผ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค. ํ˜ผ๋ž€์„ ๋“œ๋ ค ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค!

๊ทธ๋ฆฌ๊ณ  ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค!

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