장고는 오랜만이므로 DRF에 대한 복습 먼저
RESTful이란 Representational State Transfer의 줄임말로, HTTP의 URL과 method(GET< POST, PUT, DELETE)를 사용해 API 가독성을 높인 구조화된 시스템 아키텍처
# settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
]
}
각 요청에 따라 다른 인증 방식을 거치고 싶을 때는 특정 View 함수마다 다른 decorator를 활용할 수 있다.
@api_view(['GET'])
@authentication_classes([SessionAuthentication, BasicAuthentication])
@permission_classes([IsAuthenticated])
def example_view(request, format=None):
content = {
'user': str(request.user), # `django.contrib.auth.User` instance.
'auth': str(request.auth), # None
}
return Response(content)
settings.py에서 'DEFAULT_AUTHENTICATION_CLASSES' 정의할 때 TokenAuthentication를 사용할 것을 명시해야한다!
# settings.py
INSTALLED_APPS = [
...
'rest_framework.authtoken'
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
#...
]
}
settings.py를 수정한 후에 migrate
를 잊지 말고 실행할 것
from rest_framework.authtoken.models import Token
token = Token.objects.create(user=...)
print(token.key)
# views.py
def some_view_func(request):
token = Token.objects.create(user=...)
return Response({ 'token' : token.key })
Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b
HTTP 헤더키 앞에 문자열 리터럴 "Token"을 붙여야 하며 공백으로 두 문자열을 구분해야한다.