没有redis的django频道

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

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

  1. CHANNEL_LAYERS = {
  2. 'default': {
  3. 'BACKEND': 'channels_redis.core.RedisChannelLayer',
  4. 'CONFIG': {
  5. "hosts": [('127.0.0.1', 6379)],
  6. },
  7. },

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

byqmnocz

byqmnocz1#

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

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

网址.py

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

视图.py

  1. class CheckMessage(View):
  2. """Duo check message."""
  3. def get(self, request, partner_pk):
  4. """Render the GET request."""
  5. pair, room_name = sort_pair(partner_pk, request.user.pk)
  6. partner = User.objects.get(pk=partner_pk)
  7. profile = get_object_or_404(Profile, user=request.user)
  8. message = Message.objects.filter(room_name=room_name, sender=partner.username).earliest('datetime')
  9. context = {'type': -1}
  10. context = json.loads(message.context)
  11. context['sender'] = message.sender
  12. context['datetime'] = message.datetime
  13. context['message_type'] = message.type
  14. context['text'] = message.text
  15. context['seat'] = profile.seat
  16. message.delete()
  17. return JsonResponse(context, safe=False)
  18. class SendMessage(View):
  19. def get(self, request, partner_pk, chat_text):
  20. message_type = app.MESSAGE_TYPES['chat']
  21. send_message(request, partner_pk, message_type, text=chat_text, context={})
  22. return JsonResponse({}, safe=False)

聊天室.js

  1. window.setInterval(checkMessage, 3000);
  2. function checkMessage () {
  3. $.ajax(
  4. {
  5. type:"GET",
  6. url: "check-message",
  7. cache: false,
  8. success: function(message) {
  9. processMessage(message);
  10. }
  11. }
  12. )
  13. }
  14. // Take action when a message is received
  15. function processMessage(context) {
  16. switch (context.message_type) {
  17. case 0:
  18. sendMessage(context)
  19. functionOne()
  20. break;
  21. case 1:
  22. sendMessage(context)
  23. functionTwo()
  24. break;
  25. case 2:
  26. sendMessage(context)
  27. functionThree()
  28. break;
  29. }
  30. }
  31. // Send a message to chat
  32. function sendMessage (context) {
  33. if (context.sender != username) {
  34. var messageObject = {
  35. 'username': context.sender,
  36. 'text': context.text,
  37. };
  38. displayChat(context);
  39. }
  40. }
  41. // Display a chat message in the chat box.
  42. function displayChat(context) {
  43. if (context.text !== '') {
  44. var today = new Date();
  45. var hours = pad(today.getHours(), 2)
  46. var minutes = pad(today.getMinutes(), 2)
  47. var seconds = pad(today.getSeconds(), 2)
  48. var time = hours + ":" + minutes + ":" + seconds;
  49. var chat_log = document.getElementById("chat-log");
  50. chat_log.value += ('('+time+') '+context.sender + ': ' + context.text + '\n');
  51. chat_log.scrollTop = chat_log.scrollHeight;
  52. }
  53. }
  54. //pad string with leading zeros
  55. function pad(num, size) {
  56. var s = num+"";
  57. while (s.length < size) s = "0" + s;
  58. return s;
  59. }
  60. // Call submit chat message if the user presses <return>.
  61. document.querySelector('#chat-message-input').focus();
  62. document.querySelector('#chat-message-input').onkeyup = function (e) {
  63. if (e.keyCode === 13) { // enter, return
  64. document.querySelector('#chat-message-submit').click();
  65. }
  66. };
  67. // Submit the chat message if the user clicks on 'Send'.
  68. document.querySelector('#chat-message-submit').onclick = function (e) {
  69. var messageField = document.querySelector('#chat-message-input'), text = messageField.value, chat_log = document.getElementById("chat-log");
  70. context = {sender: username, text: messageField.value}
  71. displayChat(context)
  72. sendChat(messageField.value)
  73. chat_log.scrollTop = chat_log.scrollHeight;
  74. messageField.value = '';
  75. };
  76. // Call the send-chat view
  77. function sendChat(chat_text) {
  78. $.ajax(
  79. {
  80. type:"GET",
  81. url: "send-message/"+chat_text,
  82. cache: false,
  83. }
  84. )
  85. }
展开查看全部
ewm0tg9j

ewm0tg9j2#

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

相关问题