Django Section 4

yoodeit·2025년 8월 17일
0

일단 만드는 어무해

목록 보기
13/21

AccountApp 기능을 구현한 게 어쨌든 유저관련이니까, authentication을 완성해야 진짜다.

authentication

views.py helloworld 함수에서

if request.user.is_authenticated:
	<원래있던내용>
    
else:
        return HttpResponseRedirect(reverse('accountapp:login'))

url로 접근하는 것 방지하기

views.py updateview나 deleteview에 get이나 post요청을 받을 경우 authenticated인지를 검사하는 기능을 추가한다.

accountUpdateView

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().post(*args, **kwargs)
        else:
            return HttpResponseForbidden()

이 구문을 추가해준다. get요청이든 post요청이든 authenticated 되어있으면서 자격이 있는 유저여야만 할 수 있도록. authenticated 인지만 확인한다면 6번유저가 2번유저의 정보를 마음대로 바꾸고 지울 수가 있다.

accountDeleteView

얘도 마찬가지로...

Decorator를 이용한 코드 간소화

@login_required 사용하기

from django.contrib.auth.decorators import login_required
이 구문으로 login_required를 import부터 해주고.
이전에 if else로 authenticated 여부를 체크했던 거 싹 지워준다.

클래스에도 사용하기

Update나 Delete View는 함수형이 아니고 클래스라서 적용이 안된다.
그래서 @method_decorator 라는 걸 사용해주어야 한다.

@method_decorator(login_required, 'get')
@method_decorator(login_required, 'post')

이런 식으로 class 안에 있는 get이나 Post함수에 적용이 가능하다.

Authorization용 decorator 커스텀


데코레이터 파이썬파일을 하나 만들어줍니다.

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


def account_authorized(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

안에서 이런식으로 커스텀을 해줍니다.

decorator로 배열만들기

has_ownership = [login_required, account_authorized]
이런 식으로 배열을 만들어서 method_decorator에 넣어줄 수 있다.

@method_decorator(has_ownership, 'get')
@method_decorator(has_ownership, 'post')

admin을 위한 superuser 만들기

python manage.py createsuperuser
대충 yoodeit에 redjango0827로 해줬다.

pillow 설치하기

pip install pillow

MEDIA 관련 설정 in settings.py

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

0개의 댓글