flask로 구현한 웹 페이징하는 방법에 대해 질문 올립니다

조회수 1606회
@app.route('/main', methods=['GET'])
def test():
    test_list = []
    test_items = db.session.query(table_class_name).filter(table_class_name.column == 150 ).limit(9).all()
    for item in test_items:
       test_dict = {}
       test_dict['name1'] = test_items.name
       test_dict['id'] = test_items.id
       test_list.append(test_dict)
   dump_data = json.dumps(test_list)
    return render_template('test.html', dump_data=dump_data)


@app.route('/pagination', methods=['GET'])
def test_paging():
    limit_num =  request.args.get('num')
    test_list = []
   test_items = db.session.query(table_class_name).filter(table_class_name.column == 150 ).limit(9).all()  # 이부분에 리미트 범위를 둬야합니다!!!!!!!!!!!!!!!!
    for item in test_items:
       test_dict = {}
       test_dict['name1'] = test_items.name
       test_dict['id'] = test_items.id
       test_list.append(test_dict)
   dump_data = json.dumps(test_list)
    return dump_data

우선 위의 함수들은 예시인점 감안해주시고 질문 읽어주시면 감사하겠습니다
현재 최종적으로 만들려는 기능이 flask로 구현한 웹의 한 페이지에 어떤 정보들이 순차적으로 나열 되어 보여지는데 그것의 처음 데이터 개수가 9개입니다.
추가적으로 데이터를 보기위해서 read more 버튼을 눌렀을 때 5개씩 데이터가 보여지게끔 만들고 싶습니다
위의 코드는 '/main'이란 페이지에서 read more을 눌렀을 때 '/pagination'이란 곳에서 리미트 구간을 적용해서 이전에 9개 데이터가 웹에 뿌려져있으니까 9개 이후의 추가 5개만 더 가져오게끔 만들고 싶습니다.
그래서 html문서에서는 '/pagination'에 ajax로 값을 넘겨주고 받는 형식으로 작성 해두었는데 read more을 누를 때마다 추가적인 데이터가 5개씩 넘어오도록 어떻게 작성해야가능한가요?
우선 제가 생각한 방법은 read more을 눌렀을 때 num이란 곳에 5를 부여해서 json형태로 5라는 숫자를 넘기고 '/paginatnion'에서 5라는 숫자를 받고 첫 번째 클릭 했을 때는 limit 11~15 만큼 데이터가 오고 그 다음에는 처음에 넘어왔던 5에 추가적으로 5가 더해져서 10이되고 limit 16~20인 부분의 데이터가 다시 넘어오게끔 만들려 했는데 read more을 눌렀을 때마다 5라는 숫자가 어떻게 더해지게 해야되는지와 sqlalchemy를 사용한 부분에서 limit함수 문법을 어떻게 해야하는지 모르겠습니다 sqlalchemy limit 사용법도 같이 알려주시면 감사하겠습니다
질문과 관련해서 구글링을해봐도 접근자체를 잘 모르는 상태라 필요한 정보가 안 나오네요

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    대충 이런 방식일 것 같습니다.

    1. /pagination이 데이터를 응답하면, JS는 그 응답된 데이터 중 가장 마지막 것의 고유값을 어딘가에 저장해 둔다.

    • read more 버튼의 속성으로든...
    • input type="hidden" 요소에든...
    • window 객체 아래 어떤 변수에든... 하여간 아무데나

    2. 다음 번에 /pagination을 요청할 때는 저장해 둔 그 고유값을 찾아서, 요청에 그 값을 담아서 요청한다.

    3. 그러면 /pagination 요청을 처리하는 소스는 요청에 담긴 그 고유값을 받아다가, SQL 질의를 할 때 그 고유값 이후의 것으로만 한정을 하여 질의를 해 데이터를 뽑아 그걸 응답한다.

    • 예를 들어 그 고유값을 "생성시각"으로 한다면, 대충 이렇게 쿼리하면 되겠지요.
    # last_created_at 은 요청에 담긴 값임.
    # filter() 와 order_by() 모두 같은 created_at 을 기준으로 한다는 점이 중요
    next_data = db.session.query(Table).filter(Table.created_at < last_created_at).limit(5).order_by(Table.created_at)
    

    4. 1로 돌아간다.

    그렇게 어려운 개념이 아닙니다. 한번 시도해 보세요.

    • html 공간에서 read more을 눌렀을 때 ajax로 '/pagination'로 요청하여 데이터를 5개씩 가져와야하는데 '/pagination'의 sqlalchemy 문장에서 limit 5범위씩 스택을 쌓을 수 있는 방법을 알려주실 수 있으신가요? 김재민 2019.6.24 10:53
    • 말씀하시는것은 아마도 limit 5 offset x+5 방식으로 x값을 계속 올려나가는 방법을 말씀하시는 것 같은데 그렇게 할 필요가 없다는 것이 제 답변의 요지입니다. 정 하고 싶으시다면 어딘가에서 last_limit 값을 만든 다음 .limit(last_limit + 5) 메소드를 쓰시면 될텐데, 문제는 데이터를 응답하면서 "마지막 리밋값"을 같이 넘겨주는 게 성가시다는 거지요. 그냥 데이터만 넘기고, 그 데이터가 고유하게 갖는 값을 위주로 제한을 거는 것을 추천해드립니다. 엽토군 2019.6.24 20:47
    • 감사합니다 해결했습니다! 김재민 2019.6.25 19:01

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)