웹개발/[점프 투 플라스크]

[점프 투 플라스크] 질문 목록, 질문 상세 기능 만들기 및 블루프린트로 기능 분리하기 & url_for

2soon2soon 2024. 4. 10. 03:53

질문 목록, 상세기능 만들기 with Blueprint

question_views.py 일부
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)

Question.query.order_by(Question.create_date.desc()) 클래스/객체.쿼리.정렬(정렬기준/조건)

퀘스쳔테이블에서 생성일 내림차순 기준으로 정렬해서 가져온다(쿼리를 요청한다)

 

render_template('렌더링할 주소', (넘겨줄 데이터의 새 이름) = (넘겨줄 데이터))

렌더링 = 넘겨주다 정도로 이해하자

넘겨줄 주소와 넘겨줄 데이터를 인자로 넣어줘야함.

 

Question.query.get_or_404(question_id)

퀘스쳔테이블에서 question_id를 가지는 데이터를 가져온다. 없으면 404error출력.

 

-----

__init__.py에 블루프린트 객체 추가해야함.(교재.2-05)

-----

main_views.py 일부
@bp.route('/')
def index():
    return redirect(url_for('question._list'))

redirect(URL)

URL로 페이지를 이동.

 

url_for("라우팅 함수명", (넘겨줄 데이터의 새 이름) = (넘겨줄 데이터))

라우팅함수에 매핑되어 있는 URL을 리턴

question_list <- question(블루프린트의 별칭),  _list(question이라는 별칭을 가지고 있는 모듈의 라우팅함수명)

 

하드코딩vs   url_for함수
<a href="/question/detail/{{ question.id }}">{{question.subject}}</a>
<a href="{{ url_for('question.detail', question_id=question.id) }}">{{ question.subject }}</a>

url_for함수를 사용하면 유지/보수가 쉬워짐.

라우팅함수의 URL구성 방식 자체가 변하면 하드코딩한 경우는 하드코딩한부분을 일일이 다 바꿔주어야함.

url_for함수를 쓴 경우는 라우팅함수의 url만 바꾸어주면 됨.

실제 프로젝트에서 이러한 url 리팩토링은 자주 일어남.