问题标签 [sanic]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
260 浏览

python - Rasa X - Google 助理连接器没有收到来自 Rasa 的任何消息

我正在为 Rasa X (rasa 1.0) 创建一个连接器,以将 Google Assistant 用作前端。在 1.0 发布之前,本教程:https ://medium.com/rasa-blog/going-beyond-hey-google-building-a-rasa-powered-google-assistant-5ff916409a25工作得非常好。但是,当我尝试在相同的结构上运行 Rasa X 时,我的旧的基于 Flask 的连接器和启动项目的 Rasa 代理之间存在不兼容性。

在新版本中,rasa.core.agent.handle_channels([input_channel], http_port=xxxx)改为使用 Sanic,这似乎与我的旧方法不兼容。

我曾尝试将旧的 Flask 连接器转换为 Sanic(以前从未使用过)连接器,并且我使用 Postman 检查了运行状况路线,这很有效。我还收到了来自 Assistant 的有效载荷。但是,当我将此转发给 Rasa 代理时,我没有得到任何回报。

  • 这是新的 Sanic 连接器:
  • 这是启动项目的脚本:

我希望输出是 Rasa 代理选择的文本作为回复“这是回复”,但我什么也没得到(列表为空)。

编辑

我定义def receive(request):async def receive(request):并更改on_new_message(UserMessage(text,out,sender_id))await on_new_message(UserMessage(text,out,sender_id)). 此外,启动项目的脚本现在是:

不幸的是,它没有改变任何东西,仍然没有在输出通道上得到 Rasa 的任何回复。

0 投票
1 回答
849 浏览

python - Sanic 的异步(非阻塞)方法问题

因此,我尝试使用 Sanic 来处理一些异步 Web 请求,因为我有一些特殊的请求需要几秒钟才能返回,但同时希望从客户端执行其他请求。这是一个示例方法,它在等待 lib.getAlarmState() 返回时似乎仍在阻止来自客户端的其他调用。(lib.getAlartmState() 是使用 pythons ctypes 调用 C 库,需要大约 3 秒才能返回并返回 Int 类型。)

根据我在 sanic 文档中看到的内容,只需将方法定义为 async 就可以满足我的要求吗?我试过在 lib.getAlarmState() 前面添加一个等待,但我不确定我使用的是否正确。

我希望在显示的方法停止运行时,我应该能够从客户端调用其他方法并获得响应。

0 投票
2 回答
1753 浏览

python - 对 Sanic 应用程序进行异步单元测试会引发 RuntimeError:此事件循环已在运行

我有一个 Sanic 应用程序,可以对外部 api 进行一些异步调用。我希望编写一些模拟这些外部调用的单元测试。

正如我们从日志中看到的那样,在下面的代码中,测试确实通过了。然而,在他们完成 RuntimeError: this event loop is already running 后抛出

简化的 Sanic 应用程序:

这是测试:

如上所述,测试确实通过了,但随后抛出了错误。

非常感谢任何帮助或建议。提前致谢

0 投票
0 回答
79 浏览

python - 如何在 sanic 中记录所有传入请求和对所有 api 的出站响应

我已经尝试登录每个函数,但为了制作一个通用函数并避免使用相同的 logger.info(),我想使用 sanic 的 logging 属性。

研究它我得到了旋转记录器的信息,但它没有记录请求数据及其标头以及正在发送的响应。我应该在日志配置中包含什么?

这是我的日志配置

0 投票
1 回答
827 浏览

websocket - Sanic Webserver:Websocket 处理程序在返回时关闭套接字;循环中断其他请求处理程序

场景:我有一个服务于一个简单网站的 sanic 网络服务器。该网站基本上是一个带有 vue 模板支持的 html 中的大型数据表。由于表条目每隔几分钟就会更改一次,因此数据在更改时通过 websocket 传递。大约同时有2000个用户。我试图实现一个发布/订阅架构。

问题:一旦我的 sanic 处理程序返回,我的 websocket 就关闭了。我可以在里面有一个循环来保持处理程序打开。但是保持 2000 个处理程序处于打开状态听起来是个坏主意……而且打开的处理程序的行为也很奇怪。一个线程或一个小线程池应该可以完成这项工作。也许我把 sanic 文档弄错了,需要设计建议。

我尝试过的事情: - 将超时设置增加到足够高 - 在 sanic 中尝试各种其他 websocket 设置 - 让我的客户端 js 返回错误的 onmessage(Javascript websockets 在打开后立即关闭) - 在传递它后将 ws 引用设置为 null

Sanic Webserver 的索引:

Index.html 的 JS:

Sanic Webserver 的 Websocket 处理程序(第一版,Sockets 立即死亡):

Sanic Webservers 的 Websocket 处理程序(第 2 版,处理程序阻止其他请求处理程序)

Sanic Webservers 的 Websocket 处理程序(第 3 版,不必要的 recv())

最后两个代码片段差别不大。我添加了一个 ws.recv() 并从客户端发送一些合适的东西(例如在一个间隔内),然后一切正常。然后发送 css、字体和 favicon。但这不可能是故意的,不是吗?这不应该很好地扩展,对吧?

总而言之,这对我来说没有多大意义。我有什么误解?

0 投票
1 回答
20 浏览

python - 只有在第一个函数设置全局标志后才完成响应

我有两个功能。首先执行检查服务器服务 url-checking。功能作为 sanic-scheduler 任务完成,每 2 秒运行一次。

https://github.com/asmodius/sanic-scheduler

第二个是请求处理程序:

只有在第一个函数new_answer之后才应该完成响应。isProcessed = True

我怎么能做到。我正在使用 Sanic。

0 投票
2 回答
3068 浏览

python - 无法使用 jinja2 加载模板

我有以下项目,

每个蓝图文件都有各种sanic路由,我想在调用时呈现模板。

我尝试将以下内容放入每个blueprint文件中,

只是为了得到错误ModuleNotFoundError: No module named 'APP'

替换APPblueprints我错误TypeError: expected str, bytes or os.PathLike object, not NoneType

我也尝试过使用FileSystemLoader这样的,

并加载我需要的模板template = template_env.get_template('file.html')

但是我template not found在访问网址时得到了一个。

直接尝试渲染我的模板,

再次导致file not found错误。

jinja在我的应用程序中使用模板的最佳方式是什么?

0 投票
2 回答
68 浏览

python-3.x - 显示表单并保存提交的数据

我有一个简单的应用程序,可以保存和显示数据库中的记录,

在显示用户列表时,类似下面的代码就足够了,

以上使用 Jinja2 但这对我来说并不重要(这不是一个真正的应用程序)。我不清楚如何显示用于创建新用户和保存提交数据的表单,有人可以提供一个简单的例子吗?

0 投票
1 回答
1686 浏览

python - 如何让 Sanic 响应 http 和 ws?

我有以下代码,用于基于此处组合不同端点的 Sanic hello world:

代码是:

路线“/”和“/html”工作正常,但是

产生:

和“/html2”呈现页面正常,但不登录到控制台,显示在调试器中:

我应该更改或添加什么来制作一个可行的 websocket 端点,它也可以很好地与 http 端点配合使用?

0 投票
1 回答
337 浏览

python - 将同步重写为异步:不等待函数

随着我阅读的更多,我对python中的aysnc感到更加愚蠢。所以我决定要求一个直接的答案。如何更改以下代码(使用异步或类似方法)以实现所需的结果?此外,我怎样才能在烧瓶或 sanic 中做到这一点?

基本上,我不想在返回我的 main_job 之前等待 long_job 结束。先感谢您。:)