Coding 공부/Big data & Python

[Bigdata & Python] Flask, PostgreSQL

CBJH 2024. 4. 11.
728x90
반응형

1. FastAPI와 Flask의 차이점

 

FastAPI와 Flask는 모두 Python으로 작성된 웹 프레임워크지만, 각각의 목적과 설계 철학, 제공하는 기능에 있어서 차이가 있습니다. 아래에서 두 프레임워크의 주요 차이점을 설명하겠습니다.

  1.1 Flask

  • 성숙도와 안정성: Flask는 2010년에 처음 출시되어 오랜 기간 동안 많은 프로젝트에서 사용되어 왔습니다. 이로 인해 광범위한 커뮤니티 지원과 풍부한 서드파티 라이브러리, 확장 기능을 자랑합니다.
  • 간단하고 유연한 프레임워크: Flask는 "마이크로" 웹 프레임워크로 분류되며, 최소한의 기본 구조를 제공합니다. 이는 개발자가 필요에 따라 확장하고 맞춤 설정할 수 있는 유연성을 의미합니다.
  • 동기식 처리: Flask는 기본적으로 동기 방식의 코드 처리를 사용합니다. 비동기 처리를 위해서는 추가적인 확장이나 복잡한 설정이 필요할 수 있습니다.

  1.2 FastAPI

  • 성능: FastAPI는 Starlette(비동기 웹 프레임워크) 위에 구축되어 있어 비동기 I/O를 지원합니다. 이는 고성능을 필요로 하는 애플리케이션에 적합하며, 특히 동시성 처리가 중요한 상황에서 Flask보다 뛰어난 성능을 제공할 수 있습니다.
  • 비동기 지원: FastAPI는 Python의 비동기 및 await 기능을 기본적으로 지원하여 비동기 프로그래밍을 용이하게 합니다. 이를 통해 I/O 작업이 많은 애플리케이션의 처리 성능을 크게 향상시킬 수 있습니다.
  • 타입 힌트와 자동 문서 생성: FastAPI는 Python의 타입 힌트를 활용하여 요청 및 응답 데이터의 검증을 자동으로 처리합니다. 또한, 이를 바탕으로 Swagger와 ReDoc을 이용한 API 문서를 자동으로 생성할 수 있습니다.
  • 데이터 검증 및 직렬화: Pydantic 라이브러리의 사용으로 복잡한 데이터 검증과 직렬화 작업을 간편하게 처리할 수 있습니다. 이는 API 개발 시 일반적으로 필요한 작업을 매우 단순화합니다.

  1.3 결론

  • Flask: 단순하고 유연한 프로젝트, 또는 작고 단일 목적의 애플리케이션 개발에 적합합니다. 동기식 처리가 주를 이루는 경우나 기존 Python 생태계와의 통합이 중요한 경우에도 좋은 선택입니다.
  • FastAPI: 고성능과 비동기 처리가 필요한 애플리케이션, 복잡한 데이터 처리와 검증이 많은 API 개발에 적합합니다. 또한, 타입 힌트와 자동 문서화 기능을 활용하고자 할 때 우수한 선택입니다.

프로젝트의 요구 사항과 선호도에 따라 적합한 프레임워크를 선택하는 것이 중요합니다.

 

 

2. Flask

  • 이론 설명 링크 :  https://just-record.github.io/flask/flask-basic/
  • python의 웹 프레임워크로 자바 스크립트처럼 HTML의 요소에 접근하여 값을 수정하거나 스타일을 변경하는 등 다양한 웹 개발을 할 수 있다.
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def home():
    return render_template('home.html')
# http://localhost:5000/

@app.route('/member')
def member():
    return render_template('member.html')

### 데이터
@app.route('/job/<jobname>')
def job(jobname):
    # select * from users where job name = 'jo';
    return render_template('job.html', jobname=jobname)
# http://localhost:5000/job/developer

if __name__ == '__main__':
    app.run()

 

  • 파이썬에서 @는 데코레이터이다. Flask 모듈의 route() 함수에 있는 내용을 사용할 수 있다.
  • 기본주소는 http://localhost:5000/ 이고, @app.route('/member') 이면 기본주소에 해당 매개변수를 추가한 주소에 return값을 할당한다.
  • render_template() : templates 폴더 안에 있는 html 파일을 반환한다.
  • 변수는 render_template()함수의 두번째 매개 변수로 전달할 수 있다. html에서 해당 변수는 {{jobname}} 처럼 중괄호를 두번 사용해서 나타낸다.

<!DOCTYPE html>
<html>
<head>
    <title>Job</title>
</head>
<body>
    <h1>Job: {{jobname}}</h1>
</body>
</html>
  • html에서는 중괄호를 두번 사용해서 변수를 표현한다.

 

from flask import Flask

app = Flask(__name__)   # Flask 객체 생성(__name__ 이름으로)

@app.route('/board')
def board1():
    return '<style>#test{color:red;}</style> <div id="test">Board</div>'
# http://localhost:5000/board

if __name__ == '__main__':
    app.run()
  • return에 render_template()함수가 아닌 html 코드를 직접 입력해 반환 받을 수 있다.

 

 

 

3. PostgreSQL

 

pip install psycopg2
  • Python에서 PostgreSQL을 사용하기 위해 ‘psycopg2’ 모듈을 사용합니다.
  • PostgreSQL 사용을 위해 pdAdmin을 설치합니다. 링크 : https://just-record.github.io/postgresql/postgresql-02/
  • 테스트를 위해 pdAdmin을 실행해 스키마 > 테이블 > 컬럼을 만든다.

 

import psycopg2

conn = psycopg2.connect(
    host="192.168.52.61",
    database="postgres",
    user="postgres",
    password="1234"
)

cur = conn.cursor()

data = [("홍길동", 32), ("홍길순", 33)]
query = "INSERT INTO users (name, age) VALUES (%s, %s)"
cur.executemany(query, data)
conn.commit()


cur.execute("SELECT * FROM users")
rows = cur.fetchall()
for row in rows:
    print(row)
  • psycopg2 모듈을 import한다.
  • psycopg2.connect() 메소드로 연결할 객체를 생성한다.
  • cursor에 execute해서 쿼리문을 SQL로 보낸다.
  • commit(), rollback() 함수로 트랜젝션을 한다.

 

 

4. python에서 flask를 이용해 get, post형식으로 웹페이지 열기 

from flask import Flask, render_template, request

app = Flask(__name__)


@app.route('/request_get_form')
def request_get_form():
    return render_template('request_form.html')

@app.route('/request_get', methods = ['GET'])
def request_get():
    name = request.args.get('name')
    age = request.args.get('age')
    return render_template('request_result.html', name=name, age=age)    

@app.route('/request_post', methods = ['POST'])
def request_post():
    name = request.form['name']
    age = request.form['age']
    return render_template('request_result.html', name=name, age=age)        

if __name__ == '__main__':
    app.run()

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <title>Flask Request</title>
</head>
<body>
    <h1>A Link - get</h1>
    <p><a href="/request_get?name=hong&age=17">request get</a></p>
    
    <p></p>

    <h1>Form - post</h1>
    <form name="form_post" method="post" action="/request_post">
        <p>Name: <input type="text" name="name" /></p>
        <p>Age: <input type="text" name="age" /></p>
        <p><input type="submit" ></p>
    </form>
</body>
</html>

request_form.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Flask Render</title>
</head>
<body>
    <h1>A Link get</h1>
    <p>Name: {{name}}</p>
    <p>Age: {{age}}</p>
</body>
</html>

request_result.html

 

 

댓글