Flask 질문 목록 조회와 질문 상세 조회 기능 만들기



1. 게시판 질문 목록 출력


Question.query.order_by로 질문 목록은 얻을 수 있다. order_by 함수는 조회 결과를 정렬해 준다. Question.create_date.desc 는 조회된 질문 목록을 작성일시 기준 역순으로 정렬 하라는 의미이다. render_template은 템플릿 파일을 화면에 그려준다. <!–

# main_views.py

from flask import Blueprint, render_template
from pybo.models import Question

bp = Blueprint('main', __name__, url_prefix='/')


@bp.route('/hello')
def hello_pybo():
    return 'Hello, Pybo!'


@bp.route('/')
def index():
    question_list = Question.query.order_by(Question.create_date.desc())
    return render_template('question/question_list.html',
                           question_list=question_list)

–>

2. 질문 목록 템플릿 파일 작성


{\% \%}로 둘러싸인 문장을 템플릿 태그라고 한다.

<!-- flask > projects > firstproject > pybo > temlates > question_list.html -->

{\% if question_list \%}
<ul>
  {\% for question in question_list \%}
  <li><a href="/detail/">}</a></li>
  {\% endfor \%}
</ul>
{\% else \%}
<p>질문이 없습니다.</p>
{\% endif \%}

분기문 태그
> {\% if 조건문1 \%}
<p>조건문1에 해당 시 실행</p> {\% elif 조건문2 \%}
<p>조건문2에 해당 시 실행</p> {\% else \%}
<p>조건문1, 2 모두 해당하지 않을 시 실행</p> {\% endif \%}

반복문 태그
> {\% for item in list \%}
<p>순서 : </p> <p></p> {\% endfor \%}

반복문의 loop 속성

loop 속성 설명
loop.index 반복 순서, 1부터 1씩 증가
loop.index() 반복 순서, 0부터 1씩 증가
loop.first 반복 순서가 첫 번째 순서이면 True 아니면 Fals
loop.last 반복 순서가 마지막 순서이면 True 아니면 Fals

객체 태그 : {{ 객체 }}, {{ 객체.속성 }}



3. 게시판 상세 조회 기능


# flask > projects > firstproject > pybo > views > main_views.py

@bp.route('/detail/<int:question_id>/')
def detail(question_id):
    question = Question.query.get(question_id)
    return render_template('question/question_detail.html', question=question)
<!-- flask > projects > firstproject > pybo > templates > question > question_detail.html -->

<h1></h1>

<div></div>
# flask > projects > firstproject > pybo > views > main_views.py

@bp.route('/detail/<int:question_id>/')
def detail(question_id):
    # question = Question.query.get(question_id)
    question = Question.query.get_or_404(question_id)
    return render_template('question/question_detail.html', question=question)

get_or_404 함수 경우 404 페이지를 출력해 준다.



4. 블루프린트로 기능 분리


# flask > projects > firstproject > pybo > views > question_views.py
from flask import Blueprint, render_template
from pybo.models import Question

bp = Blueprint('question', __name__, url_prefix='/question')


@bp.route('/list/')
def _list():
    question_list = Question.query.order_by(Question.create_date.desc())
    return render_template('question/question_list.html',
                           question_list=question_list)


@bp.route('/detail/<int:question_id>/')
def detail(question_id):
    question = Question.query.get_or_404(question_id)
    return render_template('question/question_detail.html', question=question)
# flask > projects > firstproject > pybo > __init__.py
from flask import Flask
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy

import config

db = SQLAlchemy()
migrate = Migrate()


def create_app():
    app = Flask(__name__)
    app.config.from_object(config)

    # ORM
    db.init_app(app)
    migrate.init_app(app, db)
    from . import models

    from .views import main_views, question_views
    app.register_blueprint(main_views.bp)
    app.register_blueprint(question_views.bp)

    return app
<!-- flask > projects > firstproject > pybo > temlates > question_list.html -->

{\% if question_list \%}
<ul>
  {\% for question in question_list \%}
  <li>
    <a href="\{\{ url_for('question.detail', question_id=question.id)\}\}"
      ></a
    >
  </li>
  {\% endfor \%}
</ul>
{\% else \%}
<p>질문이 없습니다.</p>
{\% endif \%}