실용주의 프로그래머님의 인프런 강의를 듣고 작성하였습니다.
출처: 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
로그인이 되어 있으면 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을 이용해 위에 작성한 인증시스템을 간소화 시키고 가독성을 높인다.
@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
leebook/urls.py에 설정되어 있던 'admin/' 경로로 들어가보면
이것처럼 장고 작업 관리창이 나온다. superuser 계정이 있어야 들어갈 수 있으므로 만들어주자
python manage.py createsupperuser
위 명령어를 통해 username과 password를 정해주고 아까 링크에서 로그인해주면 다음과 같이 관리창이 나온다.
image를 다루기 위해 설정해 주어야 한다.
leebook/settings.py
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
마지막으로 장고에서 이미지를 다루는 라이브러리인 pillow를 설치해준다.
pip install pillow