Не удается создать POST-запрос через HTMX для WebSocket

При попытке отправить форму в чате реального времени в консоли вместо POST появляется запрос GET (HTTP GET /?csrfmiddlewaretoken=some_csrf), и программа не доходит до пользователя. Джанго-версия 5.2.4, Дафна-версия 4.2.1

chat.html

routing.py

    from django.urls import path
    from .consumers import *


    websocket_urlpatterns = [
        path("ws/chatroom/<chatroom_name>", ChatroomConsumer.as_asgi()),
    ]

consumers.py

    from channels.generic.websocket import WebsocketConsumer
    from django.shortcuts import get_object_or_404
    import json

    from django.template.loader import render_to_string
    from a_rtchat.models import ChatGroup, GroupMessage


    class ChatroomConsumer(WebsocketConsumer):
        def connect(self):
            print(self.scope)
            self.user = self.scope['user']
            self.chatroom_name = self.scope['url_route']['kwargs']['chatroom_name']
            self.chatroom = get_object_or_404(ChatGroup, group_name=self.chatroom_name)
            self.accept()

        def reveive(self, text_data=None, bytes_data=None):
            text_data_json = json.loads(text_data)
            print(text_data_json)
            body = text_data_json['message']

            message = GroupMessage.objects.create(
                body=body,
                author = self.user,
                group = self.chatroom
            )
            context = {
                'message':message,
                'user':self.user,
            }
            html = render_to_string("a_rtchat/partials/chat_message_p.html", context=context)
            self.send(text_data=html)

asgi.py

    import os

    from django.core.asgi import get_asgi_application
    from channels.auth import AuthMiddlewareStack
    from channels.routing import ProtocolTypeRouter, URLRouter
    from channels.security.websocket import AllowedHostsOriginValidator

    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'a_core.settings')

    django_asgi_app = get_asgi_application()

    from a_rtchat.routing import websocket_urlpatterns

    application = ProtocolTypeRouter(
        {
            'http':django_asgi_app,
            'websocket':AllowedHostsOriginValidator(
                AuthMiddlewareStack(URLRouter(
                    websocket_urlpatterns
                    )))
        }
    )

base.html

Я действительно не понимаю, что нужно сделать, в документации и руководствах вроде бы все в порядке для всех

Вы столкнулись с распространенной путаницей с htmx-ext-ws и с тем, как это взаимодействует с веб-сокетами Django. Давайте рассмотрим , почему ваш пост не работает, и как это исправить.

```<form id="chat_message_form"
      hx-ext="ws"
      ws-connect="/ws/chatroom/public-chat"
      ws-send
      _="on htmx:wsAfterSend reset() me">```
  1. Исправьте опечатку в методе receive:
```def receive(self, text_data=None, bytes_data=None):
    ...

1. **No need to worry about POST vs GET**: When using `htmx-ext-ws`, the form is serialized and sent as a JSON message — not as a POST request. That's expected behavior.

tl;dr Убедитесь, что htmx-ext-ws загружен правильно.

Судя по вашему предыдущему сообщению, вы прикрепили js вот так

<script src="https://cdn.jsdelivr.net/npm/htmx-ext-ws@2.0.2" integrity="sha384-vuKxTKv5TX/b3lLzDKP2U363sOAoRo5wSvzzc3LJsbaQRSBSS+3rKKHcOx5J8doU" crossorigin="anonymous"></script>

Когда я пытаюсь сделать то же самое, я получаю следующую ошибку в консоли:

Не удалось найти корректный дайджест в атрибуте 'integrity' для ресурса 'https://cdn.jsdelivr.net/npm/htmx-ext-ws@2.0.2 "с вычисленной целостностью по протоколу SHA-384 "0RHpPqZ4QLJXG/ALtieEL/G+NuAI98LYSkT9s6FgciveUhAdo/6wab5NU1tm2Bxs". Ресурс был заблокирован.

Это, вероятно, препятствует загрузке расширенного js-файла, и именно поэтому вы получаете запрос GET, поскольку это поведение по умолчанию, к которому возвращается браузер.

Вернуться на верх