如何将 Faust 与 Django 集成?

Mav*_*ick 17 python django faust django-3.0 django-3.1

我正在尝试将 Faust 与 Django 集成以将消息发布到 Kafka。这是 Faust 仓库中的示例:https : //github.com/robinhood/faust/tree/master/examples/django

我稍微修改了一下,并创建了视图以通过 Faust 将数据推送到 Kafka。

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")
Run Code Online (Sandbox Code Playgroud)

但是,我现在收到此错误:

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-包/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]> 将 Future 附加到不同的循环

我正在使用开发服务器运行这个 Django 应用程序。我究竟做错了什么?任何人?:)

Cod*_*eIt 3

请参阅 fast文档中的常见问题解答部分

我可以将 Faust 与 Django/Flask/等一起使用吗?

是的!用作eventlet与 集成的桥梁asyncio

使用eventlet

此方法适用于任何可与eventlet.

使用eventlet需要您安装该aioeventlet模块,您可以将其与 Faust 一起作为捆绑包安装:

$ pip install -U faust[eventlet]
Run Code Online (Sandbox Code Playgroud)

然后,要实际使用 eventlet 作为事件循环,您必须使用-L <faust --loop>程序的参数faust

$ faust -L eventlet -A myproj worker -l info
Run Code Online (Sandbox Code Playgroud)

或者import mode.loop.eventlet在入口点脚本的顶部添加:

$ pip install -U faust[eventlet]
Run Code Online (Sandbox Code Playgroud)

警告 这是非常重要的,它位于模块的最顶部,并且它在导入库之前执行。

  • 这根本没有帮助,因为它仍然没有解释如何从视图向代理发送呼叫。没有任何文档这样做 - 甚至他们的 Django 示例也没有。 (8认同)