본문 바로가기
개발일지/Django

Django - 장고 로그인 했을때만 접근 가능하게하는 함수 LoginRequiredMixin

by 개발에정착하고싶다 2023. 1. 3.

Django를 공부하면서 매일마다 속도가 빠르진 않아서 답답하기도 하지만 많은 것을 배워간다.

그 중에서 후에 필요한 부분이 LoginRequiredMixin 이다.


#1 개요

LoginRequiredMixin는 CBV 방식과 궁합이 맞게끔 설계가 된것같다.

그리고 이 LoginRequiredMixin의 기능은, CBV 클래스에 상속받았을때,

해당 클래스로 구동되는 기능에 대하여는 로그인을 해야만 접근이 가능하게끔 설계가 되어있다.

 

다른 말로는 로그인을 하고, 해당 url에 접근을 해야지

status code가 200이 뜬다.


#2 실사용 예

 

나의 경우를 예로 들어보겠다.

# blog/models.py

from django.db import models
from django.contrib.auth.models import User


# code line
class Post(models.Model):
    title = models.CharField(max_length=30)
    # 노출되는 글씨의 수를 제한적으로 보여주는 소제목의 용도로 사용하기 위해 만든다고 보면 될것같다
    hook_text = models.CharField(max_length=100, blank=True)
    content = models.TextField()

    # 설명1. upload_to
    # 이거는 지정된 위치의 폴더에 연도/시간/일 단위로 쪼개서
    # 폴더를 분산해서 데이터베이스에 저장한다는 의미다.
    # 폴더를 분산하면 데이터를 서치하는게 용이하지만,
    # 하나의 폴더에서 여러개의 파일을 찾는것은 시간적으로 좋지 않다고 한다.

    # 설명2. blank = True
    # 필수로 채우지 않아도 상관없다는 의미
    # 즉, 이 경우에는 "이미지 업로드를 해도되고 안해도되"라는 의미
    head_image = models.ImageField(
        upload_to='blog/images/%Y/%m/%d/', blank=True)
    file_upload = models.FileField(
        upload_to='blog/files/%Y/%m/%d/', blank=True)

    # auto_now_add는 "최초 저장시"에만 저장이 되고
    created_at = models.DateTimeField(auto_now_add=True)
    # auto_now는 "수정 후 save를 할때마다"최신화 되어 적용된다.
    updated_at = models.DateTimeField(auto_now=True)

    # 기존 author 모델이고, 이대로 사용할 시, 작성자(author를 삭제하면 이 작성자가 작성한
    # 게시글은 모조리 삭제된다.
    # author = models.ForeignKey(User, on_delete=models.CASCADE)

    # SET_NULL을 하게되면 작성자 계정이 사라져도 게시글은 남아있다.
    author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)

    # 텍스트, 숫자의 null은 null이고, 계정, 카테고리등 목록선택창에서의 null은 blank이다.
    category = models.ForeignKey(
        Category, on_delete=models.SET_NULL, null=True, blank=True)

    tags = models.ManyToManyField(Tag, blank=True)

    def __str__(self):
        return f'[{self.pk}]{self.title} :: {self.author}'

    # 이것을추가해 줌으로써 admin 페이지에서 볼때는 "View on site"라는 버튼이 생성되었다.
    def get_absolute_url(self):
        return f'/blog/{self.pk}'

    # 첨부파일의 이름을 확인
    def get_file_name(self):
        return os.path.basename(self.file_upload.name)

    # 첨부파일의 확장자를 확인
    def get_file_ext(self):
        return self.file_name().split('.')[-1]
# blog/views.py

from django.views.generic import CreateView
from django.contrib.auth.mixins import LoginRequiredMixin

from .models import Post

# code line
class PostCreate(LoginRequiredMixin, CreateView):
    model = Post
    fields = ['title', 'hook_text', 'content',
              'head_image', 'file_upload', 'category']

1)

일단 CreateView를 PostCreate라는 클래스에 상속받았고,

그에 따라서 post라는 models을 사용하여 fields 값을 채워넣는 폼을 사용하고자 했다.

 

2)

사용하고 있던 CreateView에는 로그인 유저, 비로그인 유저 가릴 것 없이 포스트 작성이 가능했다.

이를 방지하기 위해 views에서 LoginRequiredMixin을 PostCreate라는 클래스에 상속받아줬다.

 

3) 결과적으로 현재로써는 비 로그인자가 포스트를 작성하려고하면 Page not found 404에러가 뜬다.