장고 개발 환경 세팅

들어가며

장고 개발 환경 세팅 : 처음에는 장고 환경 세팅도 시간을 퍽 많이 잡아먹는 것 같습니다… 때문에 장고로 개발하는 환경 세팅을 정리해보았습니다.

App 추가

settings의 INSTALLED_APPS는 startapp으로 먼저 필요한 app을 추가해준 다음에 적어줘야 ModuleNotFoundError가 뜨지 않습니다.

python manage.py startapp accounts
python manage.py startapp products
python manage.py startapp profiles
...

장고 settings.py 설정

환경 변수 미사용

# Application definition

CUSTOM_APPS = [
    'articles',
    'users',
]
SYSTEM_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_extensions',
    'rest_framework',
]

INSTALLED_APPS = CUSTOM_APPS + SYSTEM_APPS


# static
STATIC_URL = 'static/'
STATICFILES_DIRS = [BASE_DIR / "static"]  
STATIC_ROOT = BASE_DIR / "staticfiles"

# Media files
MEDIA_URL = "/media/"
MEDIA_ROOT = BASE_DIR / "media"

환경 변수 사용 (.env)

  • 환경변수를 사용해서 settings.py를 설정해주기 위해서는 프로젝트 디렉토리 하위에 .env 파일 생성 후 아래 코드 입력
  • django_extensions, django_seed, DRF 등 앱을 추가로 설치해서 사용하는 경우, 해당 추가 app들 SYSTEM_APPS에 추가
SECRET_KEY = ''
CUSTOM_APPS = 'accounts'
SYSTEM_APPS = 'django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib.sessions,django.contrib.messages,django.contrib.staticfiles,django_extensions,django_seed,rest_framework'
  • settings.py에 os.environ.get() 으로 환경변수 값 가져옴
SECRET_KEY = os.environ.get('SECRET_KEY')
CUSTOM_APPS = os.environ.get('CUSTOM_APPS').split(',')
SYSTEM_APPS = os.environ.get('SYSTEM_APPS').split(',')

INSTALLED_APPS = SYSTEM_APPS + CUSTOM_APPS

django-dotenv 패키지 설치

pip install django-dotenv

manage.py 하단에 다음 코드 추가

import dotenv

if __name__ == '__main__':
    dotenv.read_dotenv()
    main()
자세한 환경 변수 설정법

django 관련 패키지 설치

django shell 관련

pip install ipython
pip install django-extensions

이미지 관련

pip install pillow

모델 관련

pip 설치 후, INSTALLED_APPS에 ‘django_seed’ 추가해야 함

pip install django-seed

디버그 관련

pip install django-debug-toolbar

pip 설치 이후 추가 설정 필요

  • INSTALLED_APPS 에 ‘debug_toolbar’를 추가
  • MIDDLEWARE 에 ‘debug_toolbar.middleware.DebugToolbarMiddleware’를 추가
  • INTERNAL_IPS = (‘127.0.0.1’,)를 추가
  • urls.py에 아래 코드 추가
from django.conf.urls import url, include
 
if settings.DEBUG:
    import debug_toolbar
    urlpatterns += [
        url(r'^__debug__/', include(debug_toolbar.urls)),
]

DRF 관련

pip install djangorestframework
  • INSTALLED_APPS에 ‘rest_framework’ 추가

Template 관련

DIRS 수정

MVT 패턴으로 개발하는 경우, 각 app마다 template 디렉토리 뒤지도록 settings에 'DIRS': [os.path.join(BASE_DIR, 'templates')] 수정

settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        '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',
            ],
        },
    },
]

기본 Template 구조

base.html

<!DOCTYPE html>
<html lang="ko">
{% include 'head.html' %}
<body>
    {% include 'header.html' %}

    {% block content %}
    {% endblock %}

    {% include 'footer.html' %}
</body>
</html>

index.html

{% extends 'base.html' %}

{% block content %}
<div style="height: 40rem; background-color: #EADBC8; border-radius: 1rem; margin: 2rem">
    <h1>첫 페이지 시작</h1>
</div>

{% endblock %}

head에 필요한 CDN 추가

head.html

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>SpartaMarket</title>
    {% load static %}
    <link
    href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css"
    rel="stylesheet"
    integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH"
    crossorigin="anonymous"
  />

  <!-- GOOGLE FONT LINK -->
  <link rel="preconnect" href="https://fonts.googleapis.com" />
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
  <link
    href="https://fonts.googleapis.com/css2?family=Workbench&display=swap"
    rel="stylesheet"
  />

  <!-- daisyUI -->
  <link href="https://cdn.jsdelivr.net/npm/daisyui@4.10.2/dist/full.min.css" rel="stylesheet" type="text/css" />
<script src="https://cdn.tailwindcss.com"></script>

  <!-- DEFAULT CSS LINK -->
  <link rel="stylesheet" type="text/css" href="{% static 'css/base.css' %}">
</head>

media

개발 모드일 때 settings.py에서 우리가 지정한 경로로 media를 찾을 수 있게 아래 코드를 작성해 줍니다.

urls.py

from django.conf import settings
from django.conf.urls.static import static

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL,
                          document_root=settings.MEDIA_ROOT)

이미지 파일을 전송 받는 form의 경우 enctype="multipart/form-data" 속성을 추가

template

<form action="{% url 'articles:create' %}" method="POST" enctype="multipart/form-data">

### pip install 모음

모델 관련

필요한 import

  • settings는 user 모델을 연관 시킬 때 사용 (아래 예시)
  • user = models.ForeignKey(settings.AUTH_USER_MODEL,  on_delete=models.CASCADE, related_name="user")
from django.db import models
from django.conf import settings

관리자 생성

python manage.py createsuperuser # 슈퍼유저 생성

Auth 관련

로그인

views.py

python
from django.shortcuts import render, redirect
from django.contrib.auth import login as auth_login
from django.contrib.auth import logout as auth_logout
from django.contrib.auth.forms import AuthenticationForm
from django.views.decorators.http import require_POST, require_GET, require_http_methods
from django.contrib.auth.decorators import login_required
from django.contrib.auth.forms import UserCreationForm

@require_http_methods(['GET', 'POST'])
def login(request):
    if request.method == "POST":
        form = AuthenticationForm(data=request.POST)
        if form.is_valid():
            auth_login(request, form.get_user())
            return redirect("articles:articles")
    else:
        form = AuthenticationForm()
    context = {"form": form}
    return render(request, "accounts/login.html", context)

@require_POST
def logout(request):
    auth_logout(request)
    return redirect("articles:index")

로그인 여부에 따라 template 표기

template

html
{% if request.user.is_authenticated %}

{% else %}

{% endif %}

```

사용자 여부에 따라 template 표기

요청한 사용자와 모델 데이터에서 가져온 사용자가 동일한지 확인

{% if request.user == objs.user %}

참고하면 좋은 글

Django settings | Django documentation | Django (djangoproject.com)

Leave a Comment

목차