들어가며
장고 개발 환경 세팅 : 처음에는 장고 환경 세팅도 시간을 퍽 많이 잡아먹는 것 같습니다… 때문에 장고로 개발하는 환경 세팅을 정리해보았습니다.
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_APPSdjango-dotenv 패키지 설치
pip install django-dotenvmanage.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-toolbarpip 설치 이후 추가 설정 필요
- 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)
