프로젝트1. Flask로 백엔드 구현하기

손호준·2022년 11월 24일
0
post-thumbnail

웹 애플리케이션의 흐름

HTTP

  • HTTP 메시지에 모든 형태의 데이터를 담아 보낸다 (HTML, TEXT, IMAGE, 음성, 영상, 파일, JSON, XML ).
  • 서버 간 데이터를 주고 받을 때도 HTTP를 사용한다.

웹 서버(Web Server)

  • 웹 브라우저와 통신할 수 있도록 소켓 연결 등의 네트워크 처리를 한다. 브라우저에서 보낸 요청 메시지를 해석하고 정적 리소스(HTML, CSS, JS, 이미지, 영상 등)로 응답해줄 수 있으면 바로 브라우저에 응답해준다. 동적 처리가 필요하면 웹 애플리케이션 서버에 요청한다.
  • NGINX, APACHE 등

웹 애플리케이션 서버(WAS)

  • 웹서버로 부터 요청을 받아 동적인 데이터 처리와 애플리케이션 로직을 수행한다.

웹 서버와 WAS를 분리하는 이유

  • 요즘은 경계가 모호한 편이지만, 일반적으로 정적 리소스를 웹 서버가 처리함으로써 WAS의 과부하를 막을 수 있고, 효율적인 리소스 관리가 가능해진다(웹 서버 or WAS를 상황에 맞게 증설 가능).
  • 웹 서버가 브라우저와 WAS 사이 중계 역할을 하므로 보안상 안전하다.

프로젝트1. f1.fasoo.com 백엔드 구현

Front-end : React
Web Server : NginX
Database : PostgreSQL

목표 : flask로 HTTP API 구현
핵심은 DB로부터 데이터를 가져와서 딕셔너리 만들기(by pandas)

선행 목표

  • flask 사용법 숙지하기

flask

flask란?

Python의 프레임워크이며, 특별한 도구나 라이브러리가 필요 없는 마이크로 웹 프레임워크 이다. 최소한의 구성 요소와 요구 사항을 제공하기 때문에 시작하기 쉽고 유연하게 사용할 수 있다. Werkzeug 툴킷과 Jinja2 템플릿 엔진에 기반을 두고 있다. Werkzeug은 WSGI 유틸리티이며, HTTP 요청을 처리하기 위한 함수(혹은 callable object)로 environ과 start_response를 컨테이너로부터 받아 요청을 처리하는 미들웨어이다.

WSGI란?
웹 서버와 WAS와 데이터를 주고 받을 수 있는 인터페이스이다. Callable Object(함수나 객체)를 통해 Web Server 가 요청에 대한 정보를 WAS에 전달한다. Callable Object 를 통해 HTTP 요청에 대한 정보와 콜백 함수를 전해주어야 한다. WAS는 HTTP 요청에 대한 정보를 가지고 비즈니스 로직을 수행한 뒤에 콜백함수를 통해 결과를 웹서버에 반환한다.

flask 설정과 관례

일반적으로 템플릿과 정적파일은 애플리케이션의 파이썬 소스 디렉토리의 하위 디렉토리에 templates과 statics에 저장된다.

flask_application
|__templates
	|__index.html
|__statics
	|__upload.png
|_app.py
정적 파일
동적인 웹 어플리케이션은 정적 파일을 필요로한다. 그것들은 보통 자바스크립트나 CSS파일을 의미한다. 이상적으로 웹서버는 정적 파일들을 서비스하지만, 개발시에는 flask가 그 역할을 대신해준다. 단지 static 이라는 폴더를 여러분이 생성한 패키지 아래에 만들거나 모듈 옆에 위치시키면 개발된 어플리케이션에서 /static 위치에서 정적 파일을 제공할 것이다.

flask를 사용한 최소한의 애플리케이션

from flask import Flask #flask 클래스 가져옴

app = Flask(__name__) #flask 클래스의 인스턴스 생성. 이 인스턴스는 WSGI 애플리케이션이 됨

@app.route("/") # route() 데코레이터로 어떤 URL이 함수를 트리거해야 하는지 Flask에 알림
def hello_world():
    return "<p>Hello, World!</p>" #사용자의 브라우저에 표시하려는 메시지 반환
    
if __name__ == '__main__': # python 인터프리터로 직접 실행한다면 현재 동작되는 유일한 서버라는 것을 보장
    app.run() # 로컬서버로 실행

jinja2 템플릿이란?

파이썬 코드에서 HTML을 생성하는 것은 번거롭다. jinja2는 특정 데이터와 템플릿을 연결해 flask에서 구현이 어려운 동적인 움직임(원래는 이스케이핑을 직접 작성해야함)을 지원하는 템플릿엔진이다. 부모 템플릿으로부터 상속 받아서 사용이 가능하다.

from flask import render_template

@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
    return render_template('hello.html', name=name) #템플릿 뿌려주기 위해 render_template() 메소드 사용
<!-- 템플릿 및 상속 예시 -->
<!-- 부모 템플릿(base.html) -->
<html>
  <head>
    <title>Hi Flask</title>
  </head>
  <body>
  {% block content %}{% endblock %}
  </body>
</html>

<!-- 자식 템플릿(index.html) -->
{% extends "base.html"  %}
{% block content %}
  <title>Hello from Flask</title>
{% if name %}
  <h1>Hello {{ name }}!</h1>
{% else %}
  <h1>Hello World!</h1>
{% endif %}
{% endblock %}
profile
Rustacean🦀/Data engineer💻

0개의 댓글