[모각코][210825] Django allauth와 contrib.auth를 이용하여 User model 구현하기

Jinhyung Rhee·2021년 8월 25일
1
post-thumbnail

본 포스트는 코드잇 'Django 웹 개발' 강의 일부를 정리▪요약한 내용입니다

django-allauth vs django.contrib.auth

django.contrib.auth

  • 유저 기능을 구현하는데 쓰이는 장고에 포함된 앱

  • contrib = contributed(기여하다)

    • 사람들이 빠르고 간편하게 웹 개발을 하도록 이미 완성된 장고 앱
    • 장고 프레임워크에 기여된 앱들
      • django.contrib.admin : 관리자 기능 제공
      • django.contrib.staticfiles : css같은 정적 파일을 다룰 때 사용
    • 장고 프로젝트 생성 시 여러 contrib앱들이 자동으로 생성됨
  • auth = authentication(유저인증)

  • django 앱 구성

    • models
    • urls
    • views
    • forms 등
  • django.contrib.auth도 동일함

    • User model (models)
    • /login/logout (urls) : url 패턴 정의
    • login logic(views, forms) : login logic 처리
  • django.contrib.auth 대신 django-allauth 사용!

    • django-allauth : 유저 기능을 위한 패키지
    • 기본적으로 설치되어 있지 않기 때문에 따로 설치해줘야 함

django-allauth

  • 유저기능에 필요한 url, view, form등이 포함되어 있지만 User model은 포함되어 있지 않기 때문에 django.contrib.auth의 User model 사용
  • 모델은 django.contrib.auth 사용, 기능은 django-allauth 사용!
  • 실제 존재하는 이메일인지 확인하는 이메일 인증 기능 제공
  • 소셜 서비스를 이용해서 로그인 하는 소셜 로그인 기능 제공
  • 유저 기능이 이미 다 완성되어 있어서 짧은 코드 몇 줄로 우리가 원하는 설정만 해주면 됨(contrib.auth는 필요한 부분 직접 구현해야 함)

User model

  • django.contrib.auth는 User model 제공
    • 기본 유저 모델 : User
      • 권장 X
      • 유저 모델을 한 번 정의하면 다른 모델로 바꾸기 매우 어려움!
      • 현재 추가 필드가 필요 없다고 하더라도 처음부터 AbstractUser 모델을 사용하고 클래스를 비워놓는 것이 더 바람직
    • 상속 받아서 쓸 수 있는 유저 모델 : AbstractUser
      • 우리가 원하는 필드를 추가해서 사용 가능
      • 기본 필드와 메서드들이 다 정의되어 있음
        • username : 로그인 시 사용되는 login ID
        • password
        • first_name
        • last_name
        • email
        • date_joined
        • last_login
      • '닉네임' 같은 필요한 필드를 그냥 추가적으로 정의해서 사용하면 됨(nickname = models.CharField(..))
    • 상속 받아서 쓸 수 있는 유저 모델 : AbstractBaseUser
      • AbstractBaseUser를 상속받아서 커스터마이징
      • User를 만들기 위한 틀만 제공하며 User에게 필요한 모든 필드를 직접 정의해줘야 함 (말 그대로 Base임)
      • 기본적으로 제공되는 필드 대신 모두 커스터마이즈하여 필드를 사용하고 싶다면 AbstractBaseUser 사용

코드로 확인

  • User 모델 정의(생성)

    • AbstractUser import

    • coplate/models.py

      from django.db import models
      # AbstractUser 사용
      from django.contrib.auth.models import AbstractUser
      
      # Create your models here.
      # AbstractUser 상속받는 유저 클래스 생성 - 일단 틀만 생성(pass)
      class User(AbstractUser):
          pass
  • User 모델 정의(등록) 후 AUTH_USER_MODEL 설정하기 (중요!)

    • coplate app에 있는 User모델을 이번 프로젝트 내에서 user모델로 사용하겠다는 의미
    • 마이그레이션 시 우리의 커스텀 유저 모델을 참조해서 테이블을 만들어주고 allauth가 커스텀 유저모델을 사용함
    • coplate_project/settings.py
      # ... 생략
      # 맨 아래에 추가
      AUTH_USER_MODEL = "coplate.User"
  • User모델이 변경되었으므로 migration 해줌

    • User모델 생성 후 AUTH_USER_MODEL 설정 후 첫 migration 해주기!
      • 그렇지 않으면 user 테이블에 대한 migration이 서로 꼬여서 고치기 힘든 오류들이 발생
    • python manage.py makemigrations
      • 결과
        Migrations for 'coplate':
        coplate\migrations\0001_initial.py
            - Create model User
    • python manage.py migrate
      • 결과
        Operations to perform:
        Apply all migrations: admin, auth, contenttypes, coplate, sessions
        Running migrations:
        Applying contenttypes.0001_initial... OK
        Applying contenttypes.0002_remove_content_type_name... OK
        Applying auth.0001_initial... OK
        Applying auth.0002_alter_permission_name_max_length... OK
        Applying auth.0003_alter_user_email_max_length... OK
        Applying auth.0004_alter_user_username_opts... OK
        Applying auth.0005_alter_user_last_login_null... OK
        Applying auth.0006_require_contenttypes_0002... OK
        Applying auth.0007_alter_validators_add_error_messages... OK
        Applying auth.0008_alter_user_username_max_length... OK
        Applying auth.0009_alter_user_last_name_max_length... OK
        Applying auth.0010_alter_group_name_max_length... OK
        Applying auth.0011_update_proxy_permissions... OK
        Applying coplate.0001_initial... OK
        Applying admin.0001_initial... OK
        Applying admin.0002_logentry_remove_auto_add... OK
        Applying admin.0003_logentry_add_action_flag_choices... OK
        Applying sessions.0001_initial... OK
  • User model을 admin 페이지에 등록

    • coplate/admin.py

      from django.contrib import admin
      from django.contrib.auth.admin import UserAdmin
      from .models import User
      
      # Register your models here.
      # User모델은 User admin을 같이 등록해줘야 함!
      # UserAdmin 클래스는 User모델에 대해서 특별한 인터페이스 제공
      admin.site.register(User, UserAdmin)
    • User모델은 UserAdmin을 같이 등록해줘야 함!

    • UserAdmin 클래스는 User모델에 대해서 특별한 인터페이스 제공

      • User model은 Admin 페이지에서 중요한 역할을 함!
  • superuser 생성하여 admin 페이지에 접속하기

    • python manage.py createsuperuser
    • superuser도 우리가 models.py에서 정의한 User 모델의 하나의 인스턴스임
    • admin 페이지 접속 가능하며 모든 모델에 대한 생성/조회/수정/삭제의 권한이 있음

django allauth 설치하기

  1. pip install

    • pip install django-allauth
  2. settings.py에 여러 가지 setting 추가하기

    • AUTHENTICATION_BACKENDS 부분 추가
      • 유저 인증 로직을 담당하는 컴포넌트
      • 'django.contrib.auth.backends.ModelBackend', 추가
      • 'allauth.account.auth_backends.AuthenticationBackend', 추가
    • 코드
    AUTHENTICATION_BACKENDS = [
    
        # Needed to login by username in Django admin, regardless of `allauth`
        'django.contrib.auth.backends.ModelBackend',
    
        # `allauth` specific authentication methods, such as login by e-mail
        'allauth.account.auth_backends.AuthenticationBackend',
    
    ]
    • 여러 앱들을 INSTALLED_APPS 목록에 추가해줘야함

      • 필수 항목

        • 'auth'와 'messages'는 이미 존재하는 앱이므로 생략

          #'django.contrib.auth',
          #'django.contrib.messages',
          'django.contrib.sites',
          
          'allauth',
          'allauth.account',
          'allauth.socialaccount',
      • 'allauth.socialaccount.providers.서비스명은 소셜로그인과 관련된 것 (원하는 것만 가져다 사용)

      • 코드

        INSTALLED_APPS = [
            'django.contrib.admin',
            'django.contrib.auth',
            'django.contrib.contenttypes',
            'django.contrib.sessions',
            'django.contrib.messages',
            'django.contrib.staticfiles',
            'django.contrib.sites',
            'coplate',
            'allauth',
            'allauth.account',
            'allauth.socialaccount',
        ]
    • SITE_ID도 추가

      • SITE_ID = 1
        • INSTALLED_APPS 아래에 추가
      • 'django.contrib.sites',는 어떤 기능을 여러 웹사이트에서 사용할 수 있게 해주는 것
        • 비슷한 콘텐츠나 기능을 가지고 있는 웹사이트가 여러 개 필요할 때는 이것을 사용해서 django 프로젝트 하나로 여러 웹 사이트 운영 가능
        • 그 때 각각의 사이트를 구분하기 위한 ID가 바로 SITE_ID = 1임!
    • SOCIALACCOUNT_PROVIDERS 는 소셜로그인과 관련된 부분이므로 일단 생략

    • URL 패턴 추가 (urls.py)

      • url 패턴

        urlpatterns = [
            ...
            path('accounts/', include('allauth.urls')),
            ...
        ]
      • ❗하지만 이대로 추가하면 'acccounts/' + 'allauth의 url' 형태가 됨❗ ➡ 지저분

        • ex) accounts/login
        • ex) accounts/signup
      • 깔끔하게 login, signup만 url에 나오도록 하기 위해서‼

        • URL은 empty pattern('')에 연결
        • (project 파일) coplate_project/urls.py에 'accounts/`없이 추가!
          from django.contrib import admin
          from django.urls import path, include
          urlpatterns = [
              path('admin/', admin.site.urls),
              path('', include('allauth.urls')),
          ]
    • 문서에 없는 추가 setting

      • settings.py 맨 아래에 Email Setting 추가
        • allauth가 제공하는 이메일 인증이나 비밀번호 찾기 기능을 활용하려면 이메일을 보낼 수 있어야 하는데 이메일을 어떻게 보낼지를 설정하는 setting
        • "django.core.mail.backends.console.EmailBackend"는 터미널 콘솔로 이메일을 보내도록 하는 설정
          # Email settings
          EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"    
      • 나중에 추가적인 setting 有
  • 문서에 따라서 allauth를 설치해주기만 하면 기본적인 auth 관련 페이지들이 자동으로 set-up됨

  • ❗변경된 auth를 server에서 확인하기 전에 app을 여러 개 추가했으므로 다시 한 번 migration 진행❗

    • python manage.py migrate
  • Server에서 확인하기

    1. python manage.py runserver
    2. 터미널 URL이 아닌 http://localhost:8000/login/로 직접 입력해서 들어가기
  • 확인 결과

    • 우리가 Sign In, Sign Up, Forgot Password?, Remember Me등의 페이지와 기능들을 만들어준 적이 없지만 allauth를 우리 프로젝트에 설치만 해주면 이러한 기능들이 모두 제공됨
    • 우리는 단순히 여기에 몇 가지 세팅을 추가해 User 기능을 우리가 원하는 대로 바꿔주기만 하면 됨!
profile
기록하는 습관

0개의 댓글