IFP - Flask 튜토리얼 가이드
💡 Flask 란?
Flask는 Python 으로 작성된 마이크로 웹 프레임워크 중 하나입니다. 파이썬으로 작성된 또 다른 풀 스택 웹 프레임워크인 Django 가 Django ORM, 관리자 페이지 등을 자체 제공해주는 것과는 다릅니다. 플라스크 공식 문서에서는, “마이크로는 무엇인가?” 에 대해서 아래와 같이 설명하고 있습니다.
The “micro” in microframework means Flask aims to keep the core simple but extensible.
마이크로프레임워크의 "마이크로"는 Flask가 핵심을 단순하지만 확장 가능한 상태로 유지하는 것을 목표로 함을 의미합니다.
Django, FastAPI, Flask 는 파이썬으로 작성된 웹 프레임워크의 삼대장 자리를 차지하고 있습니다. 백엔드 언어로 파이썬을 사용하는 기업이라면, 열에 적어도 아홉은 위의 세 프레임워크 중 하나를 쓰고 있을 것이라 장담합니다. 본 튜토리얼을 진행하면서, 웹 백엔드에 대한 아주 기초적인 개념을 훑어볼 수 있는 좋은 기회가 되길 바랍니다. 🙂
💁🏼 Flask 를 백엔드로 사용하는 서비스들
Flask 를 백엔드 기술로 사용 중인 기업들을 소개합니다.
이 외에도, 1000개 이상의 기업들이 Flask 를 사용하고 있습니다.
✅ Netflix
✅ Reddit
✅ trivago
✅ Patreon
✅ Pinterest
✅ Barogo
✅ Uber
✅ AB180
✅ MIT
✅ Pinterest
📄 Flask 한글 공식 문서
Flask의 세계에 오신것을 환영합니다. - Flask 0.11-dev documentation
🌐 Flask 공식 홈페이지
Welcome to Flask - Flask Documentation (2.2.x)
💾 Flask 깃허브 저장소
https://github.com/pallets/flask
😎 튜토리얼에서 진행하는 프로젝트들
튜토리얼에서 진행하는 프로젝트를 소개합니다. 튜토리얼을 성공적으로 마무리하면, 아래의 프로젝트들이 완성되어 있을 것입니다.
튜토리얼의 프로젝트를 완료하고 나서 마무리하기보단, 자신이 추가하고 싶었던 기능들을 추가로 구현해보며 공부하시는 것을 적극 추천드립니다!
나만의 블로그
Flask 로 회원 관리, 게시물, 관리자 페이지, 댓글 작성, 컨택트 폼 등의 기능을 가지고 있는 자신만의 블로그 웹 애플리케이션을 직접 작성해 봅니다. 테스트 코드 또한 도입해 보며, 코드로 자신이 작성한 코드를 직접 테스트해 봅니다. 테스트 주도 개발에 대해서도 이해해 봅니다.
간단한 REST API (1)
간단하게 동작하는 REST API를 구축해 봄으로서, HTTP Method와 JSON, WEB API에 대해 이해합니다. 플라스크에서 어떻게 JSON으로 응답을 주고받는지에 대해서 알아봅니다.
간단한 REST API (2)
Flask-Restful 이라는 외부 패키지를 이용해 Create, Read, Update, Delete 를 수행할 수 있는 REST API를 구축해 봄으로써, Flask의 Pluggable View 의 개념에 대해 이해하고 활용해 봅니다.
인스타그램 클론코딩
플라스크로 이미지 업로드, 회원가입, 회원탈퇴, JWT를 활용한 로그인, 팔로우/언팔로우 등의 기능을 가지고 있는 인스타그램을 Flask로 구현해 봅니다. 자신이 작성한 API에 대한 테스트 코드를 작성함으로서, 자신의 코드가 잘 작동하는지 임의로 정한 테스트 케이스에 대해 검증해 봅니다.
(2022.11.16 현재 진행중)
🌟 추천 커리큘럼
아래의 과정들을 따라가며, Flask 를 공부해 보세요.
Flask 개발 환경 설정하기 ( VSCode)
- 해당 에피소드에서는 윈도우11 환경에서 Flask 개발 환경을 세팅하는 방법에 대해 다룹니다.
[OS - Windows] - "Windows11 환경에서 FLask 개발 환경 준비하기"
Flask 에서 Routing 이란?
- 해당 에피소드에서는 Routing 에 대해서 다룹니다.
[REAL Python - Flask] - "Flask - 플라스크의 Routing, Http GET, POST Method 처리하기, (Create, Read 구현)"
Flask 로 나만의 블로그 개발하기 (1) - 개발 초석 다지기
- 해당 에피소드에서는, 정적 파일을 다루는 방법에 대해 다룹니다.
- 더불어, 이미 만들어진 템플릿에 원하는 정보를 어떻게 보여주는지에 대해서도 다룹니다.
[REAL Python - Flask] - "블로그 웹 애플리케이션 개발(0) - 프로젝트 생성, 패키지 설치, 기본 작업"
Flask 로 나만의 블로그 개발하기 (2) - 로그인, 회원가입 구현하기
- 해당 에피소드에서는 로그인과 회원가입을 구현합니다.
- 회원가입이나 로그인 등을 처리하기 위해서는 사용자가 존재해야 하고, 사용자는 데이터베이스에 저장되어야 합니다. 그것들을 일일이 쿼리문을 날려 올리는 방법 대신, 파이썬의 클래스로 다룰 수 있는 ORM의 개념에 대해 이해하고 활용해 봅니다.
- 외부 라이브러리인 flask-login 을 이용해 로그인을 구현합니다.
- 보통, 여타 다른 웹 서비스에서는 로그인을 하면 “~~~님 환영합니다.” 와 같이 사용자가 보는 페이지의 내용이 다르게 변화하는 것을 볼 수 있죠. 로그인 여부에 따라 다르게 보여지는 웹 페이지를 구현합니다.
[REAL Python - Flask] - "블로그 웹 애플리케이션 개발(1) - 로그인/회원가입 처리하기"
Flask 로 나만의 블로그 개발하기 (3) - 관리자 페이지, 카테고리, 게시물 시스템 구현하기
- 해당 에피소드에서는 관리자 페이지를 구현합니다. 관리자 페이지는 일반 회원이 맘대로 접근할 수 있으면 안 되겠죠. 이를 위해서 사용자 모델을 수정하고, 해당 사용자가 관리자인지 아닌지에 따라 접근 권한을 제한해야 합니다.
- 테스트 코드에 대해 알아봅니다. 지금까지 작성했던 기능들을 테스트 코드를 통해 검증해 보고, 테스트를 먼저 작성하고 그에 맞춘 기능을 개발합니다. 완벽한 형태는 아니지만, “TDD - 테스트 주도 개발” 을 경험해 봅니다.
- 게시물을 다룹니다. 역시, 게시물을 다루기 위해서 게시물 모델을 작성하고, 저자와 게시물간의 관계를 처리하는 방법에 대해서도 다룹니다.
- 카테고리 시스템을 다룹니다. 한 카테고리에는 여러 개의 게시물이 포함될 수 있죠. 이를 구현하기 위한 모델을 작성하고, 블로그에 나타낼 수 있습니다.
[REAL Python - Flask] - "블로그 웹 애플리케이션 개발(2) - 테스트 코드 도입, 관리자 페이지, 카테고리, 게시물 다루기"
Flask 로 나만의 블로그 개발하기 (4) - 게시물 삭제, 댓글, 컨택트 폼 기능 구현하기
- 해당 에피소드에서는 게시물 삭제, 댓글, 컨택트 폼 기능을 구현합니다. 게시물-저자 의 관계와 마찬가지로, Python ORM 으로 일대 다 관계를 처리하는 방법에 대해 다룹니다.
- 만약, 게시물을 작성한 유저가 탈퇴하거나, 댓글이 달린 게시물이 삭제된다면 게시물은, 그리고 댓글은 데이터베이스에서 어떻게 처리되어야 할까요? 위의 문제들을 ORM 으로 어떻게 처리하는지에 대해 알아봅니다.
- 마찬가지로, 이곳에서도 테스트 코드가 도입됩니다. 본인이 작성한 코드가, 본인이 작성한 테스트 케이스에 대하여 검증을 통과하는지 확인해 보고, 더욱 더 다양한 테스트 케이스를 작성해 봄으로서 견고한 프로그램을 만드는 연습을 하기 위한 초석을 제공합니다.
[REAL Python - Flask] - "블로그 웹 애플리케이션 개발(3) - 댓글 CRUD, 게시물 삭제 처리, 간단한 contact form 구현하기"
Flask 로 간단한 REST API 구현하기 (1) - JSON 응답하기
- 순수 flask 에서 json 응답을 어떻게 주고받는지를 알아봅니다.
- HTTP Method 에 대해 아주 간단하게 알아봅니다.
- 데이터베이스를 사용하지 않는 간단한 REST API 를 구현합니다.
[REAL Python - Flask] - "Flask HTTP API(1) - 간단한 HTTP API 구축해보기"
Flask 로 간단한 REST API 구현하기 (2) - Flask-restful
- 지금까지 사용해오던 함수형 뷰가 아닌 클래스형 뷰, flask 의 Pluggable View 의 개념에 대해 이해하고, 그것을 적극 활용하는 flask-restful 라이브러리를 활용해 GET, POST, DELETE, PUT 메서드에 대응하는, 완벽하게 작동하는 간단한 REST API를 구축해 봅니다.
- 위와 같이 한 클래스 내에서 (HTTP메서드 소문자명) 의 파이썬 메서드를 작성하여 API를 구현하는 것은 Django REST Framework에서도 비슷하게 사용되는 방법입니다.
- 앞으로 진행될 인스타그램 클론코딩 프로젝트를 위해서 꼭 익혀두어야 하는 에피소드입니다.
[REAL Python - Flask] - "Flask HTTP API(2) - Flask-RESTful 로 생성, 조회 api 구축하기"
[REAL Python - Flask] - "Flask HTTP API(3) - Flask-RESTful 로 삭제, 수정 api 구축하기"
marshmallow 로 파이썬 객체 직렬화 / 역직렬화 처리하기
- 위의 실습을 잘 따라하셨다면, 그리고 이해하셨다면 개발자들이 사용하는 API 서버를 만든다는 것은 결국, JSON 혹은 XML 등의 형식을 활용하여 클라이언트와 응답을 할 수 있게끔 해야 한다는 것을 이해하셨을 것입니다.
- 앞서, 우리는 데이터베이스를 SQL 쿼리문이 아닌 파이썬의 클래스로 다룰 수 있다는 것을 배웠습니다. 이를 ORM이라고 했었죠? 그런데 문제는, 작성한 파이썬 클래스의 모델 인스턴스를 JSON으로 변환하여 응답하는 과정을 거쳐야 하는데 그것을 어떻게 하는가? 입니다.
- 이를 해결하기 위해서, 순수 파이썬으로 인스턴스를 JSON으로 직렬화하는 방법에 대해서 알아보고, 그 어려움을 해결하기 위해 Marshmallow 라는 직렬화 / 역직렬화 라이브러리의 간단한 사용법을 알아봅니다.
- 앞으로 진행될 인스타그램 클론코딩 프로젝트를 위해서 꼭 익혀두어야 하는 에피소드입니다.
[REAL Python - Flask] - "Flask HTTP API(4) - marshmallow 로 Python에서 직렬화 / 역직렬화 처리하기"
인스타그램 클론코딩 프로젝트 (1) - 프로젝트 기본 세팅
- flask 는 Django 와는 달리 디렉토리 구조 등에 대해서 자유도가 높은 프레임워크입니다. 조금 더 규모있는 프로젝트를 만들기 위해서 전체적인 디렉토리 구조의 틀을 잡는 과정을 수행합니다.
- 파이썬에서 패키지 관리를 하기 위해서, requirements.txt 와 같은 파일들을 만들어 보고, 개발용 환경, 배포용 환경에 대한 패키지 관리를 어떻게 수행하는지에 대해서도 간략히 알아봅니다.
- 시크릿 키와 같은 부분들은 깃허브 저장소에 올라가면 안 되는 정보입니다. 그러한 파일들을, .env 로 환경 변수로서 관리하는 방법을 알아봅니다.
[REAL Python - Flask] - "인스타그램 클론코딩 - Instagram Clone (1)"
인스타그램 클론코딩 프로젝트 (2) - 게시물 목록, 상세에 대한 CRUD API 구현하기
- 인스타그램의 중요 기능 중 하나인 게시물을 다루는 방법을 알아봅니다.
- /posts/ 에 대한 GET, POST 요청에 응답하는 API 를 구축합니다.
- /posts// 에 대한, GET / PUT / DELETE 요청에 응답하는 API 를 구축합니다.
- 파이썬의 Unittest 패키지를 활용해 자신이 만든 GET 요청에 대한 API 를 테스트해 봅니다.
- 게시물 목록에 대한 페이지네이션 처리를 수행합니다.
[REAL Python - Flask] - "인스타그램 클론코딩 - Instagram Clone (2)"
인스타그램 클론코딩 프로젝트 (3) - 프론트엔드 단에서 연결해 보고, 회원가입 구현하기
- 이전에 만들어 두었던, 게시물 목록 API 를 프론트엔드 단에서 사용해 봅니다.
- 자바스크립트의 fetch() 를 사용해 게시물의 내용에 따라 달라지는 인스타그램 게시물 페이지를 구현합니다.
- 회원가입을 처리합니다. 폼에서 회원가입을 진행했던 것과 달리, 프론트엔드에서 JSON 을 주고받으며 진행할 수 있습니다.
- 마찬가지로, 비밀번호 해싱을 적용합니다.
[REAL Python - Flask] - "인스타그램 클론코딩 - Instagram Clone (3)"
인스타그램 클론코딩 프로젝트 (4) - JWT 발급, 게시물 작성 시 로그인한 사람이 저자로 자동 추가되도록 구현하기
- JSON 웹 토큰은 두 당사자 간의 클레임을 안전하게 표현하기 위한 개방형 업계 표준 방법입니다.
- https://www.rfc-editor.org/rfc/rfc7519 에 그것의 표준이 정의되어 있습니다.
- 이번 시간에는, JWT를 서버에서 직접 구현해 보며, 로그인을 위해서 백엔드 단에서 무엇을 준비해야 하는지를 알아봅니다.
- 구현했으면 자고로 써 봐야겠죠? 실제 서비스에서 게시물이나 피드 등을 작성할 때에는 “현재 로그인한 사람” 이 “게시물이나 피드의 작성자” 로 추가되도록 해야 합니다. 로그인을 통해서 이 부분을 구현해 보겠습니다.
[REAL Python - Flask] - "인스타그램 클론코딩 - Instagram Clone (4)"
인스타그램 클론코딩 프로젝트 (5) - Werkzeug, WSGI, NGNIX 알아보고, 게시물에 이미지를 붙여 업로드하기
- Flask 에서 이미지를 어떻게 다루는지 알아보고, 이미지 업로드를 위한 별도의 라이브러리를 작성해 봅니다.
- JavaScript로 게시물 업로드 로직을 구현하며, 데이터베이스에는 어떤 것이 저장되고, 프론트엔드 단에서는 어떤 정보가 필요한지에 대해서 알아봅니다.
[REAL Python - Flask] - "인스타그램 클론코딩 - Instagram Clone (5)"
인스타그램 클론코딩 프로젝트 (6) - 무한 스크롤과 댓글 API 구현하기
- 우리는 앞서 게시물 API를 구현하며 페이지네이션을 구현했습니다.
- 페이지네이션의 의미 중 중요한 것은, 만약 사용자가 “게시물 목록 조회” 를 요청한다면, 그리고 데이터베이스에는 1억 개의 게시물이 있다면, 그것을 서버에서 클라이언트에게 모두 보내줄 것인가? 라는 의문점에서 시작했습니다. 읽을지, 읽지 않을지 모르는 1억 개의 데이터를 모두 내려보내 주는 것은 굉장한 낭비일 겁니다. 이번 시간에는, 백엔드에서 구현한 페이지네이션을 기반으로 프론트엔드에서 실제 인스타그램과 비슷하게 “스크롤을 내리면 계속 게시물이 로드되도록” 구현해 보겠습니다.
[REAL Python - Flask] - "인스타그램 클론코딩 - Instagram Clone (6)"
현재 업데이트 중입니다