winterjung blog


Flask 1.0에서 달라진 점

flask0.12 버전으로 릴리즈된지 1년 5개월만에 드디어 메이저 버전인 1.0 버전이 릴리즈 되었다.

이 글에서는 1.0 버전이 되면서 인상적인 변경점만 정리해봤다.

Flask version 1.0 full changelog - Released on April 26th 2018

Highlight change

  • Python 2.6과 3.3 지원을 중단했다. [pallets/meta#24]

  • JSONIFY_PRETTYPRINT_REGULAR config 값은 jsonify()가 반환하는 응답의 포맷을 결정하는데 이젠 debug 모드가 아닐 때 기본적으로 False로 설정되어 json 응답이 compact하게 출력된다. debug 모드에선 기본적으로 True로 설정된다. [#2193]

  • Blueprint별로 json_encoderjson_decoder를 설정할 수 있게되었다. [#1898]

  • FLASK_APP 환경 변수를 설정할 때 인자가 없는 팩토리 함수(e.g. create_app, make_app)를 자동으로 감지한다. [#2297]

  • 인자가 있는 팩토리 함수도 FLASK_APP으로 설정이 가능해졌다. [#2326]

  • 테스트 클라이언트에 새로운 json 키워드 인자가 추가되었다. 테스트에서 app.test_client()로 json request를 보낼 때 일일이 data=json.dumps(), content_type='application/json'으로 설정해야 했으나 이젠 단순히 json={'foo': 'bar'}처럼 해줄 수 있다. [#2358]

  • Request에 있던 json 처리 루틴을 JSONMixin으로 분리하고, RequestResponse 둘 모두에 JSONMixin이 추가되면서 이제 Response에도 is_json()get_json()이 추가되어 json 응답을 테스팅하기 더욱 편해졌다. 만약 pytest-flask를 사용하고 있다면 몽키패치로 Response 클래스를 대체해 .json 프로퍼티를 지원하고 있으므로 크게 신경쓰지 않아도 된다. [#2358]

  • 오래된 flask 예제를 보면 flask.ext.foo같은 형태로 확장 플러그인을 불러오는 모습을 볼 수 있었고 그동안 DeprecationWarning을 띄워주고있었지만 버전업을 통해 오래된 부분을 완전히 삭제했다. 앞으로 flask.ext.sqlalchemy 형태를 사용하는 대신 flask_sqlalchemy처럼 사용해아한다. 더불어 몇 가지 deprecated 코드도 같이 삭제되었다. [#2385]

  • 그동안 Request.json 프로퍼티는 DeprecationWarning을 발생시키고 대신 get_json()을 사용하고 있었지만 [#1421]에서 논의를 거친 끝에 .form, .data와의 일관성, 기존 코드가 경고말곤 아무런 조치도 취하지 않고 단순히 get_json()을 호출했던 점 등을 이유로 DeprecationWarning이 삭제되었다. [#2397]

  • flask 커맨드, Flask.run()에서 python-dotenv가 설치되어 있다면 .env, .flaskenv 파일을 자동으로 감지해 환경 변수를 읽어들인다. [#2416]

  • 로깅이 간편해졌다. LOGGER_NAME, LOGGER_HANDLER_POLICY가 삭제되었으며 기존의 Error Handling 문서에 있던 logging 파트가 가독성이 향상된 별도의 Logging 문서로 분리되고 정보가 추가되었다. [#2436]

  • 이제 기본적으로 development 환경에서 서버가 멀티스레드로 동작한다. 그에 맞춰 문서에서 by default serves only one request at a time 이라는 문구가 삭제되었다. 로컬 머신에서 테스트해 본 결과 동시에 128개의 요청도 처리 가능했지만 어디까지나 개발 환경에서 편의성이 좋아진 것으로 프로덕션 환경에서 app.run()은 추천하지 않는다. [#2529]

  • 튜토리얼에 있는 예제가 다시 쓰여졌다. flask에서 자주 쓰이는 패턴과 구조를 적용한 예제들로 팩토리 패턴(e.g. create_app()), blueprint, config 파일 사용, pytest와 coverage, Waitress를 사용한 프로덕션 서버 실행 등이 적용됐다. [#2676]

사족

개인적으로 flask를 애용하고 있었는데 이번 릴리즈를 통해 테스트가 좀 더 간편해지고 튜토리얼이 보강된 점이 특히 마음에 든다. 이 글에서 소개된 변경점 말고도 무척 많은 점이 변경되었는데 앞으로 점점 더 성장하는 flask가 되었으면 좋겠다.