Как интегрировать Faust с Django?
Я пытаюсь интегрировать Faust с Django, чтобы публиковать сообщения в Kafka. Вот пример из репозитория Faust: https://github.com/robinhood/faust/tree/master/examples/django
Я немного изменил его и создал представления для отправки данных в Kafka через Faust.
from django.shortcuts import render
from asgiref.sync import async_to_sync
from accounts.agents import AccountRecord, add_account
async def send_data() -> None:
print("sending..data")
print(await add_account.ask(AccountRecord(name="tesst", score=10.9, active=False)))
def index(request):
async_to_sync(send_data)()
return render(request, "accounts/index.html")
Но теперь я получаю эту ошибку:
RuntimeError at /
Task <Task pending name='Task-1' coro=<AsyncToSync.main_wrap() running at /Users/mysuer/.pyenv/versions/3.8.3/envs/faustdjango/lib/python3.8/site-packages/asgiref/sync.py:204> cb=[_run_until_complete_cb() at /Users/mysuer/.pyenv/versions/3.8.3/lib/python3.8/asyncio/base_events.py:184]> got Future <Future pending> attached to a different loop
Я запускаю это приложение Django с помощью сервера разработки. Что я делаю не так?
1 ответ
См. Раздел FAQ в документации faust
Могу ли я использовать Faust с Django / Flask / и т. Д.?
Да! Использовать как мост для интеграции с
asyncio
.
С помощью
Этот подход работает с любой блокирующей библиотекой Python, с которой можно работать.
С помощью
eventlet
требует, чтобы вы установили
aioeventlet
модуль, и вы можете установить его вместе с Faust:
$ pip install -U faust[eventlet]
Затем, чтобы фактически использовать eventlet в качестве цикла событий, вы должны либо использовать
-L <faust --loop>
аргумент к
faust
программа:
$ faust -L eventlet -A myproj worker -l info
или добавить
import mode.loop.eventlet
в верхней части сценария точки входа:
#!/usr/bin/env python3
import mode.loop.eventlet # noqa
Предупреждение. Очень важно, чтобы он находился на самом верху модуля и выполнялся до того, как вы импортируете библиотеки.