
오늘 한 일
✏️ 게시글에 p_id (고유번호) 붙이기 ... 헤헷 💖
해결했다.... 신난다 !!!!! 약 2시간 만에 해결한거라 생각합니다.. 접는 글로..기록할 거다 워낙... 뭐가 많아서.
↪︎ 최종 완성된 코드 (문제 해결된 코드)
먼저 아래 코드가 성공적으로 게시물에 붙일 p_id를 정의하는 내용이다.
client에서 fetch post를 통해 정보를 저장해달라고 요청이 오면 아래 python 서버경로로 들어온다.
mongoDB까지 저장하는 내용이지만 이 부분은 제거하고 일부 코드만 가져왔다.
# 최종 완성된 코드 (문제 해결된 코드)
@app.route("/post", methods=["POST"])
def crewInfo_post():
# * 문제상황(해결해야할 문제) | 게시물에 고유 id부여 ↴
# get요청을 받을 때 p_id를 붙여주면 매번 같은 게시물에도 다른 p_id가 생성되고,
# 결과적으로 댓글 저장시 함께 저장되어야하는 p_id값이 달라져서 게시물과 댓글의 연결이 힘들 수 있으니
# 'db에 넣을 때'!! p_id를 설정해주어야 함.
# * 어떻게 풀어낼 것인가?
# list에 p_id가 없으면 => p_id = 1
# 만약에 listdp p_id가 있으면 => new p_id = '(p_id중 제일 큰 수)+1'
# * 해결방법(순서)
# 1. DB에서 모든 p_id가져온다.
# 2. 가져온 p_id 존재하는지 확인
# 3-1. 존재하지 않으면 'p_id = 1'
# 3-2. 존재하면 (1) p_id 숫자로 변경 (2) p_id 큰 수 찾기
# <p_id 큰 수 찾기 1> : 1) num = 숫자로 변경한 p_id1 2) 숫자로 변경한 (p_id2 >= num) 이면 num = 숫자로 변경한 p_id2
# <p_id 큰 수 찾기 2> : 1) 내림차순 내장함수(있으면!) => 내림차순 정렬 후 'index0' 가져오기
# 4. new p_id에 '큰 수 + 1' 부여!
# 5. 부여한 수 doc에 넣어주기!
all_crewdata = list(db.crewdata.find({},{'_id':False}))
p_ids = [] # p_ids 변수를 반복문 이전에 초기화
for crewdata in all_crewdata:
p_ids.append(crewdata['p_id'])
if len(p_ids) == 0:
p_id = 1
else:
p_ids.sort(reverse=True)
pre_p_id = p_ids[0]
p_id = int(pre_p_id) + 1
↪︎ 문제해결과정
초안
(문제였던 곳 표시해둠)
@app.route("/post", methods=["POST"])
def crewInfo_post():
# * 문제상황(해결해야할 문제) | 게시물에 고유 id부여 ↴
# get요청을 받을 때 p_id를 붙여주면 매번 같은 게시물에도 다른 p_id가 생성되고,
# 결과적으로 댓글 저장시 함께 저장되어야하는 p_id값이 달라져서 게시물과 댓글의 연결이 힘들 수 있으니
# 'db에 넣을 때'!! p_id를 설정해주어야 함.
# * 어떻게 풀어낼 것인가?
# list에 p_id가 없으면 => p_id = 1
# 만약에 listdp p_id가 있으면 => new p_id = '(p_id중 제일 큰 수)+1'
# * 해결방법(순서)
# 1. DB에서 모든 p_id가져온다.
# 2. 가져온 p_id 존재하는지 확인
# 3-1. 존재하지 않으면 'p_id = 1'
# 3-2. 존재하면 (1) p_id 숫자로 변경 (2) p_id 큰 수 찾기
# <p_id 큰 수 찾기 1> : 1) num = 숫자로 변경한 p_id1 2) 숫자로 변경한 (p_id2 >= num) 이면 num = 숫자로 변경한 p_id2
# <p_id 큰 수 찾기 2> : 1) 내림차순 내장함수(있으면!) => 내림차순 정렬 후 'index0' 가져오기
# 4. new p_id에 '큰 수 + 1' 부여!
# 5. 부여한 수 doc에 넣어주기!
all_crewdata = list(db.crewdata.find({},{'_id':False}))
for crewdata in all_crewdata:
p_ids = [] # ✅ 1. 여기가 문제였음
p_ids.append(crewdata['p_id'])
if len(p_ids) == 0:
p_id = 1
else:
p_ids_bag = p_ids.sort(reverse=True) # ✅ 2. 여기가 문제였음
pre_p_id = p_ids_bag[0] # ✅ 3. 여기가 문제였음
p_id = int(pre_p_id) + 1
처음에 떴던 오류 메시지
127.0.0.1 - - [17/May/2023 01:30:57] "POST /post HTTP/1.1" 500 - Traceback (most recent call last): File "/Users/easy/Desktop/jieun_project/venv/lib/python3.8/site-packages/flask/app.py", line 2213, in __call__ return self.wsgi_app(environ, start_response) File "/Users/easy/Desktop/jieun_project/venv/lib/python3.8/site-packages/flask/app.py", line 2193, in wsgi_app response = self.handle_exception(e) File "/Users/easy/Desktop/jieun_project/venv/lib/python3.8/site-packages/flask/app.py", line 2190, in wsgi_app response = self.full_dispatch_request() File "/Users/easy/Desktop/jieun_project/venv/lib/python3.8/site-packages/flask/app.py", line 1486, in full_dispatch_request rv = self.handle_user_exception(e) File "/Users/easy/Desktop/jieun_project/venv/lib/python3.8/site-packages/flask/app.py", line 1484, in full_dispatch_request rv = self.dispatch_request() File "/Users/easy/Desktop/jieun_project/venv/lib/python3.8/site-packages/flask/app.py", line 1469, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) File "/Users/easy/Desktop/jieun_project/app.py", line 41, in crewInfo_post if len(p_ids)==0: UnboundLocalError: local variable 'p_ids' referenced before assignment
혼자 풀어보다가 시간 너무 오래 걸리면 진빠질 듯해서 chat GPT한테 물어봤음
그래서 얻은 첫번째 답안
"오류는 위에 저 뻘건 표시다. 해석해보면 알겠지만 'p_ids'라는 변수가 할당되기 전 참조되었기 때문에 발생한 오류다.
오류 해결하려면 for문 전에 p_ids를 초기화 해라"
(무슨 말이냐면 내가 mongoDB으로부터 가져온 데이터 중에서 for문으로 p_id만 가져오고 싶었고, 가져온 것이 객체였고, 데이터가 많을 수 있기 때문에 for in 문과 append로 배열처럼 만들어 주고 싶어서. 배열의 요소를 넣을 p_ids를 빈배열로 초기화 시켰는데, 이게 for문 안에 있으면 지역변수라 for문 벗어나게 되었을 때 p_ids를 사용못한다고 말하고 있는거임)
사실 고칠 부분을 chatGPT가 더 알려줬는데 , 선택사항인줄 알고 무시했다가 두번째 오류를 맞딱드림
아래 이미지는 이미 chatGPT가 언지를 줬던 부분..

이미지에 있는 주석 부분이 chat GPT가 조언했던 부분인데 두번째꺼 무시하고.... 다시 오류 얻어 또 물어봄
두번째 떳떤 오류메시지
127.0.0.1 - - [17/May/2023 01:43:40] "POST /post HTTP/1.1" 500 - Traceback (most recent call last): File "/Users/easy/Desktop/jieun_project/venv/lib/python3.8/site-packages/flask/app.py", line 2213, in __call__ return self.wsgi_app(environ, start_response) File "/Users/easy/Desktop/jieun_project/venv/lib/python3.8/site-packages/flask/app.py", line 2193, in wsgi_app response = self.handle_exception(e) File "/Users/easy/Desktop/jieun_project/venv/lib/python3.8/site-packages/flask/app.py", line 2190, in wsgi_app response = self.full_dispatch_request() File "/Users/easy/Desktop/jieun_project/venv/lib/python3.8/site-packages/flask/app.py", line 1486, in full_dispatch_request rv = self.handle_user_exception(e) File "/Users/easy/Desktop/jieun_project/venv/lib/python3.8/site-packages/flask/app.py", line 1484, in full_dispatch_request rv = self.dispatch_request() File "/Users/easy/Desktop/jieun_project/venv/lib/python3.8/site-packages/flask/app.py", line 1469, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) File "/Users/easy/Desktop/jieun_project/app.py", line 46, in crewInfo_post pre_p_id = p_ids_bag[0] TypeError: 'NoneType' object is not subscriptable
진짜 뻔뻔하게 이렇게 질문함.. (알려준 그대로 안했으면서...;; ㅎㅎ)

암튼 두번째 답변은
"오류 메시지인 위에 빨간줄 쳐둔거는 'None'타입의 객체는 첨자를 사용할 수 없다는 것을 의미해. 이 오류는 'p_ids.sort.sort(reverse=True)'의 반환값이 None인 경우에 발생해"
(해석하자면 "'sort()'라는 메서드가 원본리스트를 정렬해서 반환값이 없기 때문에 내가 어떤 변수에 'p_ids.sort.sort(reverse=True)'를 할당하면 None을 할당하게 되는거지"
암튼 'p_ids.sort(reverse=True'이렇게 짰으면 어디 다른데 할당하지말고 p_ids 내림차순 정렬 됐으니 p_ids 그대로 쓰란 말임)
내가 개떡같이 설명했을 수도 있으니...chatGPT 답변 고대로 가져옴

↪︎ 여전히 남은 문제 & 해결책
나는 get method를 할 때 p_id를 부여하면 게시물이 삭제되었을 때 p_id값이 밀릴 거고, 그럼 기존에 매칭해뒀던 r_id와는 뭔가 불일치가 날 것 같아서.. 게시물 post시 '게시물 고유 번호'를 붙이려고 했던 거였다.
위 해결책을 통해 게시물이 삭제되어도 기존에 부여되었던 게시물 고유 번호가 변경되지 않는다.
하지만 이 때도 게시물이 삭제될 때 댓글이 함께 삭제되지 않으면 '게시물 고유번호가 제일 큰' 게시물이 삭제되었을 경우 댓글과의 매칭이 이상해질 수 있다. 왜냐하면 내가 짠 '게시물 고유번호 붙이기'는 기존의 고유번호 중 제일 큰 수를 기준으로 +1한 값이 붙는 방식을 택하고 있기 때문이다.
다행히 게시물 삭제시 관련 댓글도 함께 삭제한다면 큰 문제는 없을 듯하다.
↪︎ 파이썬 문법 몰라서 참고했던 페이지 & 내용
for문 기본구조
for 변수 in 리스트(=배열/ , 튜플, 문자열) :
수행할 문장1
수행할 문장2
*(참고로 for문에서 해결보았으면 back tab해서 다음 문장 시작)
*(참고했던 자료 : 'https://wikidocs.net/22')
리스트 안에 리스트 추가하기
'.append()'라는 python 내장함수 사용
(* 참고로 append()는 항상 리스트의 길이가 1씩 증가)
a = []
a.append(10)
print(a) # 결과는 [10]
*(참고했던 자료 : 'https://dojang.io/mod/page/view.php?id=2281', 'https://dojang.io/mod/page/view.php?id=2293')
if문의 기본 구조 (if와 else를 사용한 조건문의 기본구조)
if 조건문:
수행할 문장1
수행할 문장2
...
else:
수행할 문장A
수행할 문장B
...
*(참고했던 자료 : 'https://wikidocs.net/20')
배열 내림차순 정렬
a = 내림차순으로 정렬할 배열
a.sort(reverse=True)
(* 주의! a의 원본이 바뀜.)
*(참고했던 자료 : 'https://blockdmask.tistory.com/564', 'https://www.daleseo.com/python-sorted/')
배열 첫번째 요소 가져오기
배열요소의 index는 0부터 시작.
python도 js랑 똑같이 '배열[index]'라고만 해도 해당 배열의 index에 있는 배열요소를 알 수 있음
*(참고했던 자료 : 'https://lsh-story.tistory.com/39')
정수 타입으로 반환하는 파이썬 내장함수 int()
int(정수타입으로 변환할 값)
int(3.141592) # 결과는 3
*(참고했던 자료 : 'https://blockdmask.tistory.com/432')
배열 길이 구하기 len()
len() 함수 괄호안에 요소의 개수를 알고싶은 리스트를 넣어주면 됨
list = ['가', '나', '다', '라', '마']
print(list) # 값은 ['가', '나', '다', '라', '마']
print(len(list)) # 값은 6
*(참고했던 자료 : 'https://soopeach.tistory.com/15')
✏️ client입력 후 reload 없이 입력창 내용 초기화 방법
원래 입력물 제출버튼을 누르면 자동으로 reload되지만 reload가 되면 안되는 상황등일 때는 jquery를 활용한
$('인풋박스명').val(''); 을 사용하면 됨
참고 자료 ('https://sir.kr/qa/322281')
오늘 하고 있는 일(해결 중인 일)
✏️ 게시글에 p_id (고유번호) 붙이기 ---- 고유 번호는 만들었는데 post 게시물에 고유번호 붙이는 방법 생각중..
id는 같은 html에서 고유한..존재.. 즉 '중복 id값이란 있을 수 없다'는 거죠?
일단... 댓글도 같은 방식으로 활용을 할 것이라.... 1) 게시물/댓글 구별표시 2)같은 페이지에서 2번 이상 사용되는 p_id(는 class로 붙여주어도 될까나? ) ㅇ아ㅏㅇ아아러미라ㅓㅁ이ㅏㄹ!!!! 일단 찾아보자...힝..구
(230517 | 10:07) 그럼 일단 '약식 게시물'엔 id를 sp1, sp2, sp3...이런식으로주고, '상세 게시물'엔 id를 p1, p2, p3이런식으로 서버에서 p_id값을 가져와 게시물보여주기를 할 때 붙이고, 서버로 보낼 때는 문자는 다 떼어내고 숫자만 보내도록!. 이렇게...짜보갔어요... 와우 AWESOME! 잘됩니다!
✏️ 게시물-댓글 연결
댓글 저장할 때 p_id랑 같이 저장하면 => 게시물 삭제시 한번에 지울 수 있을 듯!!
'Log > TIL' 카테고리의 다른 글
| TIL_230522 | 새로운 팀, JS 주차 시작 (0) | 2023.05.22 |
|---|---|
| TIL_230519 | 내배캠 첫 프로젝트 회고 (0) | 2023.05.19 |
| TIL_230518 | 내배캠 첫 프젝의 마지막이 보이나 (0) | 2023.05.18 |
| TIL_230516 | 짱구 빼니 남는 건.. 초라함 (0) | 2023.05.16 |
| TIL_230515 | 오류와 함께한 오후 (0) | 2023.05.15 |