9주차 4일 TIL

서정인·2022년 6월 20일
0

Til, django

Visual Studio Code로 django 프로젝트 만들기

가상환경 만들기 (venv)

$ python -m venv venv

#(venv)로 들어가기

$ source venv/Scripts/activate

장고 설치

$ pip install django
$ pip install djangorestframework

django project 생성 (최상위 폴더에 바로 생성하려면 ' .' 붙이기)

$ django-admin startproject drf_class .

(venv)에서 나가기

$ deactivate

requirements.txt 생성

$ pip freeze > requirements.txt

장고 앱만들기

$ django-admin startapp user
$ python manage.py startapp app_name

슈퍼유저

$ python manage.py createsuperuser

모델

$ python manage.py makemigrations
$ python manage.py migrate

서버 실행

python manage.py runserver
python manage.py runserver 0.0.0.0:8000 & # 백그라운드 실행

custom user 생성 및 사용자 로그인 구현

user/models.py

from django.contrib.auth.models import BaseUserManager, AbstractBaseUser

custom user model 사용 시 UserManager 클래스와 create_user, create_superuser 함수가 정의되어 있어야 함

class UserManager(BaseUserManager):
    def create_user(self, username, password=None):
        if not username:
            raise ValueError('Users must have an username')
        user = self.model(
            username=username,
        )
        user.set_password(password)
        user.save(using=self._db)
        return user
    
    # python manage.py createsuperuser 사용 시 해당 함수가 사용됨
    def create_superuser(self, username, password=None):
        user = self.create_user(
            username=username,
            password=password
        )
        user.is_admin = True
        user.save(using=self._db)
        return user

class User(AbstractBaseUser):
    username = models.CharField("사용자 계정", max_length=20, unique=True)
    email = models.EmailField("이메일 주소", max_length=100)
    password = models.CharField("비밀번호", max_length=128)
    fullname = models.CharField("이름", max_length=20)
    join_date = models.DateTimeField("가입일", auto_now_add=True)

		# is_active가 False일 경우 계정이 비활성화됨
    is_active = models.BooleanField(default=True) 

    # is_staff에서 해당 값 사용
    is_admin = models.BooleanField(default=False)
    
    # id로 사용 할 필드 지정.
    # 로그인 시 USERNAME_FIELD에 설정 된 필드와 password가 사용된다.
    USERNAME_FIELD = 'username'

    # user를 생성할 때 입력받은 필드 지정
    REQUIRED_FIELDS = []
    
    objects = UserManager() # custom user 생성 시 필요
    
    def __str__(self):
        return self.username

    # 로그인 사용자의 특정 테이블의 crud 권한을 설정, perm table의 crud 권한이 들어간다.
    # admin일 경우 항상 True, 비활성 사용자(is_active=False)의 경우 항상 False
    def has_perm(self, perm, obj=None):
        return True
    
    # 로그인 사용자의 특정 app에 접근 가능 여부를 설정, app_label에는 app 이름이 들어간다.
    # admin일 경우 항상 True, 비활성 사용자(is_active=False)의 경우 항상 False
    def has_module_perms(self, app_label): 
        return True
    
    # admin 권한 설정
    @property
    def is_staff(self): 
        return self.is_admin
profile
코딩공부

0개의 댓글