본문 바로가기
자습

Django vs. Flask

by litaro 2019. 9. 28.

https://testdriven.io/blog/django-vs-flask/

 

Django vs. Flask in 2019: Which Framework to Choose

In this article, we'll look at the best use cases for Django and Flask along with what makes them unique, from an educational and development standpoint.

testdriven.io

보통 python 서버 개발시에 얘기나오는게 Django와 Flask이고 대부분 Django는 full stack이고 flask는 light weight 하다고 비교를 많이한다. 나도 얕게 듣기만 한 얘기라 한번 위 블로그를 정리하려고 한다.

https://www.jetbrains.com/research/python-developers-survey-2018/

Django와 Flask 모두 Web application 개발을 위한 free, open-source, Python-based web frameworks다.

Philosophy

Flask와 비교하여 Django는 "batteries included" (모든것을 Framework에서 built-in으로 제공하는.. 예를 들어, tools, patterns, features, and functionality)와 stability를 선택하였다. stability 측면을 보면 Django는 길고 좀더 엄격한 release cycle을 가지고 있어 release될때 와우할만한 새로운 feature가 있지는 않지만 탄탄한 호환성을 제공한다.

Flask는 Werkzeug 기반으로 core 기능 (URL routing, request and error handling, templating, cookies, support for unit testing, a debugger, and a development server) 을 build-in으로 제공한다. 이외로 필요한것은 입맛에 맞는 library를 써서할 수 있기에 Django에 비해 훨씬 flexible하다.

http://www.grokcode.com/864/snakefooding-python-code-for-complexity-visualization/

 

Snakefooding Python Code For Complexity Visualization | GrokCode

Snakefood is a tool written by Martin Blais to create Python dependency graphs. Combined with GraphViz, snakefood can create beautiful visualizations of Python codebases. Here are graphs for some notable open source projects written in Python. Python Web F

www.grokcode.com

Django와 Flask의 complexity를 도식화

 

Features

Database

Django는 SQLite, PostgreSQL, MySQL, Oracle 과 같은 RDB를 built-in으로 지원하는 simple but powerful ORM을 제공한다. DB migration 기능도 제공하고, 특히 Data Model을 설계하면 이에 맞는 forms, views, and templates을 쉽게 만들수 있어 일반적인 CRUD web application 만들기에는 딱이다. 또한 뒤에 나오는 Admin이 있어 DB 관리하는데 너무 편리하다.

Flask는 Data를 뭘 쓸지 아무 관여 안한다. 대신 많은 libray (SQLAlchemy, Peewee, PyMongo...) 와 extensions (Flask-SQLAlchemy Flask-Peewee, Flask-PyMongo...) 들이 있다. 

요약하면, RDB를 쓰는 경우 built-in ORM을 지원하는 Django가 개발에 용이하고, 대신 RDB가 아니거나 다른 ORM을 사용하려면 "Django will fight you almost every step of the way"하고 위에 Admin을 이점을 활용할수 없다.

반면 Flask는 자유를 준다. 알아서 하라고.. The more you do on your own the more mistakes you will make, especially as things scale. ㅎㄷㄷ

Auth

대부분의 Applicaiton은 authentication (who are you?) and authorization (what are you allowed to do?) 가 기본이다.

Djnago는 예상대로.. Account Manager와 User model을 통한 sessions 지원한다.

Flask는 역시 예상대로 extenstion (Flask-Login, Flask-Principal, Flask-Security)을 찾아서 사용해야한다.

Admin

앞에도 얘기했지만 Django는 application에서 사용하는 data model을 관리할 수 있는 admin panel 을 제공한다. 개인적으로도 이것이 Django 선택에 매우 중요한 요소라고 생각한다. 특별한 code 없이 model을 잘 정의하면 빠르게 화면에서 바로 CRUD 를 할수 있다. 

반면 flask는 Flask-Admin extension으로 이 기능을 제공하고 (사실 난 이번에 알았...) 기본적으로 개발자가 알아서 하는것이다. 추후에 요구사항이 바껴서 custom logic을 넣을때는 이 부분이 오히려 장점 일수도 있다.

Routing and Views

둘다 map URLs to views 가 가능하고 function and class-based views를 지원한다.

Django

한 request 가 urlpatterns 에 맞으면 해당 request object는 URLconf에 맞는 vews에 전달되고 해당 view가 invoke된다.

URLs 와 views는 ulrs.py and views.py 에 정의된다.

https://docs.djangoproject.com/en/2.2/topics/http/urls/

 

https://docs.djangoproject.com/en/2.2/topics/http/views/

Flask

기본 URL routing and request/response handling을 제공한다.

URLs은 기본적으로 decorator 를 통해 설정한다. Django 처럼 separated out한곳에 설정하는것도 가능하다.

https://flask.palletsprojects.com/en/1.1.x/api/#url-route-registrations
https://flask.palletsprojects.com/en/1.1.x/patterns/lazyloading/#converting-to-centralized-url-map

재밌는건 일반적으로 Flask가 explicit 한 방법을 선호하는데, request object에 한해서는 오히려 Django가 explicit 하게 request를 전달하도록 하고, Flask는 그렇지 않다.

Forms

web application을 만들지는 않아서 ^^;; Forms가 web application essential part라는데 잘 모르겠다.

Django는 기본 제공하는 forms이 있고 ModelForms 을 이용하면 쉽게 data model에서 만들수 있고 admin panel에서 관리 가능하다.

Flask는 제공하는 Forms 은 없고 Flask-WTF extension 을 사용하면 Django의 ModelForm의 기능을 사용할 수 있다.

Reusable Components

app이 복잡해지다 보면 각 기능별로 관련 파일들을 grouping하는게 좋은데, Django와 Flask 모드 이를 제공한다.

Django는 app , Flask는 blueprints로 가능하다.

Django apps가 Flask의 blueprint 보다는 복잡한데, urls.py, models.py, and views.py와 같은 convention이 있어서 프로젝트 구조가 일관성이 있어 한번 만들면 재사용은 쉽다.

Templates and Static Files

 Template engine은 backend 의 정보를 하나의 page로 만들어주고 Django는 기본으로 templating engine 을 제공하고, Flask는 Jinja2를 제공한다. 둘다 비슷한 syntax 와 feature set를 제공한다.

https://docs.djangoproject.com/en/2.2/howto/static-files/
https://flask.palletsprojects.com/en/1.1.x/quickstart/#static-files

Testing

둘다 기본적으로 testing을 지원한다.

Unit Test의 경우, 둘다 Python's unittest framework 을 활용하고, response 를 validation 하기 위해 request를 보내는 test client를 제공한다.

https://docs.djangoproject.com/en/2.2/topics/testing/overview/
https://flask.palletsprojects.com/en/1.1.x/testing/

Security

Django는 CSRF, XSS, and SQL injection 에 대해 built-in protection을 제공한다. 반면 Flask는 code 도 작아 공격받을 open area가 적은데 결국 추가로 사용하는 3rd party libraries 와 extension에 의한 영향도가 크다. 

Flexibility

Flask이 Django보다 flexible 하다는것은 너무 당연한 얘기다.

Flask가 flexible하기 때문에 필요한 부분에 대해 개발자가 직접 정하고 설치해야하기에 아무래도 개발 시간을 더 필요로 한다. 개발자는 당연히 자신의 방법대로 구축하는것을 선호하기 때문에 Flask를 하려고 하지만, 문제는 같은 기능으로 각자 제각각 구축한다면 유지보수가 힘들어질수 있다. 그 만큼 Design Pattern에 대한 경험과 지식이 풍부하고 일관된 설계 능력이 축적된 팀이 능력이 필요하다.

Education

Web 개발을 배우기 위해서는 Flask로 시작하는것이 좋다. 언어나 프레임워크 특화된 기능이나 지식을 배우는것이 아니라. Web 개발에 필요한 여러 요소와 pattern을 공부하기에 좋기 때문이다.

Open Source

1. Flask와 Django 모두 활발한 Open Source Communities를 가지고 있다.

https://testdriven.io/blog/django-vs-flask/#security
https://testdriven.io/blog/django-vs-flask/#securit

2. Django가 더 오래되어 더 많은 Contributors가 활동하고 있고, 

3. Flask를 사용하는 projects가 더 많으며

4. Django에 대한 Contents가 더 많이 있다.

Flask이 경우, 모든 micro web framework가 가진 이슈를 동일하게 겪고 있다. 자유도가 크다보니 이를 위한 다양한 3rd party libraries와 extenstions이 있는데 각기 다른 수준의 개발자가 개발하고 유지 보수하고 또한 서로 다른 release cycle이 있어서 결국 이를 선택해서 사용한 개발자는 신중한 검토 후 사용해야한다. 즉, 안정성이 높은 모듈을 선택하는 능력이 필요하다. 

Hiring

Python과 Django가 인기가 많음에도 Django 개발자를 고용하는것은 쉽지 않다. 왜냐하면 대개 Django 개발자는 예전 기술이라 선임자들인 경우가 많아 연봉이 높고 반면 젋은 개발자들은 요즘 새로운 트렌드인 microservice에 관심이 많아 Django를 선호하지 않기 때문이다.

Industry trends: microservices 에 대한 관심으로 smaller, light weight frameworks를 더 많이 배우려고 하고, client-side Javascript Framwork인 Angular, React and Vue가 인기가 많아 Python 이나 Ruby보다는 Javascript를 주요 언어로 선택하고 있다.

Difficult to learn: 초보자를 위한 Django Tutorial도 없어서 더더욱 배울수 있는 기회가 적다.

Flask도 어렵긴 마찬가지지만 Django보다는 쉽다. 

Use Cases

어떤 Framework를 사용할지는 각자의 needs에 달려있다.

Django는 built-in으로 제공하는 기능이 많기에 full-featured web applicaiton을 만들계획이면 Django의 기능을 활용하면 큰 이점이 될수 있다. 반면 단순한 RESTful Web Service나 mobile application을 개발한다면 가볍고 작은 Flask가 나을것이다.

Performance

성능 차이는 그다지...

Conclusion

어떤 Framework를 사용할 것인가? 

Django는 full-featured framework라 많은 고민 없이 빠르게 기능을 구현할 수 있다.

반면 한 기능이라도 요구사항에 맞지 않아 수정이 필요해진다면 Flask로 가는것이 좋을 수 있다.