flask,celery,rabbitmq

66 阅读1分钟
# install RabbitMQ
https://www.rabbitmq.com/docs/install-debian

rabbitmqctl add_user admin <Password>
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

rabbitmqctl add_vhost <scm-dev-vhost>
rabbitmqctl add_user <scm> <password>
rabbitmqctl set_permissions -p <scm-dev-vhost> <scm> ".*" ".*" ".*"

rabbitmq-plugins enable rabbitmq_management
# http://<server_ip>:15672
# install MariaDB
apt install mariadb-server
/etc/mysql/mariadb.conf.d/50-server.cnf
   bind-address = 0.0.0.0
mysql_secure_installation
mysql -u root -p
CREATE DATABASE scm_db;
CREATE USER 'scm'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON scm_db.* TO 'scm'@'%';
FLUSH PRIVILEGES;
# tasks.py
from celery_app import make_celery
from flask import Flask

app = Flask(__name__)

app.config.update(
    CELERY_BROKER_URL='amqp://scm:password@192.168.18.92:5672/scm-dev-vhost',
    CELERY_RESULT_BACKEND='db+mysql://scm:password@192.168.18.92:3306/scm_db?charset=utf8mb4'
)

celery = make_celery(app)

@celery.task
def add_numbers(a, b):
    return a + b
# app.py
from flask import Flask, request, jsonify
from tasks import add_numbers

app = Flask(__name__)

@app.route('/add_task', methods=['POST'])
def add_task():
    data = request.get_json()
    if not data or 'a' not in data or 'b' not in data:
        return jsonify({'error': 'Invalid data'}), 400

    a = data['a']
    b = data['b']
    task = add_numbers.apply_async((a, b))
    return jsonify({'task_id': task.id}), 202


@app.route('/task_status/<task_id>', methods=['GET'])
def task_status(task_id):
    task = add_numbers.AsyncResult(task_id)

    if task.state == 'PENDING':
        response = {
            'state': task.state,
            'status': 'Pending...'
        }
    elif task.state == 'SUCCESS':
        response = {
            'state': task.state,
            'result': task.result
        }
    else:
        response = {
            'state': task.state,
            'status': str(task.info)
        }
    return jsonify(response)

if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)
# celery_app.py
from celery import Celery

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
# apt install python3-venv libmariadb-dev python3-dev gcc pkg-config
# pip install flask celery mysqlclient

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

python app.py