django rest framework
- 기존 django에서 확장된 기능들을 이용할 수 있음
- 대표적으로 drf에서 사용 가능 한 Serializer라는 것이 존재
- 실제로 django 백엔드 개발자를 채용 할 때 drf 경험을 보는 회사들이 많음
- drf 설치하기
pip install django
pip install djangorestframework
- http status code에 대한 이해
- 2xx : normal
- 3xx : redirect
- 4xx : client error
- 5xx : server error
- http method 종류
- get : 조회
- post : 생성
- put : 수정
- delete : 삭제
POST / PUT / DELETE 통신 시 csrf error가 발생 할 때
var xsrfCookie = postman.getResponseCookie("csrftoken");
postman.setGlobalVariable('csrftoken', xsrfCookie.value);
- Key :
X-CSRFToken
- Value :
{{csrftoken}}
queryset, object의 차이에 대한 이해
- object : 테이블에 입력 된 특정 레코드
- queryset : object의 집합 ex) `[object(1), object(2), object(3)]`
데이터 추가, 조회, 삭제, 수정하기
model = Model(
field1="value1",
field2="value2"
)
model.save()
Model.objects.create(
field1="value1",
field2="value2"
)
Model.objects.all()
Model.objects.filter()
Model.objects.get()
model = Model.object.get(id=obj_id)
model.field = value
model.save()
Model.objects.filter(field__contains=value).update(
field1="value1",
field2="value2"
)
Model.objects.filter(field="value").delete()
Model.objects.get(id=obj_id).delete()
자주 사용하는 패턴 모음
try:
Model.objects.get(id=obj_id)
except Model.DoesNotExist:
return Response("존재하지 않는 오브젝트입니다.")
Model.objects.all().order_by("join_date")
Model.objects.all().first()
object, created = Model.objects.get_or_create(
field1="value1",
field2="value2",
)
if created:
else:
ustom user 생성 및 사용자 로그인 구현
- 일반 user model은 필드가 고정되어 있어 커스텀이 어려움
- custom user model 생성 시 필드들을 자유롭게 커스텀 가능
models.py
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser
class UserManager(BaseUserManager):
def create_user(self, username, password=None):
if not username:
raise ValueError('Users must have an username')
user = self.model(
username=username,
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, username, password=None):
user = self.create_user(
username=username,
password=password
)
user.is_admin = True
user.save(using=self._db)
return user
class User(AbstractBaseUser):
username = models.CharField("사용자 계정", max_length=20, unique=True)
email = models.EmailField("이메일 주소", max_length=100)
password = models.CharField("비밀번호", max_length=128)
fullname = models.CharField("이름", max_length=20)
join_date = models.DateTimeField("가입일", auto_now_add=True)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = []
objects = UserManager()
def __str__(self):
return self.username
def has_perm(self, perm, obj=None):
return True
def has_module_perms(self, app_label):
return True
@property
def is_staff(self):
return self.is_admin
settings.py
AUTH_USER_MODEL = 'user.User'
views.py
from django.contrib.auth import login, authenticate
class UserApiView(APIView):
def post(self, request):
username = request.data.get('username', '')
password = request.data.get('password', '')
user = authenticate(request, username=username, password=password)
if not user:
return Response({"error": "존재하지 않는 계정이거나 패스워드가 일치하지 않습니다."}, status=status.HTTP_401_UNAUTHORIZED)
login(request, user)
return Response({"message": "로그인 성공!!"}, status=status.HTTP_200_OK)
settings.py 자주 사용하는 설정
debug = True / False
debug 모드 설정. static file 처리, allow host, 에러 페이지 등의 설정이 달라진다.
LANGUAGE_CODE = 'ko-kr'
: 언어 설정
TIME_ZONE = 'Asia/Seoul'
: Timezone 설정
DATABASES
: DB 설정
INSTALLED_APPS
: 사용할 앱 설정