프로그래밍/Python

[Python 강의] 29강 - Flask와 비동기 작업을 활용한 실시간 알림 시스템 구축

월횽 2024. 11. 7. 06:30
728x90
반응형
SMALL

안녕하세요! 그레이 해커 월횽입니다. 오늘은 Flask와 비동기 작업을 활용한 실시간 알림 시스템 구축 방법을 알아보겠습니다. 실시간 알림 시스템은 사용자 경험을 향상시키며, 특히 새로운 알림이나 업데이트가 즉시 사용자에게 전달되어야 할 때 유용합니다.

 

 

1. 실시간 알림의 필요성

실시간 알림 시스템은 다음과 같은 상황에서 유용하게 사용할 수 있습니다.

· 메시지 알림 (예: 채팅 시스템)
· 주문 상태 업데이트
· 사용자 활동 알림

 

 

2. 시스템 개요

이 시스템은 Flask와 Flask-SocketIO로 웹소켓을 이용해 실시간 알림을 처리하며, Celery와 Redis를 통해 비동기 작업을 처리합니다. 기본적으로 사용자 요청을 Celery로 보내 작업을 처리하고, 작업이 완료되면 웹소켓을 통해 클라이언트에게 실시간 알림을 보냅니다.

 

 

3. Flask-SocketIO 설치 및 설정

웹소켓을 위한 Flask-SocketIO를 설치합니다.

pip install flask-socketio
반응형
from flask import Flask, request, jsonify
from flask_socketio import SocketIO, emit
from celery import Celery

app = Flask(__name__)
app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0'
app.config['CELERY_RESULT_BACKEND'] = 'redis://localhost:6379/0'
socketio = SocketIO(app)

def make_celery(app):
    celery = Celery(app.import_name, backend=app.config['CELERY_RESULT_BACKEND'], broker=app.config['CELERY_BROKER_URL'])
    celery.conf.update(app.config)
    return celery

celery = make_celery(app)

 

 

 

4. 비동기 작업 정의

비동기 작업은 Celery로 처리하며, 작업 완료 시 웹소켓을 통해 클라이언트로 알림을 보냅니다.

728x90
@celery.task
def background_task(data):
    # 예시 작업 (예: 파일 처리)
    result = f"Data processed: {data}"
    # 작업 완료 후 실시간 알림 전송
    socketio.emit('task_complete', {'data': result}, broadcast=True)
    return result

 

 

 

5. 클라이언트에서 웹소켓 연결

이제 클라이언트가 실시간 알림을 받을 수 있도록 웹소켓을 설정합니다. 클라이언트에서 Socket.IO 라이브러리를 사용하여 서버와 실시간으로 연결합니다.

<!DOCTYPE html>
<html>
<head>
    <title>Real-time Notifications</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.min.js"></script>
    <script type="text/javascript">
        document.addEventListener("DOMContentLoaded", () => {
            const socket = io.connect('http://localhost:5000');

            socket.on('task_complete', (data) => {
                alert(`알림: ${data.data}`);
            });
        });
    </script>
</head>
<body>
    <h1>실시간 알림 시스템</h1>
</body>
</html>

 

 

 

6. 알림 트리거 라우트

Flask에서 클라이언트 요청을 받아 비동기 작업을 실행하고 알림을 전송하는 라우트를 정의합니다.

SMALL
@app.route('/start_task', methods=['POST'])
def start_task():
    data = request.json.get('data')
    task = background_task.delay(data)
    return jsonify({"task_id": task.id, "status": "작업이 시작되었습니다."}), 202

 

 

 

7. Celery 워커와 SocketIO 서버 실행

Celery 워커와 Flask-SocketIO 서버를 동시에 실행합니다.

celery -A app.celery worker --loglevel=info

 

Flask 애플리케이션을 실행할 때는 socketio.run(app)을 사용하여 웹소켓을 활성화합니다.

if __name__ == '__main__':
    socketio.run(app, debug=True)

 

 

다음 시간에는 Flask와 프론트엔드 연동을 통한 완성도 높은 웹 애플리케이션 구축을 다루겠습니다!

 

 

 

 

 

- 이전 수업 목록

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
LIST