Authentication

jurin·2021년 4월 1일
0

Django Project - LeeBook

목록 보기
3/11
post-thumbnail

실용주의 프로그래머님의 인프런 강의를 듣고 작성하였습니다.
출처: https://www.inflearn.com/course/%EC%9E%A5%EA%B3%A0-%ED%95%80%ED%84%B0%EB%A0%88%EC%8A%A4%ED%8A%B8/lecture/62871?tab=note&speed=1.25

Authentication 인증시스템 구축

로그인이 되어 있으면 hello_world로 들어갈 수 있고 안되어 있으면 로그인 창으로 이동하도록 설정한다.

def hello_world(request):
    if request.user.is_authenticated:
        if request.method == "POST":
        # 생략
    else:
        return HttpResponseRedirect(reverse('accountapp:login'))

생각을 해보면 이걸 hello_world에만 적용할 것이 아니라 accountapp에도 적용해야 한다. 로그인도 안했는데 정보 수정 창을 들어갈 수 있다면 아주 큰 문제가 생길 것이다.

    def get(self, *args, **kwargs):
        if self.request.user.is_authenticated and self.get_object() == self.request.user:
            return super.get(*args, **kwargs)
        else:
            return HttpResponseForbidden()

    def post(self, *args, **kwargs):
        if self.request.user.is_authenticated and self.get_object() == self.request.user:
            return super.get(*args, **kwargs)
        else:
            return HttpResponseForbidden()

이 코드를 AccountDeleteView와 AccountUpdateView에 추가해준다.

Decorator

Decorator을 이용해 위에 작성한 인증시스템을 간소화 시키고 가독성을 높인다.

@method_decorator()은 일반 function에 사용하는 decorator를 method에 사용할 수 있도록 변환해주는 decorator이다.

views.py

has_ownership = [account_ownership_required, login_required]

@method_decorator(has_ownership, 'get')
@method_decorator(has_ownership, 'post')
class AccountUpdateView(UpdateView):
    model = User
    context_object_name = 'target_user'
    form_class = AccountUpdateForm
    success_url = reverse_lazy('accountapp:hello_world')
    template_name = 'accountapp/update.html'


@method_decorator(has_ownership, 'get')
@method_decorator(has_ownership, 'post')
class AccountDeleteView(DeleteView):
    model = User
    context_object_name = 'target_user'
    success_url = reverse_lazy('accountapp:login')
    template_name = 'accountapp/delete.html'

커스텀 decorator인 account_ownership_required을 decorators.py 파일을 만들어서 작성

from django.contrib.auth.models import User
from django.http import HttpResponseForbidden


def account_ownership_required(func):
    def decorated(request, *args, **kwargs):
        user = User.objects.get(pk=kwargs['pk'])
        if not user == request.user:
            return HttpResponseForbidden()
        return func(request, *args, **kwargs)
    return decorated

superuser 설정

leebook/urls.py에 설정되어 있던 'admin/' 경로로 들어가보면

이것처럼 장고 작업 관리창이 나온다. superuser 계정이 있어야 들어갈 수 있으므로 만들어주자

python manage.py createsupperuser

위 명령어를 통해 username과 password를 정해주고 아까 링크에서 로그인해주면 다음과 같이 관리창이 나온다.

media 설정

image를 다루기 위해 설정해 주어야 한다.

leebook/settings.py

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

마지막으로 장고에서 이미지를 다루는 라이브러리인 pillow를 설치해준다.

pip install pillow
profile
anaooauc1236@naver.com

0개의 댓글