[Django REST Framework] 사용자 지정 사용자로 프로젝트 빌드

실행 환경



MacOS BigSur - 11.2.1
Python3 - 3.8.2
장고 - 3.1.7
djangorestframework - 3.12.2

Django REST Framework (DRF) 시작하기



지금까지 Django만을 이용한 Web 어플리케이션의 작성을 하고 있었습니다만, 프런트 엔드의 고도화를 할 수 없고, DRF를 이용해 React와 조합해 보고 싶다! ! ! 라고 생각했습니다. React에 관해서는 아직 지식이 적습니다만, 우선 DRF의 감각을 잡아 보려고 생각해, 프로젝트 작성을 했으므로 그 순서를 메모가 굳이 기술합니다.

DRF란?



참고로 DRF는 Django에서 WebAPI 개발을 지원하는 API 프레임 워크입니다. 웹 콘솔에서 API의 동작 확인이 가능하고, 이것에 의해 프런트 엔드와 백엔드를 분리해 어플리케이션 개발을 효율적으로 진행할 수 있다고 합니다.

venv의 가상 환경


$ python3 -m venv DRFenv
$ . DRFenv/bin/activate

위 명령을 사용하여 DRF 용 venv를 만들고 활성화합니다.

필요한 패키지 설치



여기에서는 가상 환경에 들어가는 명령이 됩니다.
$ pip3 install django
$ pip3 install djangorestframework

프로젝트 애플리케이션 작성


$ django-admin startproject my_api
$ python3 manage.py startapp backend

프로젝트 이름을 "my_api", 응용 프로그램 이름을 "backend"로 지정합니다.

사용자 정의 사용자 모델 정의



그런데, 전회 Django로 개발을 진행하고 있을 때에 커스텀 유저 모델 되는 것을 도중에 알고, 엉망진창 코드를 괴롭혔습니다만 도중부터 잘 유저 모델의 변경을 할 수 없었다고 하는 실패가 있었습니다.
Django에서는 커스텀 유저를 작성하는 경우는 최초의 migration의 init(0001) 시점에서 커스텀 유저를 사용하는 것을 포함하지 않으면 안 되는 것 같아, 그래서 제일 먼저 커스텀 유저 모델의 정의를 실시합니다!

my_api/backend/models.py
from django.db import models

# AbstractBaseUserを利用してUserモデルをカスタマイズ
from django.contrib.auth.models import AbstractBaseUser
# PermissionsMixinを用いてUserの認証を行う
from django.contrib.auth.models import PermissionsMixin
# BaseUserManager利用してUserManagerモデルをカスタマイズ
from django.contrib.auth.models import BaseUserManager


class UserProfileManager(BaseUserManager):
    """Manager for user profiles"""

    # ユーザを作成するメソッド
    def create_user(self, email, name, password=None):
        """Create a new user profile"""

        # emailが入力されていないときはValueErrorを呼び出す
        if not email:
            raise ValueError('User must have an email address')

        # emailのドメインを小文字に変換
        email = self.normalize_email(email)
        # UserProfileモデルを参照してuserを定義
        user = self.model(email=email, name=name)
        # userが入力したパスワードをハッシュ化
        user.set_password(password)
        # settings.pyでdefaultに設定されているDBに保存
        user.save(using=self._db)

        return user

    def create_superuser(self, email, name, password):
        """Create and save a new superuser with given details"""

        # 上記create_userを利用
        user = self.create_user(email, name, password)

        # superuserの権限を適用
        user.is_superuser = True
        user.is_staff = True
        user.save(using=self._db)

        return user


class UserProfile(AbstractBaseUser, PermissionsMixin):
    """Database model for users in the system"""

    # カラム名 = データ型(オプション)
    email = models.EmailField(max_length=255, unique=True)
    name = models.CharField(max_length=255)
    # ユーザが退会したらここをFalseにする(論理削除)
    is_active = models.BooleanField(default=True)
    # 管理画面にアクセスできるか
    is_staff = models.BooleanField(default=False)
    # Managerのメソッドを使えるようにする
    objects = UserProfileManager()
    # emailを利用したログイン認証に変更
    USERNAME_FIELD = 'email'
    # 必須項目追加
    REQUIRED_FIELDS = ['name']

    # 1つのnameフィールドで表示したいので、既存のメソッドをオーバーライド
    def get_full_name(self):
        """Retrieve full name of user"""
        return self.name

    def get_short_name(self):
        """Retrieve short name of user"""
        return self.name

    def __str__(self):
        return self.email

settings.py 변경



my_api/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework', #追加
    'markdownx', #追加
    'backend', #追加
]

LANGUAGE_CODE = 'ja' #変更

TIME_ZONE = 'Asia/Tokyo' #変更

REST_FRAMEWORK = { #追加
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny',
    ]
}

# Djangoプロジェクトのユーザ認証を変更
AUTH_USER_MODEL = 'backend.UserProfile'

# 画像用
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

관리 화면(admin)에 추가



my_site/backend/admin.py
from django.contrib import admin
from backend import models

admin.site.register(models.UserProfile)

마이그레이션 파일 작성 및 데이터베이스 반영


$ python3 manage.py makemigrations
$ python3 manage.py migrate

수퍼유저 만들기


$ python3 manage.py createsuperuser

이 명령은 관리 페이지에 로그인할 수 있는 수퍼유저를 작성합니다.
명령을 실행하면 이메일 주소, 이름, 비밀번호를 입력하라는 메시지가 표시되므로 자유롭게 설정합니다.

서버 시작 및 시작 확인


$ python3 manage.py runserver

이 명령은 서버를 시작합니다.
htp://127.0.0.1:8000/
위로 가서 로켓 화면이 나오면 제대로 작동합니다.

htp://127.0.0.1:8000/아d
또한 위에서 관리 페이지에 액세스할 수 있습니다. 사용자 지정 사용자가 이메일 주소와 비밀번호로 인증하도록 설정했으므로 이와 같이 사용자 지정할 수 있는지 확인합니다.


이번에는 이것으로 개발 환경의 작성은 완료입니다.
다음 번부터 실제로 개발을 진행해 나가려고 생각합니다.

참고



이하의 페이지가 매우 알기 쉽게, 참고로 했습니다.
- h tps://일 gbぉg. 오 rg / d 짱고 레 stf 반짝이 rk 뿌리 C4
- htps : // 코 m / 피요 판만 / ms / 5 fb9c290d452 005782

좋은 웹페이지 즐겨찾기