앞의 포스트에서 Flask_Migrate를 이용하여 ORM을 구현하고 MariaDB에 저장되어 있는 테이블에서 글의 목록을 조회하는 파이썬 코드를 작성하였다. 그리고 조회한 글의 목록을 보여주는 post_list.html 이라는 HTML 페이지를 작성하고 render_template() 함수를 이용해 출력하였다.

[Flask 웹 프레임워크] render_template()을 사용하여 HTML 렌더링하기

 

이제 글을 작성할 수 있는 간단한 FORM을 작성하고 Flask_Migrate에 포함되어 있는 SQLAlchemy의 ORM 연동기능을 통해 DB에 저장하는 코드를 기존의 소스코드에 추가해본다. DB연동은 이전에 작성한 포스트를 참고하기 바란다.

[Flask 웹 프레임워크] Flask Migrate를 이용한 ORM 적용하기 (SQLAlchemy)

 

먼저 다음과 같이 글의 목록을 보여주는 post_list.html 파일의 아래에 글쓰기 페이지를 호출하는 <A> 태그를 추가한다.

포스트 작성을 위한 <A> 태그 추가

12번 라인에 post_write를 호출하는 라인을 추가했다.

 

그리고 post_write가 호출되었을 때 렌더링하여 보여줄 post_write.html 파일을 다음과 같이 작성하여 template/views/ 디렉토리에 저장한다.

post_write.html

이 소스코드는 그냥 HTML 소스다. 별다를게 없다. 

다만 이 post_write.html 파일을 서버모듈인 main_page.py에서 post_write로 라우팅해줘야 한다.

post_write 처리 로직이 추가된 main_page.py

17번째 라인에서 post_write 호출 시 GET 메소드와 POST 메소드를 처리해줌을 명기한다. 그렇지 않으면 post_write.html 페이지가 표시되고 제목과 글을 입력한 뒤 "제출" 버튼을 누르면 메소드가 허용되지 않는다는 에러메시지가 나온다.
그리고 경로에 route 경로인 post_write의 앞에 '/' 는 넣어주지 않는다. 10번 라인에서 bp에 url_prefix로 '/'가 기본적으로 붙도록 되어 있기 때문이다.
19번째 라인에서 23번째 라인까지는 post_write가 호출되었을 때 HTTP 메소드가 "POST"인 경우 실행되는 코드다. 그리고 24번째 코드에서 "POST" 메소드가 아닌 경우 25번째의 post_write.html 이 표시되도록 한다. 즉 POST 메소드가 아니면 글을 작성하는 입력 양식이 보여지고 POST 메소드인 경우 DB에 저장하도록 하는 것이다.
20번째 라인에서는 POST 메소드로 넘어온 subject와 contents를 포함하며 현재 시간을 갖는 posting_date를 포함하는 Post 객체를 생성하고 post 변수에 담는다.
21번째 라인에서 db 객체에 포함된 session 객체의 add 메소드를 이용해 post를 DB에 저장한다. 22번째는 라인은 말 그대로 commit 한다.  [  db.session.add()  ]

MariaDB는 원래가 Auto Commit이다. 하지만 Flask-Migrate에 포함되어 ORM을 구현해주는 SQLAlchemy가 제공하는 메소드들(add())를 사용하여  DB에 데이터를 저장할 땐 일단 Session에 저장하고 commit() 메소드를 호출해야 실제로 DB에 저장된다는 것을 기억하자.

23번째 라인에서 DB에 저장하고 난 뒤 브라우저의 URL을 redirect 함수를 이용해 / 즉 main_page.py의 bp에서 라우팅하고 렌더링하는 post_list.html이 표시되도록 한다. 즉 포스트의 목록을 보여준다.

위의 코드가 모두 정상적으로 작성되었다면 다음과 같이 post_write 페이지를 볼 수 있다.

post_write 에서 보여지는 post_write.html

제출 버튼을 누르게 되면 다음과 같이 제목과 내용이 저장되고 난 뒤 목록 페이지로 이동(redirect())하게 된다.

저장한 뒤 포스트 목록이 표시되는 post_list.html

 

다음엔 이 두 화면을 예쁘게 꾸미는 CSS를 적용해보자.

 

#flask_migrate  #sqlalchemy

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

">