본문 바로가기

Python & Django & Flask

[Flask] SQLAlchemy + CRUD Webapplication Example

flask와 SQLAlchemy를 사용한 CRUD Webapplication Example에 대한 포스트입니다.

환경 구성 후 간단하게 샘플 코드를 만들어보았습니다. 

SQLAlchemy에서는 ORM형태의 코드와 직접 쿼리를 실행하는 형태의 코드를 모두 지원하는것 같습니다.


flask를 사용하여 webapplication을 만들려면 그외 jinja2라는 템플릿엔진과 SQLAlchemy의 사용법을 익혀야 할것 같습니다.


기본적으로 제가 따라한 예제는 flask 홈에 있는 튜토리얼을 따라한 것입니다. (http://flask.pocoo.org/docs/tutorial/#tutorial) 


다만, 여기서 사용하는 DB를 MySQL로 바꾸면서 SQLAlchemy를 사용하여 ORM으로 코드를 변형하여 테스트해본 내용입니다. 따라서, view단의 html파일들은 별도로 언급하지 않았습니다.


일단, 테스트에 사용한 모델은 User 클래스로 id, name, email, description 필드를 갖습니다.

그리고, id는 PK이며 name과 email은 unique 제약이 걸려있습니다.


주의!! - 아래의 코드는 best practice가 아니고, 특히 scoped_session의 올바른 사용법인지까지는

검증하지 않았습니다!


1. models.py


소스를 보시면 대부분 짐작이 되실거라 생각됩니다. 



2. database.py


DB와의 connection을 생성하여, db_session이란 이름으로 바인딩해주고, init_db()메서드에서 model로부터 추출된 메타데이터를 사용해 DB에 테이블을 생성하도록 되어있습니다.



3. flaskr_crud.py


실제 request처리를 담당하는 소스입니다.

특징적인것들만 간단하게 나열하면...


1) app = Flask(__name__)

어플리케이션의 이름을 설정해주는 것으로 각 메서드에 어노테이션으로 설정된.. 마치 스프링MVC의 @RequestMap과 같은 형태에서 사용됩니다. 


2) @app.before_request, @app.teardown_request

브라우저에서 요청된 request가 들어오고 끝날때 한번씩 실행되도록 해주는 설정입니다. 실제 튜토리얼에서는 이 메서드에서 DB session을 받아오고, close하는 로직이 들어가 있습니다.


3) @app.route()

url을 매핑하여 놓으면 해당 url요청이 있을때 선언된 메서드가 실행됩니다.

다만 특이한것은 url을 던질때 "url_for('show_entries')"와 같이 메서드 이름을 통해 url을 추출하여 매핑하도록 되어있습니다. view에서도 마찬가지구요....


4) C.R.U.D

대부분은 소스를 보시면 아실것 같고.. update의 경우  db_session으로부터 filter 쿼리의 결과를 받아서

객체를 수정하고 commit을하면 DB에 반영이 되는 구조입니다. 쿼리에서 .first()가 빠지면 정상작동하지 않습니다.

결과값이 하나라고 하더라두요...


5) show_entries.html with Jinja2


화면에 model을 어떻게 그리는지 보시면 될것 같습니다. Jinja2라는 템플릿 엔진을 사용한듯한데... 첫 느낌은 Jade같기도 하구요... 아무튼 이것도 익혀야하는 부담이 있겠네요. {% %}가... 적은양의 라인에서는 보시는것처럼 가독성이 나쁘지 않은데.. 큰 소스에서는 어떨지 모르겠네요. 


6) 실행

프로젝트 디렉토리로 이동하여 virtualenv를 실행 후 flaskr_crud.py을 실행하면 됩니다.

cd /Users/need4spd/Programming/python/flask/workspace/flaskr

. venv/bin/activate

python flaskr_crud.py


7) 로그

실행시 아래와 같은 로그가 올라옵니다.

(venv)Coupang-ui-MacBook-Pro:flaskr need4spd$ python flaskr_crud.py

 * Running on http://127.0.0.1:5000/

 * Restarting with reloader


request 요청이 들어오면 아래와 같은 로그가 올라옵니다.

before_request

[{'email': u'admin2@localhost', 'description': u'my description', 'name': u'admin2'}, {'email': u'admin3@localhost', 'description': u'1', 'name': u'admin3'}, {'email': u'admin4@localhost', 'description': u'1', 'name': u'admin4'}, {'email': u'admin5@localhost', 'description': u'1', 'name': u'admin5'}]

teardown_request

127.0.0.1 - - [12/Sep/2013 15:30:08] "GET / HTTP/1.1" 200 -

before_request

teardown_request

127.0.0.1 - - [12/Sep/2013 15:30:08] "GET /static/jquery-1.8.1.js HTTP/1.1" 304 -

before_request

teardown_request

127.0.0.1 - - [12/Sep/2013 15:30:08] "GET /static/style.css HTTP/1.1" 304 -

제가 프린트해놓은 내용까지 다 찍혔네요... static resource인 js, css파일에 대한 요청도 같이 들어오는 것을 확인하실 수 있습니다.


8) 화면



느낌

- grails에 비해서는 확실히 가볍습니다. 처음에 flask 및 SQLAlchemy / virtualenv 설정만 되어있으면 가볍게 뭐든 만들 수 있을것 같습니다. 하지만 파이썬을 잠깐 공부한 입장에서는 언어가 익숙하지 않은 부담과 새로운 템플릿 엔진을 봐야하는 부담이 있구요... 버전이 0.10이라는것이.. 살짝 걸립니다. 

아! 그리고 파이썬은 괜찮은 IDE가 없을까요? ㅎㅎ