앱의 메인 기능 완성, 블로그 블루프린트(Blog Blueprint)

플라스크 튜토리얼의 여섯 번째 단계인 Blog Blueprint에서는 서비스의 핵심인 게시글 목록 보기, 작성, 수정, 삭제(CRUD) 기능을 구현합니다. 인증(Auth) 블루프린트에서 배운 기술들을 활용하여 실제 콘텐츠를 관리하는 로직을 완성하는 단계입니다.




1. 블로그 블루프린트 설정 및 등록

인증 관련 주소와 달리, 블로그는 서비스의 메인 페이지이므로 별도의 URL 접두사(url_prefix)를 두지 않습니다.

  • flaskr/blog.py: 블로그 관련 뷰 함수들을 정의합니다.
  • 메인 페이지 설정: 애플리케이션 팩토리(__init__.py)에서 블로그 블루프린트를 등록할 때, app.add_url_rule('/', endpoint='index')를 추가하여 루트 주소(/)가 블로그 인덱스 페이지가 되도록 설정합니다.



2. 주요 기능(View) 상세 설명

블로그 에이전트가 수행하는 핵심 동작들입니다.

기능 URL 패턴 설명
목록 (Index) / 모든 게시글을 최신순으로 정렬하여 보여줍니다. SQL의 JOIN을 사용하여 작성자 이름(username)도 함께 가져옵니다.
작성 (Create) /create 로그인이 필요한 페이지이며, 제목과 본문을 입력받아 DB에 저장합니다.
수정 (Update) /<id>/update 특정 게시글의 ID를 받아 내용을 수정합니다. 본인이 쓴 글인지 확인하는 로직이 필수입니다.
삭제 (Delete) /<id>/delete 특정 게시글을 삭제합니다. 별도의 화면 없이 POST 요청을 받으면 처리 후 인덱스로 리다이렉트합니다.



3. 공통 함수: get_post 활용

수정과 삭제 기능 모두 "DB에서 글을 가져오고, 작성자가 맞는지 확인"하는 과정이 필요합니다. 중복 코드를 방지하기 위해 get_post(id) 함수를 만들어 활용합니다.

  • 404 Not Found: 게시글 ID가 존재하지 않을 때 발생시킵니다.
  • 403 Forbidden: 로그인은 했지만 본인의 글이 아닐 때 수정을 시도하면 발생시킵니다.



4. 템플릿(HTML) 주요 포인트

  • g.user 활용: 로그인이 되어 있을 때만 "New(글쓰기)" 버튼이 보이도록 제어합니다.
  • 작성자 전용 메뉴: 게시글 목록이나 상세 페이지에서 현재 로그인한 유저가 작성자(g.user['id'] == post['author_id'])일 때만 "Edit(수정)" 링크가 나타나게 합니다.
  • loop.last: 진자(Jinja) 템플릿의 특수 변수로, 게시글 사이사이에만 구분선(<hr>)을 넣기 위해 사용합니다.



실전 팁: 경로 매개변수 사용법

수정이나 삭제 시 사용되는 /<int:id>/update와 같은 주소 방식은 매우 중요합니다.

  • <int:id>: 주소창에 들어오는 값을 정수(int) 타입으로 변환하여 함수 인자로 전달합니다.
  • 만약 id만 적으면 문자열로 인식되므로, 숫자로 처리해야 하는 DB 연산 시 주의해야 합니다.



Official Flask Tutorial: Blog Blueprint
블로그 블루프린트까지 완성했다면 이제 플라스크의 기본적인 MVC(Model-View-Controller) 흐름을 모두 익힌 셈입니다. 직접 글을 등록해보고 삭제해보며 데이터베이스에 데이터가 어떻게 쌓이는지 확인해보세요.