기록과 정리의 공간

[프로젝트] Flask로 게시판 만들기 - 4 본문

프로젝트/게시판1

[프로젝트] Flask로 게시판 만들기 - 4

딸기맛도나쓰 2020. 8. 4. 22:43

Flask로 게시판 만들기 - 4 (참고 강의 링크-인프런 강의)
(공부 하며 기록이 필요한 부분들만 정리함)

  • 개발 환경 : windows 10 / Python 3.8.1 / vscode
  1. 검색 기능 구현하기

1. 검색 기능 구현하기 (전체 코드X, 일부 코드만 가져옴)

  • list.html
    • type이 button인 input엘리먼트를 클릭하면 search()함수가 호출된다.
    • 이 함수는 id가 search와 keyword인 엘리먼트를 찾아 해당 엘리먼트 value 속성의 값을 각각 변수에 저장하고, 조건문을 통해 v_search값이 ""가 아닐 때, Window객체의 프로퍼티인 location객체와 Flask의 url_for함수를 통해 파이썬 코드에 작성된 board_list()함수를 실행시키는 url로 이동시킨다. 이 때, 두 변수의 값을 search와 keyword라는 파라미터의 값으로 넘겨준다.
<script>
    function search() {
        var v_search = document.getElementById("search").value;
        var v_keyword = document.getElementById("keyword").value;

        if(v_search == "") {
            return false
        } else {
            self.location.href = "{{url_for('board_list')}}?search=" + v_search + "&keyword=" + v_keyword;
        }
    }
</script>

(중략)

<!-- 검색 기능을 위한 코드 시작 -->
<select name="search" id="search">
    <option value="">검색대상</option>
    <option value="0" {% if search == '0' %} selected {% endif %}>제목</option>
    <option value="1" {% if search == '1' %} selected {% endif %}>내용</option>
    <option value="2" {% if search == '2' %} selected {% endif %}>제목+내용</option>
    <option value="3" {% if search == '3' %} selected {% endif %}>작성자</option>
</select>
<input type="text" name="keyword" id="keyword" {% if keyword != None %} value={{keyword}} {% endif %}>
<input type="button" value="검색" onclick="search()">
<!-- 검색 기능을 위한 코드 끝 -->
  • board_list()함수
    • request.args.get()로 list.html의 JS코드 에서 넘겨준 search, keyword파라미터의 값을 받아와 변수에 저장한다.
    • query : 최종적으로 완성된 쿼리가 들어갈 변수. 예를 들어, 검색 대상을 제목으로 하고 '기초'로 검색하면 {'$or': [{'title': {'$regex': '기초'}}]}
    • search_list : 검색 상태를 추가할 리스트 변수. 예를 들어, 검색 대상을 제목으로 하고 '기초'로 검색하면 [{'title': {'$regex': '기초'}}]
      • $regexMySQL의 LIKE와 비슷한 역할을 한다고 생각하면 된다. 예를 들어, {"title": {"$regex": keyword}}는 컬렉션에서 title에 keyword가 포함된 모든 데이터를 가져온다. (참고 링크 : (MongoDB - $regex) / (MongoDB - $or) )
    • find함수의 인자로 query를 넘긴다.
@app.route("/list")
def board_list():
    board = mongo.db.board
    # 페이지 값 (값이 없는 경우 디폴트값 = 1)
    page = request.args.get("page", 1, type=int)
    search = request.args.get("search")
    keyword = request.args.get("keyword")

    # 최종적으로 완성된 쿼리를 만들 변수
    query = {}
    # 검색어 상태를 추가할 리스트 변수
    search_list = []

    if search == '0':
        search_list.append({"title": {"$regex": keyword}})
    elif search == '1':
        search_list.append({"contents": {"$regex": keyword}})
    elif search == '2':
        search_list.append({"title": {"$regex": keyword}})
        search_list.append({"contents": {"$regex": keyword}})
    elif search == '3':
        search_list.append({"name": {"$regex": keyword}})

    # 검색 하고자 하는 대상이 한개라도 존재할 경우 query 변수에 $or 리스트를 쿼리한다.
    if len(search_list) > 0:
        query = {"$or": search_list}

    (중략)

    datas = board.find(query).skip((page - 1) * limit).limit(limit) # find()의 인자로 query를 넘겨줌
    # 게시물의 총 개수
    tot_count = board.find(query).count() # find()의 인자로 query를 넘겨줌

    (중략)

    return render_template(
        "list.html",
        datas=datas,
        limit=limit,
        page=page,
        block_start=block_start,
        block_end=block_end,
        last_page_num=last_page_num,
        search=search,
        keyword=keyword)
Comments