Django RabbitMQ消费者

izj3ouym  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(3)|浏览(240)

我正在构建一个Django应用程序,它将被多个外部应用程序访问。Django应用程序应该提供UI,并使用从外部应用程序接收的数据填充数据库。
第一个想法是使用django_rest_framework,但这似乎是创建一个紧密耦合的系统,因为每个外部应用程序都必须通过REST调用来联系Django应用程序。
我的另一个想法最好用一幅图来描述:http://imgur.com/vakZvQs几个发布者会在RabbitMQ上创建消息,我的Django会使用这些消息并在DB中创建适当的模型。
我已经使用了pika库中的async示例,发布者和消费者的消息都按照预期的方式流动。将Django扔到混合中会产生如下错误:

RuntimeError: Model class django.contrib.contenttypes.models.ContentType doesn't declare an explicit app_label  

django.core.exceptions.ImproperlyConfigured: Requested setting LOGGING_CONFIG, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

代码摘录:


# pika consumer

def on_message(self, unused_channel, basic_deliver, properties, body):
        # invoking view function
        from myapp.views import create_one_foo
        create_one_foo()
        self.acknowledge_message(basic_deliver.delivery_tag)

# views.py

from .models import Foo

def create_one_foo():
    foo = Foo()
    foo.bar = "bar"
    foo.save()
krcsximq

krcsximq1#

我有类似的问题,它是解决了调用这两行之前,你导入的模型。

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "admin.settings")
django.setup()

然后再

from .models import Foo

我还在学习django,如果我找到一个详细的解释,我会编辑我的答案

ux6nzvsh

ux6nzvsh2#

使用this article创建使用者

import json
import pika
import django
from sys import path
from os import environ

path.append('/home/john/Dev/SECTION/Likes/Likes/settings.py') #Your path to settings.py file
environ.setdefault('DJANGO_SETTINGS_MODULE', 'Likes.settings') 
django.setup()
from likes.models import Quote

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost', heartbeat=600, blocked_connection_timeout=300))
channel = connection.channel()
channel.queue_declare(queue='likes')

def callback(ch, method, properties, body):
    print("Received in likes...")
    print(body)
    data = json.loads(body)
    print(data)

    if properties.content_type == 'quote_created':
        quote = Quote.objects.create(id=data['id'], title=data['title'])
        quote.save()
        print("quote created")
    elif properties.content_type == 'quote_updated':
        quote = Quote.objects.get(id=data['id'])
        quote.title = data['title']
        quote.save()
        print("quote updated")
    elif properties.content_type == 'quote_deleted':
        quote = Quote.objects.get(id=data)
        quote.delete()
        print("quote deleted")
channel.basic_consume(queue='likes', on_message_callback=callback, auto_ack=True)
print("Started Consuming...")
channel.start_consuming()
lp0sw83n

lp0sw83n3#

再看celery :http://www.celeryproject.org这是一个帮助创建基于RabbitMQ的工作者的框架
在Django应用所在的主机上运行一个celery worker服务。如果你需要更改Django DB的状态,只需导入Django模型,然后由worker将数据放入数据库即可。否则,你可以在Django应用中运行celery worker。

相关问题