[해설 2] 프로젝트 해설 2: 전체 코드 기능 설명 2

오레오·2023년 12월 6일
0

오픈SW플랫폼

목록 보기
7/8

[해설 1]에 이어지는 글입니다.
✨해설 1 보러가기

💡 7 ~ 8 [해설2] : 백_황혜진
리뷰 작성, 등록한 리뷰 조회, 상품별 리뷰 조회 화면, 리뷰 상세보기 화면, 회원별 마이페이지 구현

7. 사용자의 전체 구매 목록 화면의 페이지네이션 구현

[app.py]

# 5~7
# 리뷰작성 -> 구매내역페이지
@application.route("/5~7/reg_reviews")
def view_reg_review():
    if 'id' not in session or not session['id']:
        flash('리뷰를 작성하려면 로그인을 해주세요.')
        return redirect(url_for('login'))
    else:
        #return render_template("5~7/reg_reviews.html")
        page = request.args.get("page", 0, type=int)
        per_page=6
        per_row=1
        row_count=int(per_page)
        start_idx=per_page*page
        end_idx=per_page*(page+1)

        user_id = session.get('id')
        purchase = DB.get_purchase(user_id)        #구매내역 불러오기
        if purchase == None:                       #구매내역 
            none = "Y"
            return render_template("/5~7/mypage.html",none=none)
        else:
            none = "N"
        item_counts = len(purchase)
        purchase = dict(list(purchase.items())[start_idx:end_idx])
        tot_count = len(purchase)
        for i in range(row_count):
            if (i == row_count-1):
                locals()['data_{}'.format(i)] = dict(list(purchase.items())[i*per_row:])
            else:
                locals()['data_{}'.format(i)] = dict(list(purchase.items())[i*per_row:(i+1)*per_row])
        return render_template("/5~7/mypage.html",none=none, purchase=purchase.items(), row1=locals()['data_0'].items(), row2=locals()['data_1'].items(),
                           row3=locals()['data_2'].items(), row4=locals()['data_3'].items(),row5=locals()['data_4'].items(), row6=locals()['data_5'].items(),
                           limit=per_page, page=page, page_count=int((item_counts/per_page)+1), total=item_counts)
  • 현재 로그인하고 있는 아이디의 구매내역을 불러와서 한 페이지에 6개씩 보여주도록 페이지네이션 구현
if 'id' not in session or not session['id']:
        flash('리뷰를 작성하려면 로그인을 해주세요.')
        return redirect(url_for('login'))
    else:
  • 로그인이 되어 있지 않을 경우, 로그인 화면으로 연결한다.
user_id = session.get('id')
        purchase = DB.get_purchase(user_id)        #구매내역 불러오기
        if purchase == None:                       #구매내역 
            none = "Y"
            return render_template("/5~7/mypage.html",none=none)
else:
            none = "N"
            item_counts = len(purchase)
            purchase = dict(list(purchase.items())[start_idx:end_idx])
            tot_count = len(purchase)
            for i in range(row_count):
                if (i == row_count-1):
                    locals()['data_{}'.format(i)] = dict(list(purchase.items())[i*per_row:])
                else:
                    locals()['data_{}'.format(i)] = dict(list(purchase.items())[i*per_row:(i+1)*per_row])
            return render_template("/5~7/mypage.html",none=none, purchase=purchase.items(), row1=locals()['data_0'].items(), row2=locals()['data_1'].items(),
                           row3=locals()['data_2'].items(), row4=locals()['data_3'].items(),row5=locals()['data_4'].items(), row6=locals()['data_5'].items(),
                           limit=per_page, page=page, page_count=int((item_counts/per_page)+1), total=item_counts)
  • get_purchase() 함수를 사용해서 아이디에 해당하는 구매내역을 불러온다.
  • 구매내역 없을 경우 none값만 구매목록화면으로 보낸다.
  • Tip : ‘NoneType’ 객체에는 ‘items()’ 메서드가 없음

따라서, 구매내역이 없을 때(purchase = none) purchase.items()에서 오류가 발생하기 때문에 구매내역이 none일때와 아닐 때 두 경우로 나눠서 접근함

  • 구매내역이 있을 때, 해당페이지에 표시할 구매내역들만 추출하여 row_i에 담아서 html로 전송

[database.py]

def get_purchase(self, user_id):
        purchase = self.db.child("user_purchase_history").get().val() 

        for id, purchase_items in purchase.items(): #각 내역에 대해 반복
            if id == user_id:                       #key값이 사용자 id와 같으면 그 구매내역 반환
                return purchase_items
        return None
  • firebase에 "user_purchase_history"라는 특정 위치에 저장되어 있는 각 사용자의 구매내역 전체를 불러온다.
  • 반복문을 사용하여 사용자id에 해당하는 구매내역을 찾아서 반환하고, 찾지 못할 경우 none을 반환한다.

8. 상품 세부 화면에서 리뷰 작성 버튼 클릭 후 해당 상품에 대한 리뷰 작성 화면으로 연결

[app.py]

Tip : 동적라우팅 사용하여 상품이름으로 라우팅

동적라우팅(Dynamic Routing): 라우팅이 사용자의 요청이나 다른 동적인 조건에 따라 동적으로 결정되는 프로세스. URL 경로의 일부가 고정되어 있지 않고 가변적인 경우에 적용.

@application.route("/reg_review_init/<name>/")
def reg_review_init(name):
    if 'id' not in session or not session['id']:
        flash('리뷰를 작성하려면 로그인을 해주세요.')
        return redirect(url_for('login'))
    else:
        info = DB.get_item_byname(name)
        item_name = info.get("item_name",None)
        professor = info.get("professor",None)
        subject = info.get("course_number",None)
        writer = info.get("writer",None)
        reviewer = session['id']
        return render_template("5~7/reg_reviews.html", writer=writer, item_name = item_name, reviewer=reviewer, professor=professor,subject=subject)
  • 동적라우팅으로 받은 매개변수을 이용해서 get_item_byname() 함수를 호출하여 그 상품에 대한 정보를 리뷰작성화면으로 넘겨준다.

[database.py]

def get_item_byname(self, name):
        items = self.db.child("item").get()
        target_value=""
        print("#############", name)
        for res in items.each():
            key_value = res.key()
            if key_value == name:
                target_value=res.val()
        return target_value
  • firebase에 "item"라는 특정 위치에 저장되어 있는 각 상품내역 전체를 불러온다.
  • 반복문을 사용하여 상품이름에 해당하는 상품정보를 찾아서 반환한다.
profile
2023-2 오소플

0개의 댓글