장고 allauth 유저모델
django-allauth, django.contrib.auth
django.contrib.auth는 유저 기능을 구현하는데 쓰이는 장고에 포함된 앱이다.
django-allauth는 유저 기능을 위한 패키지다.
django-allauth는 django.contrib.auth에 포함되어 있는 유저모델(models)이 없기 때문에 유저모델은 django.contrib.auth를 사용하고 나머지 유저의 기능은 django-allauth를 사용한다.
django-allauth
django.contrib.auth
유저모델
유저 모델 정의
# models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
작성 후에 settings.py가장 아래에 AUTH_USER_MODEL = ‘[앱이름].[클래스이름]’ 을 작성한다.
그리고 makemigrations와 migrate를 반드시 해줘야한다.
그러지 않으면 나중에 꼬여서 에러가 나게 된다.
어드민 페이지 등록
# admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
admin.site.register(User, UserAdmin)
UserAdmin클래스는 유저 모델에 대해서 특별한 인터페이스를 제공한다.
allauth 셋업
따라서 작성해 주면 된다.
django.contrib.sites는 어떤 기능을 여러 웹사이트에서 사용할 수 있게 해준다. 장고 프로젝트 하나로 여러 웹사이트를 운영할 수 있다.
SITE_ID는 각각의 사이트의 ID다.
urls.py에서는 accounts/login/이 아닌 login/을 사용할 것이니
apath(‘’, include(‘allauth.urls’)), 이렇게 작성해준다.
그리고 settings.py에서 인증이메일을 콘솔로 받기 위해서
EMAIL_BACKEND = ‘django.core.mail.backends.console.EmailBackend’
를 추가한다.
migrate를 해주고
127.0.0.1:8000/login
으로 접속하면 로그인 페이지가 나온다.
만약 404에러가 난다면 /admin에서 로그아웃을 하고 다시 시도하면 된다.
홈페이지 만들기
index.html을 만들고 url을 연결시킨다.
{% if user.is_authenticated %}
<a href="{% url 'account_logout' %}">로그아웃</a>
{% else %}
<a href="{% url 'account_login' %}">로그인</a>
<a href="{% url 'account_signup' %}">회원가입</a>
{% endif %}
<h1>홈페이지</h1>
{% if user.is_authenticated %}
<p>안녕하세요, {{user}}님!</p>
{% else %}
<p>로그아웃된 상태입니다.</p>
{% endif %}
뷰에서 작성할 때는 request.user로 접근하지만
템플릿에서는 user로 접근할 수 있다.
유저 모델의 __str__은 username필드를 리턴한다.
그래서 템플릿에 {{user}} 라고 쓰면 유저네임으로 바뀐다.
user.is_authenticated로 로그인 여부를 확인할 수 있다.
url네임은 여기서 확인하면 된다.
settings.py에서 아래의 내용들을 추가한다.
-
ACCOUNT_SIGNUP_REDIRECT_URL = ‘index’
회원가입시 index로 리디렉트 시킨다. -
LOGIN_REDIRECT_URL = ‘index’
로그인시 index로 리디렉트 시킨다. -
ACCOUNT_LOGOUT_ON_GET = True
로그아웃시 다시 묻지 않고 바로 로그아웃 시킨다.
이메일로 로그인
settings.py에서
ACCOUNT_AUTHENTICATION_METHOD = ‘email’
를 작성하면 이메일로 로그인하게 바뀐다.
이메일과 아이디 두개다 사용하려면 “username_email”을 쓰면 된다.
이메일로 로그인을 하려면 회원가입시 이메일작성을 필수로 설정해야 한다.
ACCOUNT_EMAIL_REQUIRED = True
이메일이 필수항목이 된다.
ACCOUNT_USERNAME_REQUIRED = False
아이디가 필수항목이 아니게 된다.
유저네임을 입력받지 않는 것이지 유저모델에 유저네임필드를 없애는 것은 아니다.
그래서 보통 이메일의 ‘@’앞부분을 유저네임으로 지정한다.
중복이 있다면 랜덤한 숫자를 뒤에 붙이게 된다.
class User(AbstractUser):
def __str__(self):
return self.email
유저네임을 사용하지 않으니 models.py에서 이렇게 이메일로 바꿔주면 된다.
로그인 유지
ACCOUNT_SESSION_REMEMBER = True
로그인시 로그인유지를 선택하지 않아도 자동 유지된다.
SESSION_COOKIE_AGE = 3600
세션 쿠키 유지 시간을 설정한다
초 단위로 설정하고 기본 세팅은 2주다.
세션 쿠키가 영원하게 설정할 수는 없다.
쿠키
유저가 인증을 하면 서버가 세션을 만들고 세션 아이디를 브라우저에 전달한다.
그리고 브라우저는 그걸 받아서 웹사이트에 쿠키에 저장한다.
그 후 브라우저가 서버로 요청할 때 쿠키도 같이 보내게 된다.
그러면 서버는 쿠키의 세션아이디를 보고 로그인 유무를 알 수 있다.
세션 쿠키가 삭제되면 로그아웃 상태가 된다.
유저가 로그아웃을 직접하면 쿠키와 서버의 세션 데이터도 함께 삭제된다.
하지만 유효기간이 지나 쿠키가 만료되면 세션 데이터는 서버에 그대로 남게된다.
그래서 만료된 세션 데이터를 주기적으로 지워줘야 한다.
python manage.py clearsessions 를 쓰면 된다.
필드 추가
class User(AbstractUser):
nickname = models.CharField(max_length=15, unique=True, null=True)
def __str__(self):
return self.email
models에 필드 추가
allauth는 기본 정보(이메일, 비밀번호)가 채워진 오브젝트를 저장하고, 추가 정보를 저장하기 때문에 추가 필드에는 null=True 옵션을 줘야한다.
그리고 makemigrations와 migrate를 한다.
어드민 페이지에서 추가한 필드를 나타내려면
admin.py에서
UserAdmin.fieldsets += ((“Custom fields”, {“fields”: (“nickname”,)}),)
를 추가한다.
어드민 페이지에서 기존에 저장된 데이터들에 추가된 필드 내용을 작성한다.
회원가입시에 추가한 필드를 나타내려면
forms.py에서
from django import forms
from .models import User
class SignupForm(forms.ModelForm):
class Meta:
model = User
fields = ["nickname"]
def signup(self, request, user):
user.nickname = self.cleaned_data["nickname"]
user.save()
이렇게 폼을 작성해준다.
작성한 폼을 사용하려면
settings.py에서
ACCOUNT_SIGNUP_FORM_CLASS = ‘[앱이름].forms.[폼 클래스 이름]’
이렇게 작성해 준다.
회원가입 정보 유효성 검사
settings.py에서
LANGUAGE_CODE = ‘ko’
한국어로 설정을 변경한다.
class User(AbstractUser):
nickname = models.CharField(
max_length=15,
unique=True,
null=True,
validators = [validate_no_special_characters],
error_messages={'unique': '이미 사용중인 닉네임입니다.'},
)
def __str__(self):
return self.email
models.py에 validators.py에서 작성한 예외처리를 가져온다.
error_messages옵션에 오류코드(unique)가 발생하면 작성한 에러메세지가 출력된다.
그리고 비밀번호 예외처리를 바꾸려면 settings.py에서
AUTH_PASSWORD_VALIDATORS = [
{
"NAME": "coplate.validators.CustomPasswordValidator",
},
]
이렇게 적용시킨다.
회원가입시 폼 오류가 나도 비밀번호가 지워지지 않게 하려면 settings.py에서
ACCOUNT_PASSWORD_INPUT_RENDER_VALUE = True
이렇게 작성한다.
이메일 인증
settings.py에서
ACCOUNT_EMAIL_VARIFICATION = “mandatory”
mandatory 옵션은 이메일 인증을 할 때 까지 로그인을 할 수 없다.
optional 옵션은 인증 메일이 발송되지만 이메일 인증을 하지 않아도 로그인을 할 수 있다.
none 옵션은 이메일 인증이 필요없고 인증 메일이 발송되지 않는다.
optional이 기본값이다.
ACCOUNT_CONFIRM_EMAIL_ON_GET = True
인증 메일에서 링크를 눌렀을 때 바로 인증이 되게 한다.
링크로 들어갔을 때 인증이 완료되었다는 페이지와 메인으로 가는 링크를 띄워 줄려면
from django.views.generic import TemplateView
path('email-confirmation-done/',
TemplateView.as_view(template_name="coplate/email_confirmation_done.html"),
name='account_email_confirmation_done'),
urls.py에서 path를 추가해 준다.
인증 메일에서 링크로 접속하면 email-confirmation-done/으로 들어온다.
제네릭을 사용하면 뷰에서 생성하지 않고 이렇게 바로 작성 후 사용이 가능하다.
이메일 인증이 완료되었습니다.
{% if user.is_authenticated %}
<a href="{% url 'index' %}">홈으로 이동</a>
{% else %}
<a href="{% url 'account-login' %}">로그인 하기</a>
{% endif %}
그리고 연결된 템플릿을 작성한다.
# 인증 성공시 연결할 url
ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL = "account_email_confirmation_done"
# 인증 실패시 연결할 url
ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL = "account_email_confirmation_done"
settings.py에서 위의 내용을 추가해서 urls에서 작성한 url로 연결되게 한다.
비밀번호 관리
settings.py에
PASSWORD_RESET_TIMOUT = 3
를 하면 리셋링크 유효기간을 초 단위로 설정할 수 있다.
기본설정은 3일 이다.
템플릿에서 비밀번호 변경 링크는 ‘account_change_password’이다.
allauth의 PasswordChangeView는 비밀번호 변경 후 그 페이지에 그대로 머무르게 되어있다.
비밀번호 변경 후에는 리디렉션 해주는게 좋기 때문에 PasswordChangeView를 상속받아 오버라이드 한다.
그러기 위해선 이렇게 한다.
# views.py
from allauth.account.views import PasswordChangeView
class CustomPasswordChangeView(PasswordChangeView):
def get_success_url(self):
return reverse('index')
이렇게 성공했을 경우에 ‘index’로 넘기게 오버라이드 한다.
그리고 urls.py에서
# urls.py
from coplate.views import CustomPasswordChangeView
urlpatterns = [
...
path(
'password/change/',
CustomPasswordChangeView.as_view(), name="account_change_password"
),
path('', include('allauth.urls')),
]
이렇게 연결해 준다.
allauth의 PasswordChangeView대신 오버라이드한 것으로 사용할 것이다.
그러기 위해선 allauth의 urls에도 password/change/가 있기 때문에 이것보다 더 앞에 작성해준다.
allauth url과 세팅
allauth 세팅들
모든 세팅은 settings.py에 작성한다.
allauth전용 세팅은 모두 ACCOUNT로 시작한다.
Leave a comment