본문 바로가기

About/Flask

[Flask] Session 객체를 이용한 동기식 호출

Session 객체 생성

Flask Application 객체의 extensions에는 애플리케이션의 특정 상태 등을 저장할 수 있습니다.

다음 코드는 Session 객체를 저장하는 용도로 사용합니다.

 

extensions를 먼저 등록한 다음 Session을 추가합니다.

 

#flask_session.py
from requests import Session

def setup_connector(app, name='default', **options):
    if not hasattr(app, 'extensions'):
        app.extensions = {}
    
    if 'connectors' not in app.extensions:
        app.extensions['connectors'] = {}
    
    session = Session()
    
    if 'auth' in options:
        session.auth = options['auth']
    headers = options.get('headers', {})
    
    if 'Content-Type' not in headers:
        headers['Content-Type'] = 'application/json'
    
    session.headers.update(headers)
    
    app.extensions['connectors'][name] = session
    return session

def get_connector(app, name='default'):
    return app.extensions['connectors'][name]

setup_connector() 함수는 Session 객체를 생성해  appextensions에 저장합니다. 생성된 Session의 Content-Type 헤더 값은 application/json이 기본으로 지정되므로 JSON 기반의 마이크로서비스에 데이터를 보내는 데 쓸 수 있습니다.

 

이처럼 세션이 앱에 저장되면 뷰에서는 get_connector() 함수로 저장된 세션을 가져올 수 있습니다. 

 

Flask app의 동기식 호출

다음 플라스크 애플리케이션은 5001 포트에서 요청을 기다리고 요청이 들어오면 응답을 만들기 위해 5000번 포트에서 실행되고 있는 또다른 마이크로서비스를 동기식으로 호출합니다. (5000번 포트에 서버가 실행 중이라고 가정합니다.)

 

# app.py
from flask import Flask, jsonify
from flask_session import setup_connector, get_connector

app = Flask(__name__)
setup_connector(app)

@app.route('/api', methods=['GET', 'POST'])
def my_microservice():
    with get_connector(app) as conn:
        sub_result = conn.get('http://localhost:5000/api').json() # 동기식 호출
    return jsonify({'result':sub_result, 'Hello':'World'})

if __name__ == "__main__":
    app.run(port=5001)

 

위의 서버를 실행시키고 curl을 이용하여 호출합니다.

$ curl localhost:5001/api

 

5001번 포트가 요청을 받아 5000번 포트 동기식 호출을 한 후 결과를 다시 응답하는 것을 확인할 수 있습니다.

 


Flask에서 Session 객체를 이용한 간단한 동기식 호출을 구현해보았습니다.