Django Channels, установка различных шаблонов маршрутизации WebSocket для разных путей
Я пытаюсь реализовать проект Django с несколькими приложениями, с несколькими потребителями с различными шаблонами маршрутизации WebSocket для каждого пути.
Ниже приведен мой рабочий код, код работает, но явно не корректно, я пробовал использовать различные методы, как в документах Django Chennels Django Channels - Routing, но так и не добился результата,
#asgi.py
from api.middleware import TokenAuthMiddleWare
from api.routing import websocket_urlpatterns
from live_tracker.routing import live_websocket_urlpatterns
application = ProtocolTypeRouter(
{
'http': get_asgi_application(),
'websocket': TokenAuthMiddleWare(AuthMiddlewareStack(URLRouter(websocket_urlpatterns))),
}
)
application = ProtocolTypeRouter(
{
'http': get_asgi_application(),
'websocket': AuthMiddlewareStack(URLRouter(live_websocket_urlpatterns)),
}
)
Из 2 приложений, которые у меня есть, в первом приложении я сделал так, что для доступа к websocket_urlpatterns
требуется токен, в то время как во втором приложении мне нужна только стандартная аутентификация django: live_websocket_urlpatterns
.
Я просмотрел на StackOverflows этот вопрос Как использовать несколько соединений websocket с помощью Django Channels? Вопрос касается только AuthMiddlewareStack
, которых у меня 2, пользовательский TokenAuthMiddleWare
и стандартный AuthMiddlewareStack
Есть ли способ объединить 2 приложения в одно applications
?
Мы можем это сделать, но мы не можем использовать два asgi
приложения в рамках одного экземпляра Django. Для этого вам потребуется запустить еще один контейнер с помощью чего-то вроде Docker или Kubernetes
Итак, вам придется убедиться, что ни ваши urls.py
(для http-соединений), ни ваши routing.py
(для websocket-соединений) не используют одинаковые пути.
Например, у вас есть api.routing
и live_tracker.routing
, и у каждого из них должен быть свой уникальный путь, например "wss/connect_api" и "wss/connect_live_tracker".
Теперь вам нужно поместить все ваши http-пути в обоих urls.py
файлах urls.py
в один файл , который используется одним asgi
приложением.
То же самое можно проделать с путями websocket в обоих файлах routing.py
, объединив их в один файл. Если вы хотите сохранить api.routing
и live_tracker.routing
, то можно попробовать получить url-шаблоны и сложить их вместе перед установкой application
.
Теперь в своем asgi.py
убедитесь, что вы создаете application
только один раз. В settings.py
убедитесь, что у вас есть ALLOWED HOSTS
оба домена для обоих сайтов, которые вы собираетесь использовать.
Наше приложение Django умеет направлять трафик только по пути, следующему за url. Например, если у вас есть путь к url на домене1, называемый url1, вы все равно можете получить к нему доступ с домена2.
ТА ЖЕ СТРАНИЦА
domain1.com/url1
domain2.com/url1
Ну, возможно, для вас это не будет большой проблемой, именно поэтому мы избавились от одинаковых url-путей на обоих доменах. И если мы никогда не даем пользователю ссылку, чтобы перейти туда, это не должно быть большой проблемой... но все же. Это непрофессионально.
Один из способов обойти эту проблему для чувствительных страниц, например страниц, требующих входа в систему, - проверить файлы cookie, чтобы узнать, входили ли они в систему раньше, и в противном случае выполнить переадресацию.
Вот все, что может быть немного утомительным - используйте request.gethost()
, когда запрос действительно попадает на views.py
. А если ваш пользователь оказался на неправильном домене, перейдя по неправильному url, перенаправьте его на главную страницу или другую страницу правильного url/домена.