2 ๋ถ„ ์†Œ์š”

settings.py ํŒŒํ—ค์น˜๊ธฐ 1 - TEMPLATES

ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ์„ ์ฐพ๋Š” ๋ฐฉ์‹?

django์—์„œ templates ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ์ฐพ๊ณ , ๋ Œ๋”๋งํ•˜๋Š”์ง€ ๋™์ž‘ ๋ฐฉ์‹์„ ์ œ๋Œ€๋กœ ์•Œ๊ณ  ์žˆ๋‚˜?

์ผ๋‹จ ๋‚œ ์ž๋™์œผ๋กœ ์ฐพ์•„์ค€๋‹ค. ๋ผ๊ณ  ๋ฐ–์— ๋Œ€๋‹ต์„ ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

์ด์— ๋Œ€ํ•ด django ๊ณต์‹๋ฌธ์„œ ์™€ ChatGPT๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค.

๊ณต์‹ ๋ฌธ์„œ

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [],
        "APP_DIRS": True,
        "OPTIONS": {
            # ... some options here ...
        },
    },
]

๊ตฌ์„ฑ ์š”์†Œ

  1. BACKEND
    • Django์˜ ํ…œํ”Œ๋ฆฟ ๋ฐฑ์—”๋“œ API๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ…œํ”Œ๋ฆฟ ์—”์ง„ ํด๋ž˜์Šค๋กœ ๊ฐ€๋Š” ํŒŒ์ด์ฌ ๊ฒฝ๋กœ๋ฅผ ๋งํ•œ๋‹ค.
    • ๋‚ด์žฅ ๋ฐฑ์—”๋“œ๋กœ๋Š” ๋‹ค์Œ 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.
    • Django์—์„œ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด BACKEND ๋ฅผ ์™„์ „ํžˆ ์ •๊ทœํ™”๋œ ๊ฒฝ๋กœ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.
      • ์˜ˆ: โ€˜mypackage.whatever.Backendโ€™
  2. DIRS
    • ๊ธฐ๋ณธ ๊ฐ’: [] (๋นˆ ๋ชฉ๋ก)
    • ์—”์ง„์ด ํ…œํ”Œ๋ฆฟ ์†Œ์Šค ํŒŒ์ผ์„ ์ฐพ์•„์•ผ ํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ(๊ฒ€์ƒ‰ ์ˆœ์„œ)๋ฅผ ๋œปํ•œ๋‹ค.
  3. APP_DIRS
    • ๊ธฐ๋ณธ ๊ฐ’: False
    • ์—”์ง„์ด ์„ค์น˜๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€์—์„œ ํ…œํ”Œ๋ฆฟ ์†Œ์Šค ํŒŒ์ผ์„ ์ฐพ์•„์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
    • ํ•˜์ง€๋งŒ, django-admin startproject ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋งŒ๋“  django ํ”„๋กœ์ ํŠธ๋Š” ๊ธฐ๋ณธ ๊ฐ’์ด True ์ด๋‹ค.
  4. OPTIONS
    • ๊ธฐ๋ณธ ๊ฐ’: {} (๋นˆ ์‚ฌ์ „)
    • ํ…œํ”Œ๋ฆฟ ๋ฐฑ์—”๋“œ์— ์ „๋‹ฌํ•  ์ถ”๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜์ด๋‹ค.
    • ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ…œํ”Œ๋ฆฟ ์—”์ง„์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.
    • ๋‚ด์žฅ ํ…œํ”Œ๋ฆฟ ๋ฐฑ์—”๋“œ(์—”์ง„)์˜ ์˜ต์…˜์€ [DjangoTemplates](https://docs.djangoproject.com/en/5.1/topics/templates/#django.template.backends.django.DjangoTemplates) ์™€ Jinja2 ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ChatGPT์˜ ๋‹ต๋ณ€

# settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',  # ํ…œํ”Œ๋ฆฟ ์—”์ง„ ์ง€์ •
        'DIRS': [os.path.join(BASE_DIR, 'templates')],  # ํ…œํ”Œ๋ฆฟ ๋””๋ ‰ํ† ๋ฆฌ ์ง€์ •
        'APP_DIRS': True,  # ๊ฐ ์•ฑ์˜ 'templates' ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ํ…œํ”Œ๋ฆฟ์„ ์ž๋™์œผ๋กœ ์ฐพ์Œ
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

๊ตฌ์„ฑ ์š”์†Œ

  1. BACKEND
    • BACKEND ๋Š” Django์—์„œ ์‚ฌ์šฉํ•  ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์ง€์ •ํ•œ๋‹ค.
    • ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” 'django.template.backends.django.DjangoTemplates' ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ•„์š”์— ๋”ฐ๋ผ Jinja2 ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. DIRS
    • DIRS ๋Š” ํ…œํ”Œ๋ฆฟ์„ ์ฐพ์„ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ชฉ๋ก์„ ์ง€์ •ํ•œ๋‹ค.
    • ์ด ๋””๋ ‰ํ† ๋ฆฌ๋“ค์€ Django๊ฐ€ ํ…œํ”Œ๋ฆฟ์„ ๊ฒ€์ƒ‰ํ•  ๋•Œ ์šฐ์„ ์ ์œผ๋กœ ์ฐธ์กฐํ•œ๋‹ค.
    • DIRS ์— os.path.join(BASE_DIR, 'templates') ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด, Django๋Š” BASE_DIR/templates/ ๊ฒฝ๋กœ์—์„œ ํ…œํ”Œ๋ฆฟ์„ ์ฐพ๋Š”๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
  3. APP_DIRS
    • APP_DIRS = True ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉด, Django๋Š” ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋” ๋‚ด์˜ templates ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์ž๋™์œผ๋กœ ํ…œํ”Œ๋ฆฟ์„ ์ฐพ๋Š”๋‹ค.
    • ์ด ์„ค์ •์ด ํ™œ์„ฑํ™”๋˜๋ฉด DIRS ์— ๋ช…์‹œ๋œ ๋””๋ ‰ํ† ๋ฆฌ๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ๋‹ค.
  4. OPTIONS
    • OPTIONS ๋Š” ํ…œํ”Œ๋ฆฟ ์—”์ง„์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์„ค์ •์„ ์ •์˜ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.
    • 'contetxt_processors' , 'loaders' , 'string_if_invaild' , 'debug' ๋“ฑ๊ณผ ๊ฐ™์€ ์˜ต์…˜์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ํŠนํžˆ 'context_processors' ๋Š” ํ…œํ”Œ๋ฆฟ ๋ Œ๋”๋ง ์‹œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปจํ…์ŠคํŠธ์— ์ถ”๊ฐ€๋˜๋Š” ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด request ๊ฐ์ฒด๋‚˜ user ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ํ…œํ”Œ๋ฆฟ์— ์ถ”๊ฐ€ํ•˜๋Š” ์—ญํ• ์ด๋‹ค.

ํ…œํ”Œ๋ฆฟ ๋กœ๋”ฉ์˜ ๋™์ž‘ ๋ฐฉ์‹

  1. ํ…œํ”Œ๋ฆฟ ๊ฒฝ๋กœ ์„ค์ •
    • Django๋Š” ๋จผ์ € TEMPLATES ์„ค์ •์„ ์ฐพ๊ณ , ๊ทธ ์•ˆ์˜ DIRS ์— ์ •์˜๋œ ๋””๋ ‰ํ† ๋ฆฌ ๋ชฉ๋ก์—์„œ ํ…œํ”Œ๋ฆฟ์„ ์ฐพ๋Š”๋‹ค.
    • DIRS ์—์„œ ํ…œํ”Œ๋ฆฟ์„ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด, ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ templates ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ํ…œํ”Œ๋ฆฟ์„ ์ฐพ๋Š”๋‹ค. (APP_DIRS=True ์ธ ๊ฒฝ์šฐ)
  2. ํ…œํ”Œ๋ฆฟ ์—”์ง„ ์ฒ˜๋ฆฌ
    • ํ…œํ”Œ๋ฆฟ์„ ์ฐพ์•˜๋‹ค๋ฉด, Django๋Š” BACKEND ์— ์ •์˜๋œ ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ•ด ํ…œํ”Œ๋ฆฟ์„ ๋กœ๋”ฉ ๋ฐ ํŒŒ์‹ฑํ•œ๋‹ค.
    • ๋กœ๋”ฉ๋œ ํ…œํ”Œ๋ฆฟ์€ render ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ปจํ…์ŠคํŠธ์™€ ํ•จ๊ป˜ ๋ Œ๋”๋ง๋˜๋ฉฐ, ์ตœ์ข… HTML์ด ์ƒ์„ฑ๋œ๋‹ค.
  3. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
    • ์ง€์ •๋œ ๊ฒฝ๋กœ์—์„œ ํ…œํ”Œ๋ฆฟ์„ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด TemplateDoesNotExist ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ

Templates | Django documentation

ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ