[파이썬 플라스크] 작성자만 게시물을 삭제할 수 있게 해보기
업데이트:
개요
현재까지 구현한 인스타그램 API는 로그인 한 사용자라면 누구나 게시물을 작성할 수 있고, 삭제할 수도 있다. A 유저가 B 유저의 게시물을 삭제한다면 B 유저는 매우 슬플 것이다. 따라서 게시물을 작성한 본인만 삭제가 가능하게끔 구현해보자.
흐름은 아래와 같겠다.
get_jwt_identity()
로 요청을 보낸 사용자의 username을 받아온다.- 받아온 username을 가진 사용자의 id를 구한다.
- 삭제를 원하는 게시물의 유저 id를 구한다.
- 요청을 보낸 사용자 id와 게시물 작성자의 id를 비교한다.
- 같다면 삭제하고, 다르다면 삭제하지 못한다.
참고 username으로 비교를 하게 될 경우, 게시물을 작성한 사용자의 유저네임을 구할 때 post.author.username
로 접근해야하기에 post.author_id
로 접근 가능한 id로 비교하기로 했다.
0. DELETE 요청을 처리하는 곳
사용자가 DELETE 요청을 보내면 어디서 처리하는 것일까.
게시물 CRUD의 경우 resources/post.py
에서 진행되고, Post 클래스의 delete 메서드가 삭제 요청을 처리한다.
현재 delete 메서드는 아래와 같다.
1
2
3
4
5
6
7
8
@classmethod
@jwt_required()
def delete(cls, id):
post = PostModel.find_by_id(id)
if post:
post.delete_from_db()
return {"message": "게시물이 성공적으로 삭제되었습니다."}, 200
return {"Error": "게시물을 찾을 수 없습니다."}, 404
jwt가 필요하고, 게시물이 존재만 한다면 삭제가 가능하다.
1. 요청을 보낸 사용자의 정보
먼저 요청을 보낸 사용자의 정보를 저장해주자.
아래 코드로 사용자의 id를 저장해주었다.
1
2
username = get_jwt_identity()
author_id = UserModel.find_by_username(username).id
2. 요청을 보낸 사용자가 게시물의 작성자인지 확인
삭제 할 게시물 작성자의 id와 요청을 보낸 사용자의 id가 같은지 비교하는 조건문을 작성하자.
이때, 기본적으로 게시물이 존재한다는 가정하에 작성하였다.
1
2
3
4
5
if post.author_id == username:
post.delete_from_db()
return {"message": "게시물이 성공적으로 삭제되었습니다."}, 200
else:
return {"Error": "게시물은 작성자만 삭제할 수 있습니다."}, 403
3. 완성
결과적으로 완성된 코드는 아래와 같다. — 전체 코드는 이 곳
@classmethod
@jwt_required()
def delete(cls, id):
# 요청을 보낸 사용자
username = get_jwt_identity()
author_id = UserModel.find_by_username(username).id
post = PostModel.find_by_id(id)
# 게시물이 존재하는지 확인
if post:
# 게시물의 작성자와 요청을 보낸 사용자가 같은지 확인
if post.author_id == author_id:
post.delete_from_db()
return {"message": "게시물이 성공적으로 삭제되었습니다."}, 200
else:
return {"Error": "게시물은 작성자만 삭제할 수 있습니다."}, 403
return {"Error": "게시물을 찾을 수 없습니다."}, 404
테스트
현재 존재하는 게시물은 아래와 같다.
태영이가 작성했고, 게시물의 id는 1이다.
태영이가 아닌 태일이가 게시물을 삭제한다면,
태영이가 삭제를 한다면,
Notice: 이 게시물은 gdsanadev 블로그를 참고하였습니다.
댓글남기기