flask-paginate로 검색결과 페이지화

개요



flask로 작성한 검색의 WEB 앱을 flask-paginate로 페이지 네이션 (페이지 나누기)했습니다.
페이지 전환으로 조금 걸렸기 때문에 기사로 하겠습니다.

환경


  • flask 1.1.2
  • flask-paginate 0.7.1

  • 첫회 작성(불량 있음)



    ~/result 페이지로부터 검색 조건을 POST로 request.form로서 취득해, 검색한 결과가 results(리스트)로서 얻을 수 있는 상태입니다.
    from flask import Flask, request, redirect, url_for, render_template, flash, session
    from flask_paginate import Pagination, get_page_parameter
    
    app = Flask(__name__)
    
    @app.route('/result', methods=['GET', 'POST'])
    def show_results():
    
        # request.formを用いた、なんらかの検索
    
        results = [...]    # 検索結果(リスト)
    
        page = request.args.get(get_page_parameter(), type=int, default=1)
        per_page = 1
        res = results[(page-per_page)*per_page: page*per_page]
        pagination = Pagination(page=page, total=len(results), per_page=per_page, css_framework='bootstrap4')
    
        return render_template('index.html', books=res, request_form=request.form, pagination=pagination)
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    위 코드는 다음과 같은 페이지 네이션을 표시합니다.


    결과가 검색 결과이면 숫자 2, 3을 클릭하여 페이지 전환을 수행하면 올바른 결과가 표시되지 않습니다.
    검색 조건을 저장하지 않으므로 페이지 전환이 발생하면 검색 조건없이 다시 검색됩니다.
    (flask-paginate의 페이지 전환은 GET이므로 검색 조건을 얻을 수 없습니다.)

    개선 (세션 사용)



    검색 조건을 저장하기 위해 검색하기 전에 다음을 수행했습니다.
  • POST의 경우에만 request.form을 session에 저장합니다.
  • POST 또는 GET 모두 세션에서 request.form을 할당합니다. session.get('request_form')이 없으면 None이 반환됩니다.
  • from flask import Flask, request, redirect, url_for, render_template, flash, session
    from flask_paginate import Pagination, get_page_parameter
    
    app = Flask(__name__)
    app.secret_key = b'XXXXXXXXX'                     # 追加 sessionを利用するために必要
    
    @app.route('/result', methods=['GET', 'POST'])
    def show_results():
        if request.method == 'POST':                  # 追加 
            session['request_form'] = request.form    # 追加 
    
        request.form = session.get('request_form')    # 追加 
    
        # request.formを用いた、なんらかの検索
    
        results = [...]    # 検索結果(リスト)
    
        page = request.args.get(get_page_parameter(), type=int, default=1)
        per_page = 1
        res = results[(page-per_page)*per_page: page*per_page]
        pagination = Pagination(page=page, total=len(results), per_page=per_page, css_framework='bootstrap4')
    
        return render_template('index.html', books=res, request_form=request.form, pagination=pagination)
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    이제 페이지 전환은 session에 저장된 검색 조건에서 검색을 수행하므로 올바른 결과가 표시됩니다.

    참고



    Flask Paginate(공식)
    Flask의 페이지 네이션은 Flask-paginate를 사용하면 쉽게 구현할 수 있습니다.
    검색 결과 페이지 네이션 정보 (stack overflow) : Django의 예

    좋은 웹페이지 즐겨찾기