프로그래밍/Python

django에서 email 로그인 개발

이재만박사 2024. 2. 28. 15:35

1. 인증 담당 앱 생성

 

python manage.py startapp xauth

 

2. INSTALLED_APPS 에 xauth 등록

 

INSTALLED_APPS = [

    'django.contrib.admin',

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.messages',

    'django.contrib.staticfiles',

    'xauth'

]

 

3. xauth.models.py 에서 AbstractUser를 상속받아 XUser 생성

class XUser(AbstractUser):

  nation = models.CharField(max_length=50)

  USERNAME_FIELD = "email"

 

4. settings.py 에 AUTH_USER_MODEL 등록

AUTH_USER_MODEL = 'xauth.XUser'

5. xauth.admin.py 에서 Admin 에 XUser 등록

admin.site.register(XUser)

 

6. DB 테이블 생성

python manage.py makemigrations

 

python manage.py migrate

 

7. urls.py 에 auth 경로 작성

from django.contrib import admin

from django.urls import path, include


urlpatterns = [

    path('admin/', admin.site.urls),

    path('auth/', include('xauth.urls'))

]

 

8. xauth.urls.py 작성

urlpatterns = [

  path('login/', views.loginx, name="loginx"),

  path('logout/', views.logoutx, name="logoutx"),

  path('signup/', views.signupx, name="signupx")

]

 

9. 회원가입 코드 생성

def signupx(request):

  if request.method == "POST":

    username = request.POST['username']

    password = request.POST['password']

    email = request.POST['email']

    nation = request.POST['nation']


    user = User.objects.create_user(username, email, password)

    user.nation= nation

    user.save()

    return redirect('users:login')

10. login 코드 생성

def loginx(request):

  if request.method == "POST":

    post = request.POST

    email = post['email']

    password = post['password']

    user = authenticate(username=email, password=password)

    if user is not None: # login success

      res = login(request, user)

      print(f'res : {res}')

      print('auth success~!')

    else:

      print('auth failed~!')

 

11. logout 코드 생성

def logoutx(request):

  logout(request)

  return redirect('users:login')

12. 버그 수정

XUser 에서 email로 로그인을 하기 위해

 

USERNAME_FIELD 를 설정하면 버그 발생한다

 

AbstractUser 에서 변경해야 함

 

1. email 항목 unique 추가

email = models.EmailField(_("email address"), unique=True, blank=True)

 

2. REQUIRED_FILEDS 에서 email 삭제

#REQUIRED_FIELDS = ["email"]

 

3. createsuperuser 실행할 때 버그 수정

 

AbstractUser 클래스에서

REQUIRED_FIELDS = ["username"]

항목 추가

 

12. 로그인 로그아웃 테스트