일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- Vue.js
- 시뮬레이션
- 모의SW역량테스트
- 구현
- Data Structure
- CSV
- GitHub
- Algorithm
- SWEA
- django
- SQL
- boj
- Bruth Force
- programmers
- DFS
- BFS
- hash table
- 코딩테스트
- Priority Queue
- 알고리즘
- JavaScript
- aws
- Trie
- gpdb
- Python
- spring boot
- 코테
- Back tracking
- Linked list
- 알고리듬
- Today
- Total
hotamul의 개발 이야기
[Flask] Flask란? (feat. uWSGI, WSGI) 본문
Flask란 무엇인가?
Flask를 이야기 하기 전에 uWSGI, WSGI에 대한 이해가 필요합니다.
uWSGI는 Application Container로, 사용하고자 하는 (적재된) 애플리케이션을 실행해 주는 역할을 합니다. 이렇게 uWSGI가 실행시켜 줄 애플리케이션은 일종의 규격이 존재하는데 이 규격을 WSGI라고 이해하시면 됩니다.
WSGI는 Python 표준(PEP-333)으로 HTTP를 통해 요청을 받아 응답하는 애플리케이션의 명세입니다. 이러한 명세를 만족시키는 클래스, 함수 그리고 객체를 WSGI 애플리케이션이라 합니다.
WSGI가 명세라고 했으니까 이 규격에 맞춰 함수, 객체를 만들면 그것이 곧 WSGI 애플리케이션 입니다. (애플리케이션을 실행시켜 줄 서버는 wsgiref.simple_server
를 이용해 간단히 만들어 볼 수 있습니다.)
웹 애플리케이션(이 글에서는 서버를 의미합니다)를 만드는게 그렇게 간단하다면 우리가 프레임워크를 사용해야 하는 이유는 무엇일까요? HTTP 요청에 응답할 수 있고 HTML을 return
하는 웹 애플리케이션을 간단하게 만들 수는 있지만 굉장히 귀찮고 불편한 점이 많을겁니다. 일일이 request에 파라미터들을 처리하기 위해 복잡한 과정이 필요하고 HTML도 문자열로 작성해줘야 합니다.
Flask는 이러한 불편함을 해소해줍니다.(사실 Flask의 대부분은 WSGI 라이브러리인 Werkzeug에서 가져와 씁니다. Werkzeug과 Flask를 만든 사람은 같은 사람입니다.) 웹 애플리케이션에서 주로 다루는 쿠키, 세션에 대해서 처리할 수 있도록 할 수 있고 애플리케이션을 쉽게 확장할 수 있게 할 수 있습니다. Flask는 마이크로프레임워크입니다. Flask는 핵심적인 부분만 구현되어 있고 유연하게 확장이 가능하도록 설계되어 있어 사용해보면 마이크로라는 의미가 잘 느껴질 겁니다.
(참고) Flask 앱을 실행할 때 app.run
을 사용하는 경우가 있는데 사실 app.run
은 Werkzeug이 제공하는 간단한 WSGI 내장 서버입니다. 내장 서버는 간단한 테스트 용도이므로 성능 및 보안에 여러 문제가 있습니다. 따라서 Flask를 app.run
으로 실행할 경우 공식적으로 프로덕션에 사용하지말라는 경고 메세지가 나오는 겁니다.
(참고) Flask는 는 기본적으로 시큐어 쿠키(Secure Cookie)를 통해 세션을 구현하므로 길이에 제한이 있습니다. 때문에 파일이나 DB기반의 세션을 구현하려면 Beaker와 같은 프레임워크를 통해서 확장할 수 있습니다.(하지만 이 또한 매우 쉽다고 합니다.)
요약
정리 하자면 Flask는 간단한 코드로 빠르게 개발하고 유연하게 (내 입맛대로) 확장할 수 있는 마이크로웹프레임워크이며 WSGI 규격에 맞춰 설계되어 있는 WSGI 애플리케이션입니다. 따라서 Flask는 uWSGI와 같은 애플리케이션 컨테이너에 의해 실행될 수 있고 uWSGI는 WSGI 애플리케이션을 실행시켜 주는 역할(많은 요청을 동시에 처리하도록 하기 위해 여러 애플리케이션을 동시에 실행시키고 멀티 쓰레드 작업을 도와줍니다.)을 합니다.