이번 포스트에서는 ORM을 통해 데이터를 조회한 뒤 render_template()을 사용해 분리되어 있는 HTML 파일에 렌더링하여 브라우저 화면에 표시하는 코드를 작성해본다.
앞의 포스트에서 Flask_Migrate과 SQLAlchemy를 이용한 ORM 구현했다. 이제 앞에서 작성했던 main_page.py 파일을 다음과 같이 편집한다.
소스코드를 간단히 살펴보면...
- flask 모듈에서 render_template를 import 한다.
- flask 모듈에서 render_template를 import 한다.
- blogger어플리케이션의 models 모듈(models.py)에서 Post 객체(class)를 import 한다.
- Post 객체들을 조회(DB에서)하여 create_date를 기준으로 역순으로 정렬(desc())한 뒤 post_list 에 저장하고
- render_template() 함수를 이용해 views/post_list.html 파일과 post_list를 렌더링하여 브라우저에 표시
이 소스코드에서 중요한 포인트는 models.py에 정의된 객체를 import 하고난 뒤 해당 객체의 query.order_by() 메소드를 호출하는 것 만으로 DB접속, SQL실행 그리고 조회된 데이터셋을 리턴받을 수 있다는 것이다. 이 과정이 Flask_Migrate 패키지와 함께 설치된 ORM 도구인 SQLAlchemy에 의해 실행되는 것이다.
그리고 render_template()에 렌더링할 HTML 파일과 데이터셋 객체만 전달해주면 브라우저에 웹페이지가 표시된다.
다음은 데이터셋을 받아 렌더링할 HTML 파일을 다음과 같이 작성한다.
이 파일은 어플리케이션의 루트디렉토리(/www_1.0/blogger)아래에 templates 라는 디렉토리를 만들고 그 하위에 저장해야 한다. templates 라는 디렉토리는 기본으로 정의되어 있는 경로이므로 무조건 만들어줘야 하고 그 아래에 원하는 형태대로 디렉토리를 구성하면 된다. 여기에서는 views 라는 디렉토리를 만들고 html 파일을 생성했다. 앞의 화면에서 render_template()의 첫번째 파라미터로 전달된 html의 경로가 'views/post_list.html'로 정의된 이유다.
{% for post in post_list %} ~~ {% endfor %}는 파이썬 문법으로서 반복한다는 의미다. post_list에 나열되어 있는 post 객체를 하나씩 post에 옮기고 아래의 <tr>~</tr>을 계속 반복하면서 post 객체의 id, subject, create_date를 <td>~</td>에 출력하는 형태다.
post에 옮겨넣을 post 객체가 없으면 반복은 중지된다.
이 파일을 저장하고 브라우저로 접속하면 다음과 같은 화면이 표시된다.
아직 입력한 데이터가 없어 0건의 데이터가 조회되었기 때문에 헤더의 제목만 표시되었지만 실제 DB에서 조회 과정에서 에러가 없기에 이렇게 표시되는 것이다. 만약 DB 접속, 조회 과정에서 에러가 있었다면 오류페이지가 표시될 것이다.
다음 포스트에서는 포스트를 등록하는 폼을 작성하고 DB에 저장하는 코드를 작성한다.
#파이썬 #flask #render_template()