-
Notifications
You must be signed in to change notification settings - Fork 0
KR_Django
somaz edited this page Mar 6, 2025
·
5 revisions
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})# 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})# 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/'# 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'# 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)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_datafrom 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)- ORM 최적화
- 캐싱 전략
- 보안 설정
- 테스트 작성
- 성능 모니터링
- 배포 전략
- 로깅 설정
- 문서화