没有redis的django频道

ct2axkht  于 2021-06-10  发布在  Redis
关注(0)|答案(2)|浏览(456)

我有一个基于本教程的django应用程序,它运行得非常好。它在通道层中使用redis

CHANNEL_LAYERS = {
    'default': {
       'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [('127.0.0.1', 6379)],
     },
 },

}
我的问题是,我的网络托管提供商将不允许redis(除非我付费)££££).
我能找到的每个例子都在这个角色中使用redis。我有没有别的选择?

byqmnocz

byqmnocz1#

事实证明,在一个负担得起的网络托管平台上,频道是不可能的。所以我恢复使用ajax和长轮询。我的应用程序基于这个django教程。
型号.py

class Message(models.Model):
    room_name = models.CharField(null=False, blank=False, max_length=50)
    sender = models.CharField(null=False, blank=False, max_length=50, default='Sender username')
    datetime = models.DateTimeField(null=True, auto_now_add=True)
    type = models.IntegerField(null=True, blank=True)
    text = models.CharField(null=False, blank=False, max_length=250, default='message text')
    context = models.TextField(null=True, blank=True)

网址.py

urlpatterns = [
    path('<str:partner_pk>/check-message', views.CheckMessage.as_view(), name="check-message"),
    path('<str:partner_pk>/send-message/<str:chat_text>', views.SendMessage.as_view(), name="send-message"),
]

视图.py

class CheckMessage(View):
    """Duo check message."""

    def get(self, request, partner_pk):
        """Render the GET request."""
        pair, room_name = sort_pair(partner_pk, request.user.pk)
        partner = User.objects.get(pk=partner_pk)
        profile = get_object_or_404(Profile, user=request.user)
        message = Message.objects.filter(room_name=room_name, sender=partner.username).earliest('datetime')
        context = {'type': -1}
        context = json.loads(message.context)
        context['sender'] = message.sender
        context['datetime'] = message.datetime
        context['message_type'] = message.type
        context['text'] = message.text
        context['seat'] = profile.seat
        message.delete()
        return JsonResponse(context, safe=False)

class SendMessage(View):
    def get(self, request, partner_pk, chat_text):
        message_type = app.MESSAGE_TYPES['chat']
        send_message(request, partner_pk, message_type, text=chat_text, context={})
        return JsonResponse({}, safe=False)

聊天室.js

window.setInterval(checkMessage, 3000);

function checkMessage () {
    $.ajax(
        {
        type:"GET",
        url: "check-message",
        cache: false,
        success: function(message) {
            processMessage(message);
            }
        }
    )    
}

// Take action when a message is received
function processMessage(context) {
    switch (context.message_type) {
        case 0:
            sendMessage(context)
            functionOne()
            break;
        case 1:
            sendMessage(context)
            functionTwo()
            break;
        case 2:
            sendMessage(context)
            functionThree()
            break;
    }
}

// Send a message to chat   
function sendMessage (context) {
    if (context.sender != username) {
        var messageObject = {
                'username': context.sender,
                'text': context.text,
            };
        displayChat(context);

        }
}    

// Display a chat message in the chat box.
function displayChat(context) {
    if (context.text !== '') {
        var today = new Date();
        var hours = pad(today.getHours(), 2)
        var minutes = pad(today.getMinutes(), 2)
        var seconds = pad(today.getSeconds(), 2)
        var time = hours + ":" + minutes + ":" + seconds;
        var chat_log = document.getElementById("chat-log");
        chat_log.value += ('('+time+') '+context.sender + ': ' + context.text + '\n');
        chat_log.scrollTop = chat_log.scrollHeight;
    }
}

//pad string with leading zeros
function pad(num, size) {
    var s = num+"";
    while (s.length < size) s = "0" + s;
    return s;
}

// Call submit chat message if the user presses <return>.
document.querySelector('#chat-message-input').focus();
document.querySelector('#chat-message-input').onkeyup = function (e) {
    if (e.keyCode === 13) {  // enter, return
        document.querySelector('#chat-message-submit').click();
    }
};

// Submit the chat message if the user clicks on 'Send'.
document.querySelector('#chat-message-submit').onclick = function (e) {
    var messageField = document.querySelector('#chat-message-input'), text = messageField.value,        chat_log = document.getElementById("chat-log");
    context = {sender: username, text: messageField.value}
    displayChat(context)
    sendChat(messageField.value)
    chat_log.scrollTop = chat_log.scrollHeight;
    messageField.value = '';
};

// Call the send-chat view
function sendChat(chat_text) {
    $.ajax(
        {
        type:"GET",
        url: "send-message/"+chat_text,
        cache: false,
        }
    )    
}
ewm0tg9j

ewm0tg9j2#

有几个选择。
您可以在不同的服务上运行通道层,以便运行主示例。aws elasticache或许多其他redis主机。
还有一个rabbitmq通道层,但如果你的主机提供商收取了reddis很多钱,我想他们也会为此收取很多钱。。。https://github.com/cjworkbench/channels_rabbitmq/

相关问题