Micropython Web 服务器:在没有内存分配失败的情况下提供大型文本文件
Micropython Webserver: Serve large textfiles without memory allocation failure
我的项目包括一个使用 ESP32 和 micropython v1.12
的网络服务器
背景:
我想创建配置页面,允许我输入 WiFi 凭据以将我的 ESP 连接到我的家庭网络。一开始,我在我的 ESP32 上 运行 一个网络服务器 运行 做这个。为此,我计划使用 Bootstrap 和他们的 CSS 风格 sheet.
基本上我使用以下方式启动服务器:
server_socket = socket.socket()
server_socket.bind(addr)
server_socket.listen(1)
...
如果客户端连接到我的网络服务器,我将解析 URL 并调用 handle
方法。我的 css 文件也是如此。
# Get the URL
url = ure.search("(?:GET|POST) /(.*?)(?:\?.*?)? HTTP", request).group(1).decode("utf-8").rstrip("/")
# Math the url
if url == "":
handle_root(client)
elif url == "bootstrap.min.css":
handle_css(client, request, path='bootstrap.min.css')
else:
handle_not_found(client, url)
我正在使用以下代码行进行响应:
def handle_css(client, request, path):
wlan_sta.active(True)
path = './config_page/' + path # The path to the css
f = open(path, 'r') # Open the file
client.send(f.read()) # Read the file and send it
client.close()
f.close()
文件 bootstrap.min.css
大约有 141kB。我 运行 内存不足,无法读取此文件并使用套接字发送它:
MemoryError: memory allocation failed, allocating 84992 bytes
有没有办法提供像 .css 文件这样的“大”文件?配置页面依赖于其中一些文件。
当然可以。这里的问题可能是这一行 client.send(f.read())
将整个文件读取到内存并将其发送到客户端。不要一次读取整个文件,而是尝试以 1KB 的块读取它并将其发送给客户端。
f = open(path, 'r') # Open the file
while True:
chunk = f.read(1024) # Read the next 1KB chunk
if not chunk:
break
client.send(chunk) # Send the next 1KB chunk
client.close()
f.close()
我的项目包括一个使用 ESP32 和 micropython v1.12
的网络服务器背景:
我想创建配置页面,允许我输入 WiFi 凭据以将我的 ESP 连接到我的家庭网络。一开始,我在我的 ESP32 上 运行 一个网络服务器 运行 做这个。为此,我计划使用 Bootstrap 和他们的 CSS 风格 sheet.
基本上我使用以下方式启动服务器:
server_socket = socket.socket()
server_socket.bind(addr)
server_socket.listen(1)
...
如果客户端连接到我的网络服务器,我将解析 URL 并调用 handle
方法。我的 css 文件也是如此。
# Get the URL
url = ure.search("(?:GET|POST) /(.*?)(?:\?.*?)? HTTP", request).group(1).decode("utf-8").rstrip("/")
# Math the url
if url == "":
handle_root(client)
elif url == "bootstrap.min.css":
handle_css(client, request, path='bootstrap.min.css')
else:
handle_not_found(client, url)
我正在使用以下代码行进行响应:
def handle_css(client, request, path):
wlan_sta.active(True)
path = './config_page/' + path # The path to the css
f = open(path, 'r') # Open the file
client.send(f.read()) # Read the file and send it
client.close()
f.close()
文件 bootstrap.min.css
大约有 141kB。我 运行 内存不足,无法读取此文件并使用套接字发送它:
MemoryError: memory allocation failed, allocating 84992 bytes
有没有办法提供像 .css 文件这样的“大”文件?配置页面依赖于其中一些文件。
当然可以。这里的问题可能是这一行 client.send(f.read())
将整个文件读取到内存并将其发送到客户端。不要一次读取整个文件,而是尝试以 1KB 的块读取它并将其发送给客户端。
f = open(path, 'r') # Open the file
while True:
chunk = f.read(1024) # Read the next 1KB chunk
if not chunk:
break
client.send(chunk) # Send the next 1KB chunk
client.close()
f.close()