Не удается создать 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">```
- Исправьте опечатку в методе
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
, поскольку это поведение по умолчанию, к которому возвращается браузер.