@mefisto661

Как подключить channels 2 к Django?

Необходимо создать чат и уведомления на сайте. Решил сделать через channels, застрял на первом этапе tutorial`a https://channels.readthedocs.io/en/latest/tutorial...
На последнем этапе, при запуске сервера:

Watching for file changes with StatReloader
Exception in thread django-main-thread:
Traceback (most recent call last):
File "C:\Python38\lib\threading.py", line 932, in _bootstrap_inner
self.run()
File "C:\Python38\lib\threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "C:\Python38\lib\site-packages\django\utils\autoreload.py", line 54, in wrapper
fn(*args, **kwargs)
File "C:\Python38\lib\site-packages\django\core\management\commands\runserver.py", line 109, in inner_run
autoreload.raise_last_exception()
File "C:\Python38\lib\site-packages\django\utils\autoreload.py", line 77, in raise_last_exception
raise _exception[1]
File "C:\Python38\lib\site-packages\django\core\management\__init__.py", line 337, in execute
autoreload.check_errors(django.setup)()
File "C:\Python38\lib\site-packages\django\utils\autoreload.py", line 54, in wrapper
fn(*args, **kwargs)
File "C:\Python38\lib\site-packages\django\__init__.py", line 24, in setup
apps.populate(settings.INSTALLED_APPS)
File "C:\Python38\lib\site-packages\django\apps\registry.py", line 91, in populate
app_config = AppConfig.create(entry)
File "C:\Python38\lib\site-packages\django\apps\config.py", line 116, in create
mod = import_module(mod_path)
File "C:\Python38\lib\importlib\__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "", line 1014, in _gcd_import
File "", line 991, in _find_and_load
File "", line 975, in _find_and_load_unlocked
File "", line 671, in _load_unlocked
File "", line 783, in exec_module
File "", line 219, in _call_with_frames_removed
File "C:\Python38\lib\site-packages\channels\apps.py", line 6, in
import daphne.server
File "C:\Python38\lib\site-packages\daphne\server.py", line 18, in
asyncioreactor.install()
File "C:\Python38\lib\site-packages\twisted\internet\asyncioreactor.py", line 320, in install
reactor = AsyncioSelectorReactor(eventloop)
File "C:\Python38\lib\site-packages\twisted\internet\asyncioreactor.py", line 69, in __init__
super().__init__()
File "C:\Python38\lib\site-packages\twisted\internet\base.py", line 571, in __init__
self.installWaker()
File "C:\Python38\lib\site-packages\twisted\internet\posixbase.py", line 286, in installWaker
self.addReader(self.waker)
File "C:\Python38\lib\site-packages\twisted\internet\asyncioreactor.py", line 151, in addReader
self._asyncioEventloop.add_reader(fd, callWithLogger, reader,
File "C:\Python38\lib\asyncio\events.py", line 501, in add_reader
raise NotImplementedError
NotImplementedError
  • Вопрос задан
  • 149 просмотров
Решения вопроса 1
@antonksa
Лучше используйте aiohttp.

У меня сделано так:
1. Юзер подключается к Aiohttp к определенному урлу.
2. Aiohttp в процессе создание вебсокета дергает системное апи в джанге, получая id юзера.
3. Если юзер авторизован, то Aiohttp добавляет вебсокет во внутренний реестр соединений. У меня это обычный словарь, где ключом является id юзера. Соответственно при закрытии сокета или его отваливании из реестра он удаляется. Таким образом в любой момент можно получить все открытые сокеты юзера.
4. Джанга пишет в RabbitMQ ивенты, например SEND_MESSAGE с JSON контекстом (id юзера, текст сообщения и т.д.)
5. Aiohttp вычитывает сообщения из кролика и пропихивает их в соответсвующие вебсокеты.
6. Если например нужно подтверждение получения, то Aiohttp не найдя открытого сокета для юзера может дернуть системное апи в джанге, сказав ей, что юзер оффлайн. Также можно организовать системное апи в джанге, куда Aiohttp будет ходить при установлении сокета и проверять на список недоставленных сообщений.
7. Profit. Тут вообще большое поле для экспериментов, одно могу сказать точно, через год использования Channels еще в 2017 я устал жевать кактус и стал использовать синхронные и асинхронные фреймворки там, где это возможно, прекратив скрещивать ежа и ужа.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы