[파이썬] Flask에서의 비동기 요청 처리

Flask는 파이썬으로 작성된 마이크로 웹 프레임워크로, 비동기 요청 처리를 제공하지 않습니다. 그러나 Flask 애플리케이션에서 비동기 작업을 처리하기 위해 다른 도구와 라이브러리를 통합할 수 있습니다.

여기서는 Flask 애플리케이션에서 비동기 요청을 처리하기 위해 Flask-SocketIO라이브러리와 gevent 패키지를 사용하는 방법을 살펴보겠습니다.

1. Flask-SocketIO 설치

처음으로 Flask-SocketIO를 설치해야 합니다.

pip install Flask-SocketIO

2. Flask 애플리케이션 설정

app.py라는 파일을 만들고 다음과 같이 Flask 애플리케이션을 설정합니다.

from flask import Flask, render_template
from flask_socketio import SocketIO

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
socketio = SocketIO(app)

3. 비동기 요청 처리

@socketio.on 데코레이터를 사용하여 클라이언트에서 보낸 비동기 요청을 처리할 수 있습니다. 이 예제에서는 클라이언트로부터 “async_task”라는 이벤트를 수신하고, “async_response”라는 이벤트와 함께 결과를 응답합니다.

@socketio.on('async_task')
def handle_async_task(data):
    # 비동기 작업 수행
    result = do_async_task(data)

    # 결과를 클라이언트에게 응답
    socketio.emit('async_response', result)

4. 비동기 작업 수행하기

실제로 비동기 작업을 수행하는 함수가 있어야 합니다. 이 함수는 gevent 라이브러리를 사용하여 비동기로 실행됩니다.

import gevent

def do_async_task(data):
    # 비동기 작업 수행
    gevent.sleep(1)  # 임의의 비동기 작업 대기 시간

    # 결과 반환
    return "Task completed"

5. 클라이언트에서 비동기 요청 보내기

클라이언트에서 socket.io를 사용하여 비동기 요청을 Flask 애플리케이션으로 보낼 수 있습니다.

<script src="https://cdn.socket.io/socket.io-3.1.2.js"></script>
<script type="text/javascript">
    const socket = io.connect('http://localhost:5000');
  
    // 비동기 요청 보내기
    socket.emit('async_task', {data: 'Hello'});
  
    // 비동기 응답 받기
    socket.on('async_response', function(result) {
      console.log(result);
    });
</script>

위의 코드에서 http://localhost:5000은 Flask 애플리케이션이 실행 중인 호스트와 포트에 맞게 수정해야 합니다.

결론

Flask 애플리케이션에서 비동기 요청을 처리하는 방법을 살펴보았습니다. Flask-SocketIOgevent를 사용하여 비동기 작업을 처리할 수 있습니다. 이를 통해 애플리케이션의 성능을 향상시키고, 동시에 다중 클라이언트 요청을 처리할 수 있습니다.

위의 예제는 Flask에서 비동기 요청을 처리하는 방법을 보여주는 단순한 예제입니다. 실제로는 더 복잡한 비동기 작업을 수행해야 할 수도 있으므로, 필요에 따라 라이브러리와 도구를 선택하여 Flask 애플리케이션에 통합하는 것이 좋습니다.