inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

파이썬 사용자를 위한 웹개발 입문 A to Z Django + Bootstrap

Post 수정 화면 / 기능 구현하기

다른 사용자가 수정페이지에 접근하는 걸 막으려면 어떻게 하나요?

172

Minsub Yoon

작성한 질문수 15

0

다른 사용자가 게시물 수정 페이지에 접근하는걸 막으려면 어떻게 해야 하나요?

로그인을 안한 사용자가 접근하는 건 뷰에 LoginRequiredMixin을 사용해서 막는데, 로그인은 했지만 작성자가 아닌 사용자가 접근하는 건 어떻게 막나 궁금합니다.

PostUpdate 뷰를 아래처럼 수정해봤지만 form_valid가 템플릿을 생성한 후에 실행되는 건지 리다이렉트가 안됩니다.

# /blog/post.pk/update/ GET
class PostUpdate(LoginRequiredMixin, UpdateView):
model = Post # 템플릿: post_form
fields = ['title', 'content', 'head_image', 'category', 'tags']

def form_valid(self, form):
current_user = self.request.user

pk = self.kwargs['pk']
current_post = Post.objects.get(pk=pk)

#
if current_user is current_post.author:
return super(type(self), self).for_valid(form)
else:
return redirect('/blog/1/')

다른 사용자의 접근을 막는 방법과 form_valid가 언제 실행되는지 알려주시면 감사하겠습니다.

django bootstrap python

답변 1

1

SungYong Lee

아래와 같이 dispatch를 추가해보세요. 

dispatch() 메서드는 방문자가 웹 사이트 서버에 GET 방식으로 요청했는지 POST 방식으로 요청했는지 판단하는 기능을 합니다. CreateView나 현재 사용하고 있는 UpdateView의 경우 방문자가 서버에 GET 방식으로 들어오면 포스트를 작성할 수 있는 폼 페이지를 보내줍니다.

만약 권한이 없는 사용자가 PostUpdate를 사용하려고 한다면 서버와 통신하는 방식이 GET방식이든 POST 방식이든 상관없이 접근할 수 없게 해야 합니다. 따라서 dispatch()가 실행될때  작성자인지 확인하면 됩니다. 작성자가 아니라면 "권한없음"오류를 나타냅니다. 

from django.core.exceptions import PermissionDenied

(생략)

class PostUpdate(LoginRequiredMixin, UpdateView):
    model = Post
    fields = [‘title’, ‘hook_text’, ‘content’, ‘head_image’, ‘file_upload’, ‘category’, ‘tags’]

    def dispatch(self, request, *args, **kwargs):
        if request.user.is_authenticated and request.user == self.get_object().author:
            return super(PostUpdate, self).dispatch(request, *args, **kwargs)
        else:
            raise PermissionDenied

(생략)

후속 강의

0

386

1

완성했습니다. 감사합니다

0

313

2

오늘 vps 에 domain 을 지정해주고 아직 활성화되지 않았는데

0

290

1

test 결과 두 가지 error 가 발생했습니다. 뭐가 잘못된 건지 도저히 모르겠습니다.

0

413

1

accounts/login 이 존재하지 않는다고 나옵니다

0

262

2

코드 질문입니다

0

244

1

포스트에 markdown을 사용해서 이미지를 추가할때

0

307

1

New Post 관련 질문드립니다.

0

175

1

이번 영상부터 각 포스트에 프리뷰 사진이 달라지셔서 질문 드립니다.

0

330

1

base 작업한 후 Category가 블로그 하단으로 내려갔습니다.

0

249

1

혹시 소스코드 전체가 담긴 주소를 좀 알 수 있을까요?

0

261

1

9분 경 테스트에서 Assretion Error가 발생합니다.

0

230

1

파이참 초기 설치 후 설정 관련해서 git에 항상 add되는 옵션을 체크했습니다.

0

336

3

F12를 눌러 console 창에서 오류를 확인할때 몇번째 줄인지 나오지 않습니다.

0

393

1

post view도 delete하려는데 막혀서 ㅠㅠ

0

192

1

"GET / HTTP/1.1" 400 143 그리고 "GET / HTTP/1.1" 404 2031

0

3299

3

연결이 안됩니다

0

495

8

서버에 연결하고 나면 그 후에 Cmder가 작동이 안되요

0

371

2

서버에 배포후 어드민계정

0

583

2

안녕하세요! 실서버에 올린 sqlite3의 데이터를 직접 확인하려면 어찌하나요?

0

2032

3

gitignore안먹히는현상

0

287

1

cmder 종료시 서버도 같이 종료됩니다.

0

215

1

' python manage.py makemigration blog ' 명령어 에러

0

582

2

python manage.py makemigrations 를 했을 때 오류가 납니다.

0

552

2