장고 DRF에서 회원가입, 로그인 기능을 제공해주는 라이브러리는 django-rest-auth
이다.
이번 장에서는 django-rest-auth
를 이용해서 로그인과 회원가입 기능을 구현하는 과정을 살펴보도록 하겠다.
pip install django-rest-auth
우선, Session Authentication과 Token Authentication 이용을 위해서 관련 내용을 추가해 준다.
이와 관련해 보다 심층적인 내용은 DRF Authentication 공식문서 링크를 참고하면 된다.
[settings.py]
INSTALLED_APPS = [
'rest_framework.authtoken' # authtoken 추가
'rest_auth', # rest_auth 추가
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
]
}
urlpatterns = [
path('api-auth/', include("rest_framework.urls")),
path('api/rest-auth/', include("rest_auth.urls")),
]
auth, authtoken 등 관련 모델 생성을 위해 migrate을 해 준다.
> python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, authtoken, contenttypes, profiles, sessions
Running migrations:
Applying authtoken.0001_initial... OK
Applying authtoken.0002_auto_20160226_1747... OK
이제 어드민에 가 보면 token을 추가할 수 있게 된 것 확인할 수 있다.
api 폴더를 생성해서 serializers.py, urls.py, views.py을 아래와 같이 작성한다.
[serializers.py]
from rest_framework import serializers
from profiles.models import Profile, ProfileStatus
class ProfileSerialzier(serializers.ModelSerializer):
user = serializers.StringRelatedField(read_only=True)
avatar = serializers.ImageField(read_only=True)
class Meta:
model = Profile
fields = "__all__"
class ProfileAvatarSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
fields = ("avatar", )
class ProfileStatusSerializer(serializers.ModelSerializer):
user_profile = serializers.StringRelatedField(read_only=True)
class Meta:
model = Profile
fields = "__all__"
[urls.py]
from django.urls import path
from profiles.api.views import ProfileList
urlpatterns = [
path('profiles/', ProfileList.as_view(), name='profile-list')
]
[views.py]
from rest_framework import generics
from rest_framework.permissions import IsAuthenticated
from profiles.models import Profile
from profiles.api.serializers import ProfileStatusSerializer
class ProfileList(generics.ListAPIView):
queryset = Profile.objects.all()
serializer_class = ProfileStatusSerializer
permission_classes = [IsAuthenticated]
프로젝트 내에 clients 폴더 생성 후 token-auth-test1.py를 아래와 같이 작성한다.
import requests
import json
def client():
# credentials = {"username": "admin", "password" : "50rh1754"}
# response = requests.post("http://127.0.0.1:8000/api/rest-auth/login/", data=credentials)
token_h = "Token 01626436a54d04a37d1eb51ad54bbf0a20f58c98"
headers = {"Authorization": token_h}
response = requests.get("http://127.0.0.1:8000/api/profiles", headers=headers)
print("Status Code:", response.status_code)
response_data = response.json()
print(response_data)
if __name__ == "__main__":
client()
[테스트 진행]
--
pip install django-allauth
INSTALLED_APPS = [
# 아래 코드 추가
'django.contrib.sites',
'allauth',
'allauth.account',
'allauth.socialaccount'
'rest_auth.registration',
]
...
SITE_ID = 1
ACCOUNT_EMAIL_VERIFICATION = "none"
ACCOUNT_EMAIL_REQUIRED = (True)
> python manage.py migrate
Operations to perform:
Apply all migrations: account, admin, auth, authtoken, contenttypes, profiles, sessions, sites, socialaccount
Running migrations:
Applying account.0001_initial... OK
Applying account.0002_email_max_length... OK
Applying sites.0001_initial... OK
Applying sites.0002_alter_domain_unique... OK
Applying socialaccount.0001_initial... OK
Applying socialaccount.0002_token_max_lengths... OK
Applying socialaccount.0003_extra_data_default_dict... OK
urlpatterns = [
# 아래 코드 추가
path('api/rest-auth/registration/', include("rest_auth.registration.urls"))
]
from django.conf.urls.static import static
from django.conf import settings
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
프로젝트 내에 clients 폴더 내에 token-auth-test2.py를 아래와 같이 작성한다.
import requests
import json
def client():
#import pdb; pdb.set_trace()
# data = {
# "username": "resttest",
# "email" : "test@test.com",
# "password1" : "changeme123",
# "password2" : "changeme123"
# }
# response = requests.post("http://127.0.0.1:8000/api/rest-auth/registration/", data=data)
token_h = "Token 51427559d3e6f00df8ea09a75f7f38b84256761e"
headers = {"Authorization": token_h}
response = requests.get("http://127.0.0.1:8000/api/profiles/", headers=headers)
print("Status Code:", response.status_code)
response_data = response.json()
print(response_data)
if __name__ == "__main__":
client()
[테스트 진행]