Skip to content

KR_Django

somaz edited this page Mar 6, 2025 · 5 revisions

파이썬 Django

1. Django 기초

Django는 파이썬의 대표적인 웹 프레임워크입니다.

# 프로젝트 생성
django-admin startproject myproject

# 앱 생성
python manage.py startapp myapp

# models.py
from django.db import models

class User(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField(unique=True)
    created_at = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return self.name

# views.py
from django.shortcuts import render
from .models import User

def user_list(request):
    users = User.objects.all()
    return render(request, 'users/list.html', {'users': users})

2. URL 패턴과 뷰

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('users/', views.user_list, name='user_list'),
    path('users/<int:pk>/', views.user_detail, name='user_detail'),
    path('users/create/', views.user_create, name='user_create'),
]

# views.py
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponseRedirect
from .models import User
from .forms import UserForm

def user_detail(request, pk):
    user = get_object_or_404(User, pk=pk)
    return render(request, 'users/detail.html', {'user': user})

def user_create(request):
    if request.method == 'POST':
        form = UserForm(request.POST)
        if form.is_valid():
            user = form.save()
            return HttpResponseRedirect('/users/')
    else:
        form = UserForm()
    return render(request, 'users/create.html', {'form': form})

3. 폼과 모델 폼

# forms.py
from django import forms
from .models import User

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['name', 'email']
    
    def clean_email(self):
        email = self.cleaned_data['email']
        if User.objects.filter(email=email).exists():
            raise forms.ValidationError('이미 사용 중인 이메일입니다.')
        return email

# views.py
from django.views.generic.edit import CreateView, UpdateView
from .models import User
from .forms import UserForm

class UserCreateView(CreateView):
    model = User
    form_class = UserForm
    template_name = 'users/create.html'
    success_url = '/users/'

4. 인증과 권한

# settings.py
AUTH_USER_MODEL = 'myapp.CustomUser'

# models.py
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    phone = models.CharField(max_length=15, blank=True)
    
    def has_perm(self, perm, obj=None):
        return True

# views.py
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin

@login_required
def profile(request):
    return render(request, 'users/profile.html')

class SecureView(LoginRequiredMixin, View):
    login_url = '/login/'
    redirect_field_name = 'next'

5. 미들웨어와 시그널

# middleware.py
from django.utils.deprecation import MiddlewareMixin

class CustomMiddleware(MiddlewareMixin):
    def process_request(self, request):
        request.custom_data = "추가 데이터"
    
    def process_response(self, request, response):
        return response

# signals.py
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import User

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

6. 실용적인 예제

REST API 구현

from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticated
from .models import User
from .serializers import UserSerializer

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = [IsAuthenticated]
    
    def get_queryset(self):
        queryset = User.objects.all()
        name = self.request.query_params.get('name', None)
        if name is not None:
            queryset = queryset.filter(name__icontains=name)
        return queryset

# serializers.py
from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'name', 'email', 'created_at']

캐시 구현

from django.core.cache import cache
from django.views.decorators.cache import cache_page

@cache_page(60 * 15)  # 15분 캐시
def cached_view(request):
    return render(request, 'cached_template.html')

def get_user_data(user_id):
    cache_key = f'user_data_{user_id}'
    user_data = cache.get(cache_key)
    
    if user_data is None:
        user_data = User.objects.get(id=user_id)
        cache.set(cache_key, user_data, timeout=300)  # 5분
    
    return user_data

비동기 작업

from celery import shared_task
from django.core.mail import send_mail

@shared_task
def send_notification_email(user_id):
    user = User.objects.get(id=user_id)
    send_mail(
        '알림',
        '새로운 알림이 있습니다.',
        'from@example.com',
        [user.email],
        fail_silently=False,
    )

# views.py
def create_user(request):
    if request.method == 'POST':
        form = UserForm(request.POST)
        if form.is_valid():
            user = form.save()
            send_notification_email.delay(user.id)
            return redirect('user_list')

커스텀 관리자 페이지

from django.contrib import admin
from .models import User

@admin.register(User)
class UserAdmin(admin.ModelAdmin):
    list_display = ['name', 'email', 'created_at']
    list_filter = ['created_at']
    search_fields = ['name', 'email']
    ordering = ['-created_at']
    
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(created_by=request.user)

7. 주요 팁

  • ORM 최적화
  • 캐싱 전략
  • 보안 설정
  • 테스트 작성
  • 성능 모니터링
  • 배포 전략
  • 로깅 설정
  • 문서화

Clone this wiki locally