python - 捕获 Firebase 504 网关超时
问题描述
我正在构建一个简单的 IOT 设备(使用 Raspberry Pi Zero),它每 1 秒从 Firebase 实时数据库中提取数据并检查更新。
但是,在一段时间后(不确定具体多少,但在 1 小时到 3 小时之间),程序退出并显示一条504 Server Error: Gateway Time-out
消息。我不明白为什么会发生这种情况,我试图通过断开 Pi 与互联网的连接来重新创建此错误,但我没有收到此消息。取而代之的是,程序只是在ref.get()
一行中暂停,并在连接恢复后自动恢复运行。
该设备应始终开启,因此理想情况下,如果我遇到某种错误,我想重新启动程序/重新启动连接/重新启动 Pi。有没有办法实现这样的目标?
似乎该消息实际上是由 firebase_admin 包生成的。
这是错误消息:
Traceback (most recent call last):
File "/home/pi/.local/lib/python3.7/site-packages/firebase_admin/db.py", line 944, in request
return super(_Client, self).request(method, url, **kwargs)
File "/home/pi/.local/lib/python3.7/site-packages/firebase_admin/_http_client.py", line 105, in request
resp.raise_for_status()
File "/usr/lib/python3/dist-packages/requests/models.py", line 940, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 504 Server Error: Gateway Time-out for url: https://someFirebaseProject.firebaseio.com/someRef/subSomeRef/payload.json
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/pi/Desktop/project/main.py", line 94, in <module>
lastUpdate = ref.get()['lastUpdate']
File "/home/pi/.local/lib/python3.7/site-packages/firebase_admin/db.py", line 223, in get
return self._client.body('get', self._add_suffix(), params=params)
File "/home/pi/.local/lib/python3.7/site-packages/firebase_admin/_http_client.py", line 117, in body
resp = self.request(method, url, **kwargs)
File "/home/pi/.local/lib/python3.7/site-packages/firebase_admin/db.py", line 946, in request
raise _Client.handle_rtdb_error(error)
firebase_admin.exceptions.UnknownError: Internal server error.
>>>
解决方案
要重新启动整个 Raspberry Pi,您只需运行一个 shell 命令:
import os
os.system("sudo reboot")
我也遇到过这个问题,通常感觉更安全,但也有明显的缺点。我会尝试以类似的方式重置 wifi 连接或网络接口
推荐阅读
- java - 将文件上传到 PHP 源时发送参数
- android - 地理编码自动完成移动
- c# - 将按钮插入特定的数据网格视图列
- weblogic - WLST:访问部署>监控>工作负载>工作管理器的mBean
- java - 在 Flutter 中向特定于平台的代码添加依赖项
- python - PyParsing 问题:如何告诉 PyParsing 在命令行界面中等待更多字符串?
- node.js - Nodejs同步功能?
- amazon-web-services - 根设备和块设备的区别
- three.js - 未捕获的 TypeError:THREE.GLTFLoader 不是构造函数
- c# - 使用Identity时,如何在没有注册页面的情况下注册第一个用户?