This commit is contained in:
parent
5b8d88339f
commit
80d115e488
@ -12,3 +12,4 @@ psycopg2-binary
|
|||||||
marshmallow
|
marshmallow
|
||||||
marshmallow-sqlalchemy
|
marshmallow-sqlalchemy
|
||||||
flask-marshmallow
|
flask-marshmallow
|
||||||
|
flask-pika
|
||||||
|
20
src/app.py
20
src/app.py
@ -8,7 +8,7 @@ from sentry_sdk.integrations.flask import FlaskIntegration
|
|||||||
from config import *
|
from config import *
|
||||||
from db import db
|
from db import db
|
||||||
from marshm import ma
|
from marshm import ma
|
||||||
from rabbit_broker_instance import mq
|
from fpika import fpika
|
||||||
from resources import SampleResource, SampleParameterResource
|
from resources import SampleResource, SampleParameterResource
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@ -31,19 +31,21 @@ if SENTRY_DSN:
|
|||||||
_experiments={"auto_enabling_integrations": True}
|
_experiments={"auto_enabling_integrations": True}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
app.config['SQLALCHEMY_DATABASE_URI'] = f"postgresql://{POSTGRES_USERNAME}:{POSTGRES_PASSWORD}@{POSTGRES_HOSTNAME}:5432/{POSTGRES_DB}"
|
app.config[
|
||||||
app.config['RABBIT_USERNAME'] = RABBITMQ_USERNAME
|
'SQLALCHEMY_DATABASE_URI'] = f"postgresql://{POSTGRES_USERNAME}:{POSTGRES_PASSWORD}@{POSTGRES_HOSTNAME}:5432/{POSTGRES_DB}"
|
||||||
app.config['RABBIT_PASSWORD'] = RABBITMQ_PASSWORD
|
|
||||||
app.config['RABBIT_HOST'] = RABBITMQ_HOST
|
|
||||||
app.config['RABBIT_ROUTING_KEY'] = "feature"
|
|
||||||
app.config['EXCHANGE_NAME'] = RABBITMQ_EXCHANGE
|
app.config['EXCHANGE_NAME'] = RABBITMQ_EXCHANGE
|
||||||
|
app.config['FLASK_PIKA_PARAMS'] = {'host': RABBITMQ_HOST,
|
||||||
|
'username': RABBITMQ_USERNAME,
|
||||||
|
'password': RABBITMQ_PASSWORD,
|
||||||
|
'port': 5672,
|
||||||
|
'virtual_host': '/'}
|
||||||
|
app.config['FLASK_PIKA_POOL_PARAMS'] = {'pool_size': 4,
|
||||||
|
'pool_recycle': 60}
|
||||||
api = Api(app)
|
api = Api(app)
|
||||||
db.init_app(app)
|
db.init_app(app)
|
||||||
ma.init_app(app)
|
ma.init_app(app)
|
||||||
mq.init_app(app)
|
fpika.init_app(app)
|
||||||
|
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
db.create_all()
|
db.create_all()
|
||||||
|
@ -1,102 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
import uuid
|
|
||||||
import pika
|
|
||||||
|
|
||||||
"""
|
|
||||||
Flask Rabbit Broker
|
|
||||||
"""
|
|
||||||
|
|
||||||
__author__ = '@tormakris'
|
|
||||||
__copyright__ = "Copyright 2020, Birbnetes Team"
|
|
||||||
__module_name__ = "flask_rabbit_broker"
|
|
||||||
__version__text__ = "1"
|
|
||||||
|
|
||||||
|
|
||||||
class FlaskRabbitBroker:
|
|
||||||
"""Message Broker using RabbitMQ middleware"""
|
|
||||||
|
|
||||||
def __init__(self, app=None):
|
|
||||||
"""
|
|
||||||
Create a new instance of Broker Rabbit by using
|
|
||||||
the given parameters to connect to RabbitMQ.
|
|
||||||
"""
|
|
||||||
self.app = app
|
|
||||||
self.exchange_name = None
|
|
||||||
self.username = None
|
|
||||||
self.password = None
|
|
||||||
self.rabbitmq_host = None
|
|
||||||
self.routing_key = None
|
|
||||||
self.connection = None
|
|
||||||
self.channel = None
|
|
||||||
self.exchange = None
|
|
||||||
self.exchange_type = "fanout"
|
|
||||||
|
|
||||||
def init_app(self, app) -> None:
|
|
||||||
"""
|
|
||||||
Init the broker with the current application context
|
|
||||||
:param app: application context
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
self.username = app.config.get('RABBIT_USERNAME')
|
|
||||||
self.password = app.config.get('RABBIT_PASSWORD')
|
|
||||||
self.rabbitmq_host = app.config.get('RABBIT_HOST')
|
|
||||||
self.exchange_name = app.config.get('EXCHANGE_NAME')
|
|
||||||
self.routing_key = app.config.get('RABBIT_ROUTING_KEY')
|
|
||||||
self.init_connection(timeout=5)
|
|
||||||
self.init_exchange()
|
|
||||||
|
|
||||||
def init_connection(self, timeout: int = 5) -> None:
|
|
||||||
""""
|
|
||||||
Init RabbitMQ connection
|
|
||||||
:param timeout: timeout of connection
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
credentials = pika.PlainCredentials(self.username, self.password)
|
|
||||||
self.connection = pika.BlockingConnection(pika.ConnectionParameters(host=self.rabbitmq_host,
|
|
||||||
credentials=credentials,
|
|
||||||
heartbeat=0,
|
|
||||||
socket_timeout=timeout))
|
|
||||||
|
|
||||||
def close_connection(self) -> None:
|
|
||||||
self.connection.close()
|
|
||||||
|
|
||||||
def init_exchange(self) -> None:
|
|
||||||
"""
|
|
||||||
Init the exchange use to send messages
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
channel = self.connection.channel()
|
|
||||||
try:
|
|
||||||
channel.exchange_declare(exchange=self.exchange_name,
|
|
||||||
exchange_type=self.exchange_type,
|
|
||||||
durable=True,
|
|
||||||
auto_delete=False)
|
|
||||||
finally:
|
|
||||||
channel.close()
|
|
||||||
|
|
||||||
def register_callback(self, callback) -> None:
|
|
||||||
"""
|
|
||||||
Register a callback.
|
|
||||||
:param callback:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
channel = self.connection.channel()
|
|
||||||
queue = channel.queue_declare(durable=True, auto_delete=False, exclusive=True,
|
|
||||||
queue=uuid.uuid4().urn.split(':')[2]).method.queue
|
|
||||||
channel.bind(exchange=self.exchange_name, queue=queue)
|
|
||||||
channel.basic_consume(queue=queue, on_message_callback=callback, auto_ack=True)
|
|
||||||
|
|
||||||
def send(self, message: str) -> None:
|
|
||||||
"""
|
|
||||||
Sends a message to the declared exchange.
|
|
||||||
:param message:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
channel = self.connection.channel()
|
|
||||||
try:
|
|
||||||
channel.basic_publish(
|
|
||||||
exchange=self.exchange_name,
|
|
||||||
routing_key=self.routing_key,
|
|
||||||
body=message.encode('utf-8'))
|
|
||||||
finally:
|
|
||||||
channel.close()
|
|
14
src/fpika.py
Normal file
14
src/fpika.py
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
"""
|
||||||
|
Flask-Pika API
|
||||||
|
"""
|
||||||
|
|
||||||
|
__author__ = '@tormakris'
|
||||||
|
__copyright__ = "Copyright 2020, Birbnetes Team"
|
||||||
|
__module_name__ = "fpika"
|
||||||
|
__version__text__ = "1"
|
||||||
|
|
||||||
|
from flask_pika import Pika as Fpika
|
||||||
|
|
||||||
|
fpika = Fpika()
|
@ -1,14 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
from flask_rabbit_broker import FlaskRabbitBroker
|
|
||||||
|
|
||||||
"""
|
|
||||||
Rabbit Broker instance
|
|
||||||
"""
|
|
||||||
|
|
||||||
__author__ = '@tormakris'
|
|
||||||
__copyright__ = "Copyright 2020, Birbnetes Team"
|
|
||||||
__module_name__ = "rabbit_broker_instance"
|
|
||||||
__version__text__ = "1"
|
|
||||||
|
|
||||||
mq = FlaskRabbitBroker()
|
|
@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
import pika
|
|
||||||
from config import *
|
|
||||||
|
|
||||||
"""
|
|
||||||
Rabbitmq setup
|
|
||||||
"""
|
|
||||||
|
|
||||||
__author__ = '@tormakris'
|
|
||||||
__copyright__ = "Copyright 2020, Birbnetes Team"
|
|
||||||
__module_name__ = "endpoints"
|
|
||||||
__version__text__ = "1"
|
|
||||||
|
|
||||||
credentials = pika.PlainCredentials(RABBITMQ_USERNAME, RABBITMQ_PASSWORD)
|
|
||||||
rabbitmq = pika.BlockingConnection(pika.ConnectionParameters(host=RABBITMQ_HOST, credentials=credentials))
|
|
||||||
rabbitmq_channel = rabbitmq.channel()
|
|
||||||
rabbitmq_channel.exchange_declare(exchange=RABBITMQ_EXCHANGE, exchange_type='fanout')
|
|
@ -5,12 +5,11 @@ from xeger import Xeger
|
|||||||
from flask_restful import Resource
|
from flask_restful import Resource
|
||||||
from flask import request
|
from flask import request
|
||||||
import requests
|
import requests
|
||||||
import pika
|
|
||||||
from db import db
|
from db import db
|
||||||
from models import SampleMetadata
|
from models import SampleMetadata
|
||||||
from schemas import SampleSchema, SampleMetadataSchema
|
from schemas import SampleSchema, SampleMetadataSchema
|
||||||
from config import *
|
from config import *
|
||||||
from rabbit_broker_instance import mq
|
from fpika import fpika
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Flask Restful endpoints
|
Flask Restful endpoints
|
||||||
@ -77,7 +76,10 @@ class SampleResource(Resource):
|
|||||||
soundfile,
|
soundfile,
|
||||||
soundfile.content_type,
|
soundfile.content_type,
|
||||||
{'Content-Length': soundfile.content_length})}).raise_for_status()
|
{'Content-Length': soundfile.content_length})}).raise_for_status()
|
||||||
mq.send(json.dumps({'tag': generated_tag}))
|
ch = fpika.channel()
|
||||||
|
ch.basic_publish(exchange=RABBITMQ_EXCHANGE, routing_key='feature',
|
||||||
|
body=json.dumps({'tag': generated_tag}).encode('UTF-8'))
|
||||||
|
fpika.return_channel(ch)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
LOGGER.exception(e)
|
LOGGER.exception(e)
|
||||||
db.session.rollback()
|
db.session.rollback()
|
||||||
|
Loading…
Reference in New Issue
Block a user