[파이썬] 나만의 스팀잇 블로그 만들기 #3 - 페이징 구현

in kr •  9 months ago  (edited)

안녕하세요. @anpigon입니다.

나만의 스팀잇 블로그 만들기 세 번째 강좌입니다. 이 시리즈는 개발 지식이 전혀 없는 분들도 쉽게 따라 할 수 있습니다.

그리고 사용한 소스는 GitHub 저장소에 올려놓았습니다.


이전 글



글 목록 페이징 구현하기


이번에는 다음 페이지의 글을 가져오는 페이징을 구현할 것이다. 다음 페이지를 위한 버튼은 블로그 목록 페이지 맨 하단에 있다. 못 찾는 분들이 계실까봐 아래 화면에서 붉은 박스로 표시하였다.


글 목록에서 다음 페이지 버튼 수정하기

위 화면에 보이는 "OLDER POSTS" 버튼을 수정할 것이다. templates/blog/post_list.html 파일을 열어서 아래와 같이 수정한다.

<div class="clearfix">
  {% if next %}
    <a class="btn btn-primary float-right" href="?next={{ next }}">Older Posts &rarr;</a>
  {% endif %}
</div>

{% if next %} {% endif %} 를 사용하여 다음 페이지의 글이 있을 때만 버튼이 보이도록 하였다. 그리고 href="?next={{ next }}" 가 다음 페이지로 이동하게 해주는 핵심 코드이다. 이제 버튼을 클릭하면 url을 통해 next 값을 서버에 넘겨줄 것이다.

코드의 어디 부분을 수정하는지 잘 모르겠으면 아래 화면을 참고하자.


페이징 처리 구현하기

방금 수정한 버튼이 동작하게 하려면 페이징 처리를 구현해야 한다. web/blog/ 디렉토리에서 views.py 파일을 찾아 클릭하여 편집화면으로 이동한다.

페이징을 구현하려면 def post_list() 함수를 수정해야 한다. 다음 설명을 잘 읽고 수정해보자. 어려울 것 같지만 막상 해보면 전혀 어렵지 않다.


우리는 OLDER POSTS 버튼을 클릭했을 때 url을 통해 next 값을 넘겨주도록 수정하였다. 이제 넘어온 url에서 next 값을 조회해 보자. request.GET.get()를 함수를 사용하면 next 값을 조회할 수 있다.

def post_list(request, limit=20):
  
    # request url에서 next 파라미터값을 가져온다.
    start_entry_id = int(request.GET.get('next', '0'))



다음은 스팀잇 API 서버에서 글을 가져오는 코드를 수정한다. 이전에 (USERNAME, 0, limit) 로 넘겨주던 인자값을 (USERNAME, start_entry_id, limit + 1)로 수정하였다. 추가 설명하면, start_entry_id 인자값을 추가하고 limit를 +1를 하였다. limit + 1를 한 이유는 마지막 데이터에서 다음 페이지의 entry_id를 가져오기 위해서이다.

    # 스팀잇에서 게시글 가져오기
    data = '''{
        "jsonrpc": "2.0",
        "method": "follow_api.get_blog",
        "params": {"account": "%s", "start_entry_id": %i, "limit": %i},
        "id": 1
    }''' % (USERNAME, start_entry_id, limit + 1)
    response = requests.post(URL, data=data)



그리고 for blog in blogs: 코드 바로 아래에 entry_id 값을 조회하는 코드를 추가한다. entry_id 값은 다음 페이지를 조회하기 위한 next 값으로 사용된다.

        for blog in blogs:
            entry_id = blog['entry_id']
            blog = blog['comment']



가져온 글의 수가 limit보다 작으면 entry_id 값을 0으로 초기화한다. 가져온 글의 수가 limit보다 작다는 것은 다음 페이지에서 가져올 수 있는 글이 없다는 의미이다.

    if len(posts) < limit:
        entry_id = 0



마지막으로 postslimit 길이로 자른다. 왜냐하면 posts의 마지막 데이터는 페이징 처리를 위해 entry_id 값을 읽어오기 위한 데이터라서 필요 없기 때문이다. 그리고 템플릿 html 으로 전달하는 인자값에 'next': entry_id 를 추가한다.

    posts = posts[:limit]
    return render(request, 'blog/post_list.html', {'posts': posts, 'next': entry_id })



아래에 post_list 함수의 전체 코드를 첨부하였으니 참고하자.

def post_list(request, limit=20):

    start_entry_id = int(request.GET.get('next', '0'))

    data = '''{
        "jsonrpc": "2.0",
        "method": "follow_api.get_blog",
        "params": {"account": "%s", "start_entry_id": %i, "limit": %i},
        "id": 1
    }''' % (USERNAME, start_entry_id, limit + 1)
    response = requests.post(URL, data=data)

    posts = [] # 게시글 목록
    if response.status_code == 200: # 응답이 성공이라면
        data = json.loads(response.text) # JSON 파싱

        blogs = data['result']['blog']
        for blog in blogs: # 리스트에서 필요한 데이터만 가져오기
            entry_id = blog['entry_id']
            blog = blog['comment']
            html = md.convert(blog['body']) 
            post = {
                'title': blog['title'],
                'author': blog['author'],
                'permlink': blog['permlink'],
                'created': parse_time(blog['created']),
                'body': html[:200], # 길이 200으로 자르기
            }
            posts.append(post)

    if len(posts) < limit:
        entry_id = 0
    posts = posts[:limit]

    return render(request, 'blog/post_list.html', {'posts': posts, 'next': entry_id })



이번 시리즈는 구현하는 시간보다 스팀잇에 글 쓰는 시간이 더 오래 걸리는 것 같네요. ㅎㅎ 따라 하다가 모르는 부분이 있으면 댓글에 질문 남겨주세요. 그리고 kr-dev 태그에 개발관련 글을 올리면 제가 보팅해드립니다.

여기까지 읽어주셔서 감사합니다.


스팀잇에는 밥 로스 아저씨를 아는 분들이 많이 있을까요?


크리에이티브 커먼즈 라이선스
이 저작물은 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

이 시리즈는 정말 따라해 보고 싶네요.
몇시간 시간 내서..

가즈아!! 개발..

시간 나실때 한번 따라해보세요~^^
코딩은 재미있어요.

예. 꼭 해 보고 싶고, 언젠가 꼭 해 볼게요.
좋은 글 계속 올려주세요.

중간에 기능 설명하려고 복잡해보이지만 따라하시는 분들은 post_list 내용 전체를 그대로 복붙해서 하면 바로 되네요
2탄 까지 하시는 분들은 이번 내용은 5분이면 끝납니다 ㅎㅎ
작성해주신 안피곤님에겐 넘 순식간이지만요.. 3탄 까지 완료!
http://hjh0827.pythonanywhere.com

오올 이번 강좌는 5분만에 뚝딱 하셨군요. 잘하셨습니다~ㅎㅎㅎ
금방 금방 따라해주시니 기분이 좋습니다.ㅋ

감사히 잘 보고 있습니다!

잘 봐주셔서 감사합니다.🙂

개발지식이 없는 분도 따라하실 수 있습니다는 늘 듣는 말이지만,
거의 무리수. ㅋㅋㅋ

형아... 내가 해볼께... 꾸준함으로 승부한다 ㅋㅋㅋㅋㅋㅋㅋㅋ

꾸준함으로....ㅋㅋㅋ

이 시리즈는 개발 지식없는 분들도 복사&붙여넣기 신공으로 쉽게 구현할 수 있습니다.
그래서 개발 지식이 없는 분도 무리없이 따라하실 수 있습니다.ㅋㅋ

오호. 일단 툴을 깔고 환경설치까지 잘 가면 그럴수도 있을듯

툴 까는 것도 아니고,
pythonanywhere.com 에 접속해서 그냥 하면 되는 것 같은데요..
저도 아직 안해봐서리.. ㅋㅋ

오호. 읽는 사람들이 된다면 되는거죠. ㅋㅋㅋㅋ

ㅋㅋ 직접 해 보면 안될 수도 있겠지만,
저기 누가 20분 만에 따라 했다는 사람도 있네요..
능력자일 수도 있겠지만요.. ㅋㅋ

오홋..재미있을 것 같습니다. 저장해두고 따라해봐야겠네요^^
근데 busy에서 저장한 글은 어디서 볼 수 있는지를 모르겠네요;;;;

재미있게 봐주셔서 감사합니다. 나중에 시간날때 한번 해보세요.ㅋ

그리고 busy에서 글 쓰기 화면으로 들어가면 오른편쪽에 "마지막 임시 저장 글" 라는 것이 있어요.
거기에 저장한 글이 있는지 한번 찾아보세요.

모바일로 볼때는 없었는데, PC로 보니 북마크 메뉴가 따로 있네요^^
답변 감사합니다~

찾아서 다행이네요.^^

이...이게 왕초보용이란거죠? ㅋㅋㅋ 아... 제가 파이썬 왕초보라...

하다 보니 난이도가 조금 올라갔네요. 그래서 마지막에 밥 로스 아저씨 사진을 넣어봤어요.ㅋ
밥 로스 아저씨가 그림을 완성하고 나서 했던 대사 참 쉽죠? 가 기억납니다.

사실은 저도 파이썬 초보에요.ㅋ
머신러닝을 공부하면서 보기 시작했으니 사용한 지 이제 한 달 정도 됐네요.
제가 공부해보니 파이썬은 초보가 배우기 쉬운 언어라고 생각해요.ㅎㅎ

ㅋㅋ 저도 몇번 애용했던 짤입니다~ ㅋㅋ 그런것 같아요. 먼가 단축키로 다 되는 느낌 ㅎㅎ 쇼미더 머니 친것 같은 편리함.

버전별로 까칠하게 구는게 맘에 안드는 점이 있었네요. 보통 과거 버전 호환성을 그리 까칠하게 두지 않는것 같은데 이녀석은...

저도 파이썬 버전 호환 안되는 문제는 황당했습니다.
처음 시작할때 파이썬은 최신 버전 3.7을 설치하고 문서는 옛날 파이썬2을 보면서 삽질을 많이 했었죠ㅋㅋㅋ

그리고 저는 파이썬 장고에서 웹페이지가 금방 만들어지는 것을 보고는 신세계를 경험한 기분이었습니다. 아직도 얼떨떨합니다.ㅋㅋ

안피곤님 저 이거 조만간 시도해볼께요 ㅋㅋ
요즘은 너무 바빠서...ㅎㅎ
미루면 못하던데....ㅜㅜ

나중에 시간나실때 해보세요.🙂 그리고 바쁜일이 얼른 끝나길 바래요~
저는 @jisoooh0202님이 올리는 뉴비 시리즈 글을 제일 재미있게 보고있어요.ㅋ

아이고 여기까지 완료했습니다. ㅎㅎㅎ

3.jpg

  ·  9 months ago (edited)

3번ㅉ ㅐ시도하니까 이제 조금 빠르네요..

우왕~~ 성공 축하드립니다. 역시 금손 뽀돌님이시네요.^^

4번째까지 다 만든거같아요 ^^

post_list 함수 코드 중
가장 처음 삽입해야 하는
start_entry_id = int(request.GET.get('next', '0'))
이중에 int 설정해줘야 하는 건가요?

위에서는 int 설정 안했는데 복붙하라고 붙여 주신곳엔 붙어있네요

제가 공부하는 셈 치는 거라 복붙않하고 다 치고 있어서 발견 했네요.

저는 int 설정 안해줘도 오류는 안나네요.

오타를 발견해주셨네요. 감사합니다.
그리고 오류가 안나서 다행이네요.ㅋ

Posted using Partiko Android