Welcome :っ)

Devlog/Web

Flask Framework 이해하기

lazy.won 2022. 7. 22. 18:15
728x90
반응형

 

 

 

 

 

 

Flask 이해하기

Flask는 Python 언어 기반의 마이크로 웹 프레임워크이다.

 

여기서 마이크로 웹 프레임워크란, 프레임워크를 간결하게 유지하고, 확장할 수 있도록 만든 것을 뜻한다. 

 

 

Flask의 특징

1. Flask는 간결하다.

플라스크를 이용하면 파일 하나로 구성된 짧은 코드만으로도 완벽하게 동작하는 웹 프로그램을 만들 수 있다. 

 

2. 확장성 있는 설계가 가능하다. 

플라크스에는 폼과 데이터베이스 처리 기능이 없다. Django에는 프레임워크 자체에 폼과 데이터베이스 처리 기능이 포함되어 있다. 그래서 장고는 덩치가 큰 프레임워크이다. 

반대로 Flask는 확장 모듈을 사용한다. 처음부터 모든 기능을 포함하지 않고 개발자가 직접 필요한 확장 모듈을 포함해가며 개발하기 때문에, Flask 프로젝트는 가벼운 편이다. 

 

3. 자유도가 높다.

Flask는 자유도가 높은 프레임워크다. 최소한의 규칙만 있으므로 개발의 자유도가 다른 프레임워크보다 높다. 

Flaks에서 프로젝트는 하나의 웹 사이트라고 생각하면 된다. 프로젝트 안에는 보통 한 개의 Flask Application이 존재한다.

 

4. Flask에서 Jinja Template Language 언어 사용할 수 있다. 

Jinja2 문법을 이용해서 동적으로 HTML 코드 작성이 가능하다. 웹페이지가 동적으로 반응해야 될 부분을 JS가 아닌 Python코드와 유사한 방식으로 작성하여 구현하는 것이다. 

또한 전체 웹사이트에 테마로 사용될 base.html을 만들거나, 데이터가 입력되었는지, 올바른 데이터인지 확인 등의 유효성 검사를 하는 등의 기능을 제공한다. 

 

 

 

Flask 프로젝트 구조 살펴보기

데이터베이스 처리

플라스크에서는 데이터베이스 처리를 위해 ORM(Object Relational Mapping)을 지원하는 파이썬 데이터베이스 도구인 SQLAlchemy를 사용한다. 즉, SQLAlchemy는 파이썬 ORM 라이브러리다. 

 

SQLAlchemy는 모델 기반으로 데이터베이스를 처리한다. 그래서 models라는 폴더 안에 모델 class 들을 정의할 파일들을 생성한다. 

SQL 쿼리라는 구조화된 질의를 작성하고 실행하는 등 복잡한 과정 없이 ORM을 이용하면 파이썬 문법만으로 데이터베이스를 다룰 수 있다. 즉, 개발자가 직접 쿼리를 작성하지 않아도 데이터를 처리할 수 있다. 

 

모델을 사용하면 내부에서 SQL 쿼리를 자동으로 생성해주므로, 직접 작성하지 않아도 된다. 

 

 

💡 여기서 ORM의 장점

DB 종류 상관 없이 일관된 코드를 유지할 수 있어 프로그램 유지 보수하기 편하다.

내부에서 안전한 SQL 쿼리를 자동으로 생성해주므로 개발자가 달라도 통일된 쿼리를 작성할 수 있고, 오류 발생도 줄일 수 있다. 

 

 

서버로 전송된 폼 처리

웹 브라우저에서 서버로 전송된 폼을 처리할 때 WTForms 라이브러리를 이용한다. 

WTForms도 모델 기반으로 폼을 처리한다. 

 

플라스크에서 폼을 사용하려면 Flask-WTF 라는 라이브러리를 설치해야 한다. 

Flask-WTF를 사용하려면 플라스크 환경 변수 SECRET_KEY가 필요하다. SECRET_KEY는 CSRF(Cross-Site Request Forgery)라는 웹 사이트 취약점 공격을 방지하는 데 사용한다. 

 

 

CSRF(Cross-Site Request Forgery)
: 사용자 요청을 위조하는 웹 사이트 공격 기법

SECRET_KEY를 기반으로 해서 생성되는 CSRF 토큰은 폼으로 전송된 데이터가 실제 웹 페이지에서 작성된 데이터 인지를 판단해주는 가늠자 역할을 한다. 

 

 

화면을 구성하는 Views(resources)

여기서 라우트 함수를 등록하여 어떤 화면을 render 할 것인지를 정한다.

플라스크의 BluePrint를 이용하면 라우트 함수를 구조적으로 관리할 수 있다. 

 

 

Static

CSS, Javascript, fonts, images 등의 파일을 저장하는 static 디렉터리이다. 

 

 

Templates

HTML 파일을 저장하는 templates 디렉터리이다. 

 

 

config.py

프로젝트의 환경 변수, 데이터베이스 등을 설정하는 곳이다. 

 

 

 

 

 

웹 브라우저와 웹 서버 동작 방식 이해하기

웹 브라우저의 동작 방식

웹 브라우저가 URL을 사용하여 서버에 요청하는 페이지는 크게 두가지가 있다. 

 

1. 정적 페이지 요청

웹 브라우저는 서버에 정적 페이지를 요청한다. 

웹 브라우저에서 .css, .js, .jpg, .png 과 같은 정적 파일을 요청하는 행위를 정적 페이지 요청 이라고 한다. 

 

2. 동적 페이지 요청

서버의 데이터베이스에 어떤 내용이 저장되어 있는지에 따라 수시로 변하는 화면을 요청한다. 

같은 URL을 요청했는데 다른 결과를 반환하는 것을 동적 페이지 요청이라 한다. 

 

 

웹 서버의 동작 방식

웹 서버는 웹 브라우저의 URL 요청(정적/동적 요청)을 처리한다. 

웹 서버에 정적 페이지 요청을 하면 단순히 정적 파일을 찾아 응답하면 되지만, 동적 페이지 요청은 조금 복잡한 과정을 거쳐 응답한다. 

 

동적 페이지 요청을 완벽하게 처리하려면 웹 서버와 WSGI 서버가 필요하다. 

웹 서버에 동적 페이지 요청이 들어오면 파이썬 프로그램을 호출해야 한다. 하지만 대부분의 웹 서버는 어떻게 파이썬 프로그램을 호출해야 하는지 모르므로 파이썬 프로그램을 호출하지 못한다. 

 

이런 경우, 파이썬 프로그램을 호출하는 WSGI(Web Server Gateway Interface) 서버가 필요하다. 

웹 서버는 WSGI 서버를 호출하고, WSGI 서버는 파이썬 프로그램을 호출하여 동적 페이지 요청을 처리하는 것이다. 

 

 

WSGI 서버 

WSGI 서버에는 여러 종류가 있지만, uwsgi와 Gunicorn을 가장 많이 사용한다. 

 

 

WSGI 서버의 동작 원리를 구체적으로 알아보면, 

웹 서버로 들어온 동적 페이지 요청은 WSGI 서버를 호출한다. 그리고 WSGI 서버는 WSGI 애플리케이션을 이용하여 동적 페이지 요청을 처리한다. 어떻게 보면 동적 페이지 요청은 결국 WSGI 애플리케이션이 처리하는 것이다.

 

WSGI 애플리케이션에는 장고, 플라스크, 토네이도 등이 있다. 

플라스크가 바로 WSGI 애플리케이션인 것이다!!

 

출처: 점프 투 플라스크

 

위 그림과 같이 웹 브라우저의 정적 페이지 요청은 웹 서버가, 동적 페이지 요청은 [WSGI 서버 > WSGI 애플리케이션] 이 처리한다. 

 

 

 

 

* 플라스크 세션

플라스크 세션은 request와 마찬가지로 플라스크가 자동으로 생성하여 제공하는 변수이다. 즉, 세션은 플라스크 서버를 구동하는 동안에는 영구히 참조할 수 있는 값이다. 다양한 URL 요청에 세션 값을 이용해서 웹 브라우저를 요청한 주체가 로그인한 사용자인지 아닌지와같은 것들을 판단할 수 있다. 

 

웹 브라우저 요청 -> 서버 응답 순서로 실행되는데, 서버 응답 완료되면 웹 브라우저와 서버 사이의 연결은 끊어진다. 서버는 수많은 웹 브라우저 요청 중 같은 브라우저에서 요청한 것인지 아닌지를 쿠키를 통해 구별한다. 

 

Cookie

쿠키는 웹 브라우저를 구별하는 값이다. 

웹 브라우저가 요청하면 서버는 쿠키를 생성하여 전송하는 방식으로 응답한다. 그러면 웹 브라우저는 서버에서 받은 쿠키를 저장한다. 

이후 서버에 다시 요청할 때는 이 쿠키를 전송한다. 그러면 서버는 웹 브라우저가 보낸 쿠키를 보고 이전에 보냈던 쿠키와 비교하는 방식으로 같은 웹 브라우저에서 요청한 것인지 아닌지를 구분할 수 있다. 

이때, 세션은 바로 쿠키 1개당 생성되는 서버의 메모리 공간이라고 할 수 있다. 

 

 

 

 

 

 

 

 

 

참고

Do it! 점프 투 플라스크

 

320x100
반응형

'Devlog > Web' 카테고리의 다른 글

브라우저의 렌더링 과정  (0) 2022.06.10
Node.js 란?  (0) 2022.04.06
CORS(Cross-Origin Resource Sharing)  (0) 2021.07.05
Encoding & Decoding  (0) 2021.06.08
웹페이지 HTTP 헤더를 커스텀하게 변경할 수 있는 ModHeader  (0) 2021.04.06