day3
웹페이지를 만들기 위해 필요한 강의를 최대한 빠르게 들었다. 하지만 듣고 따라하며 기능 구현을 익히는 것에 급급해 이해를 하지 못했다.
대충 jinja2와 ssr의 느낌만 알아가고 jwt,쿠키 세션으로 내 db에 _id를 이용해 유저정보를 확인할 수있다는 점을 알았다.
그럼에도 내가 직접코딩을 짜려고 하니 미궁속에 있는 느낌이다 .손이 움직이지 않는다. 일단 배운 코드를 복붙의 반복으로 코드동작의 개념을 익혀갔다.
백엔드 부분을 맡으면서 처음부터 헷갈렸던 GET,POST 방식이 더 복잡하게 느껴지며 모든 강의 내용이 섞이기 시작했다.
보통 서버부터 생각하고 클라이언트 부분을 고려한다고 하는데 아직은 내눈에 보이면서 가는것이 더 와닿았다.
특히, 백엔드와 프론트엔드와의 약속인 URL의 개념을 이해하지 못해 첫날 정해놓은 URL,API 이름을 공유할 생각을 하지 못하고 내 나름대로 만들어 본다고 한 부분부터 점점 복잡해 지기 시작했다.
SSR을 사용위해 사용자 정보를 받아오는 것이 틀려 이것의 개념을 이해하는데 오래 걸렸다. 함수안에 왜 들어가는지 이유를 몰랐는데, 외부데이터를 받기 위해 함수 안에들어가며 /url/사용자정보로 동일하게 받는다는것을 알았다.
이미 db안에 있는 유저정보를 불러와 불필요한 부분을 삭제하고 페이지가 로딩될때 정보를 같이 보낸다는 것이 이해됬다.
우리는 db가 최소한으로 유지를 하기위해 노력을 했다. db에 쓸때없는 공간을 차지하지 않기 위해 2중배열을 이용해 각 db들이 필요한정보를 언제든지 불러올 수 있도록 하려고 했다.
db.users.update_one({'username':user_info["username"]},{'$push':{'profile_chall':profile_chall_receive}})
사용한 update를 위한 함수
$push : db에 배열로 저장
$each : 배열에 여러값을 저장 ($push,$addset과 필수 사용)
$set : 기존 내용을 지우고 새로운 내용을 저장
$in :
2중배열을 통해 우리가 알고있는 정보를 통해 쉽게 다른 db에 저장된 정보를 불러 올 수 있었다.
이를 이용해 불필요한 db를 제거하고 클린하게 db를 관리하려고 노력했다.여기에 3중배열을 통해 한개의 db를 더 제거하려고 노력했지만 실패했다.
$push와$each를 이용해 유저의 댓글정보를 한번에 기록하려고 노력했지만 계속해서 실패를 했다.
시간의 압박으로 최소한 기능구현을 해야했기 때문에 원래의 2중배열로 돌아가 구현에 집중했다.
@app.route('/main/<username>')
def main(username):
#
token_receive = request.cookies.get('mytoken')
try:
payload = jwt.decode(token_receive, SECRET_KEY, algorithms=['HS256'])
status = (username == payload["id"]) # 내 프로필이면 True, 다른 사람 프로필 페이지면 False
user_info = db.users.find_one({"username": username}, {"_id": False})
profile_challs = user_info["profile_chall"]
if (profile_challs is not None):
for profile_chall in profile_challs:
challenges = db.chall.find_one({"title": profile_chall}, {"_id": False})
return render_template('main.html', user_info=user_info, status=status,challenges=challenges)
except (jwt.ExpiredSignatureError, jwt.exceptions.DecodeError):
return redirect(url_for("home"))
처음에 생각 했던 정보를 꺼내는 방법은 배열을 for문으로 돌려서 하나하나 꺼내는 방식으로 접근했다.
이 코딩의 첫 에러는 for문이 None의 값을 받지 못한다는 것을 알아내어, if문으로 경우를 제거했다.
하지만 내가 불러온 정보는 한개의 title이다. 내가 필요한 정보는 한 유저가 여러개의 title정보를 필요로 하기 때문에 모두 불러와 한다는 점을 놓쳤다.
user_challenges = db.chall.find({'title':{'$in':user_challenges_title}}).sort("participate", -1)
유저가 가진 모든 title정보를 불러와서 같은 title정보를 모두 찾아야하는것으로 보완했다.
이 변수는 배열로 여러 정보를 가지고 있는 상황으로 for 문을 통해 분류후 사용해야한다.
{% for challenge in user_challenges %} {% endfor%} jinja2언어로 분류
{{challenge["title"]}} == {{challenge.title}} jinja2 언어 사용
이부분을 이해하는데 생각보다 오래걸려 시간을 많이 썻다.
아직 리스트,딕셔너리에 대한 개념이 잘 정리되지 않아 풀어내는데 생각을 많이 해봐야 알수 있다.
오늘의 목표였던 한 페이지의 모든 로직의 정보를 전달하는데 성공해서 기쁜 마음이다.
'코딩 > TIL,WIL' 카테고리의 다른 글
항해 99 DAY8 (0) | 2021.11.14 |
---|---|
항해99 WIL(Weekly I Learned) day 7 (0) | 2021.11.08 |
항해 99 day 4,5 (0) | 2021.11.07 |
항해99 Day2 (0) | 2021.11.05 |
항해99 day 1 (0) | 2021.11.03 |