질문 목록과 상세 보기

Red_Panda·2021년 3월 11일
0

현재 main_views.py 파일 상태로는 localhost:5000 접속시 Pybo index라는 문구만 뜬다.
이제 Pybo index문구 대신 아까 만들었던 질문들의 제목을 출력해 볼 것이다.

main_views.py 수정하기


질문들의 제목을 보이기위해서 main_views.py파일에 1, 14, 16라인을 수정 및 새로운 코드를 작성해주었다.
render_template는 데이터(여기서는 조회된 질문 목록)를 템플릿으로 전달하면 전달받은 데이터를 화면에 그려주는 역할이다.
Question.query.order_by(Question.create_date.desc()는 작성일자를 역순으로 출력하라는 뜻인데, 정순으로 출력하고싶으면 .desc()대신 .asc()를 넣거나, 생략하면 된다. (asc()가 디폴트값)

템플릿 파일 만들기

위에서 말한 render_template 함수가 사용할 템플릿 파일이 필요하다. 이 파일은 Flask가 앱으로 지정한 모듈 아래 templates라는 디렉토리에 저장하면 별다른 설정없이, templates 디렉토리를 템플릿 디렉토리로 인식한다.

그래서 현재 앱 지정모듈인 pybo에서 templates/question/question_list.html 를 만들어준다.

파이참에서 pybo 디렉토리 우클릭 후 New Directory를 누르고 templates/question/question_list.html를 입력해주면 한방에 저 경로로 만들어진다.


question_list.html의 내용이다. 뭔가 파이썬 + html 느낌이다.
{% %}로 둘러싸인 문장은 템플릿 태그인데, 이 태그가 파이썬 코드와 연결된다.

{% if question_list %}
{% for question in question_list %}
{{ question.id }}

render_template 함수에서 question_list를 전달받았는지 체크

question_list를 전달받았으면, question_list에 저장된 데이터를 하나씩 꺼내 question 객체에 대입.

for문에서 얻은 question 객체의 id 출력.

이제 localhost:5000/ 에서 이전에 등록한 질문의 제목들이 출력된다.

여기에 이제 question.id를 이용해 몇번째 작성글인지도 출력해봤다. 근데 제목을 눌러 질문상세를 보려면 에러가 난다. 이제 질문상세 페이지를 만들면된다.

Flask에서 자주 사용 하는 템플릿 태그

1. {% if 문 %} ~ {% endif %}
파이썬과 매우 유사하지만, 다른점은 조건문들을 {% %} 감싸주면 된다. 또한 파이썬은 else문을 쓰고 끝나지만 템플릿에서는 if문을 사용하면 반드시 {% endif %}로 닫아주어야 한다.

2. {% for % } loop 속성
이것도 파이썬 for문과 비슷하다. 하지만 Flask 템플릿 태그는 편의를 위한 loop 속성을 제공한다.

{% for item in list %}
    <p>순서: {{ loop.index }} </p>
    <p>{{ item }}</p>
{% endfor %}

loop 속성의 종류
loop.index : 반복 순서, 1부터 1씩 증가
loop.index() : 반복 순서, 0부터 1씩 증가
loop.first : 반복 순서가 첫 번째 순서면 True 아니면 False
loop.last : 반복 순서가 마지막 순서면 True 아니면 False

질문 상세페이지 question_detail.html 파일을 만들어보자. 먼저 아까와 같이 question 디렉토리안에 question_detail.html 파일을 만들어준다. 그리고 아까 question_list.html처럼 출력할 내용을 넣어준다.

일단 html 파일을 만들기 전에, 해당 주소에 해당하는 블루프린트를 만들어줘야한다.

localhost:5000/detail/question_id 페이지를 요청하면 detail함수가 실행되고, question_id에 해당하는 정보로 question_detail.html 파일을 불러와 출력해준다.

현재 question의 제목, 내용을 출력하도록 작성했다.
작성 후 cmd를 켜서 flask run을 실행해주고, 질문 제목을 누르면


아까 작성한 내용(content)과 제목이 함께 나온다! Title부분은 탭이름?을 정할 수 있다

만약에 지금 url에서 question_id부분을 아직 존재하지않는 id로 접속하면 어떻게 될까??

그냥 빈페이지로 접속된다. 빈페이지로 나오면 이게 오류인지 뭔지 헷갈리니 에러 페이지를 띄워주도록 한다.

def detail 부분에서 question을 가져오는 코드를 조금 수정했다. get_or_404는 question_id가 존재하면 가져오고, 존재하지 않으면 아래와 같이 404 오류페이지(Not Found)를 표시 한다는 뜻이다.

HTTP 응답 코드 종류
200 : 성공
500 : 서버 오류
404 : 서버가 요청한 페이지 없음
503 : 서비스를 사용할 수 없음
등등 이외에도 다양한 응답코드들이 존재한다.

질문 상세 기능들의 각 기능들을 블루프린트 파일로 분리해서 관리하면 유지, 보수에 훨씬 유용하다고한다. 다음 시간에는 각 기능들을 블루프린트 파일로 분리하는 작업을 해야겠다.

profile
신입 개발자

0개의 댓글