본문으로 바로가기

TIL_230517 | 어쨌든 00시 넘었으니 17일

category Log/TIL 2023. 5. 17. 01:56


오늘 한 일

✏️   게시글에 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랑 같이 저장하면 => 게시물 삭제시 한번에 지울 수 있을 듯!!