python 正则表达式不匹配的瓶子路线 - 404 错误
python bottle route with regex not matching - 404 error
我正在尝试设置一个 python 相机应用程序,它可以流式传输到浏览器并使用 Bottle。我在 index.html 中的 javascript 是这样的:
<div class="panel-body"> <img src="stream/d" onload="imageRefresh(this, 30);" style="max-width: 100%;">
imageRefresh 函数使用 setTimeout 获取图像 url 并为其附加一个时间值,以便它是唯一的并且浏览器将向服务器发出请求。这个过程适用于我在互联网上找到的名为 microwebsrv 的服务器,该服务器位于 github 上:
https://github.com/jczic/MicroWebSrv; 但是,我正在尝试在我的 raspberry pi 上装瓶。
我的瓶子路线如下所示:
@route('/stream/d')
@route('/stream/<val:re:d[\d]+>')
def _httpStream(val="d")
print("val: %s" % val)
(rest of code here)
但是,在提供第一张图片后(我看到图片在浏览器屏幕上闪烁,在开发者控制台上我看到 http://192.168.0.18:8080/stream/d; 我还看到“GET /stream/d”我启动应用程序的 rPi 终端)然后是下一个获取请求,如下所示:
http://192.168.0.18:8080/stream/d1633472974918
失败并出现 404 错误,我想是因为路由不匹配?我也尝试过简单地使用如下路线:@route(/stream/) 但我仍然遇到同样的错误。
imageRefresh 函数像这样更新 img.src:
img.src=http + '/d' + d.getTime();
我已经多次阅读 bottle 文档,并且使用从 Windows 商店安装的“正则表达式正则表达式工具”测试了我的正则表达式。正则表达式工具显示它匹配。
可能问题是您指定了两条路由,但只有一条指定了变量名 val
,这是不一致的。我不是 Bottle
方面的专家,但您可以尝试以下方法:
@route('/stream/<val:re:d[\d]*>')
def _httpStream(val="d")
print("val: %s" % val)
(rest of code here)
这现在允许在 'd' 之后有 0 个或更多数字。
顺便说一下,您的正则表达式也可以更简单地指定为 d\d*
。
更新
我创建了以下简单程序...
from bottle import route, run
@route('/stream/<val:re:d[\d]*>')
def hello(val):
return val
run(host='localhost', port=8080, debug=True)
...一切都按预期进行。我应该补充一点,为参数 val
指定两个具有默认值的路由也有效:
from bottle import route, run
@route('/stream/d>')
@route('/stream/<val:re:d[\d]+>')
def hello(val="d"):
return val
run(host='localhost', port=8080, debug=True)
我终于明白了!首先,我把这条特定的路线放在程序的第一位。
然后,我将路线更改为:
@app.route('/stream/<time>')
@app.route('/stream/<time:re:d.*>')
这解决了 404 问题,现在我可以流式传输从相机拍摄的图像。
感谢上面的建议,我也升级到 0.13-dev 并更改了我的简化正则表达式。
我正在尝试设置一个 python 相机应用程序,它可以流式传输到浏览器并使用 Bottle。我在 index.html 中的 javascript 是这样的:
<div class="panel-body"> <img src="stream/d" onload="imageRefresh(this, 30);" style="max-width: 100%;">
imageRefresh 函数使用 setTimeout 获取图像 url 并为其附加一个时间值,以便它是唯一的并且浏览器将向服务器发出请求。这个过程适用于我在互联网上找到的名为 microwebsrv 的服务器,该服务器位于 github 上: https://github.com/jczic/MicroWebSrv; 但是,我正在尝试在我的 raspberry pi 上装瓶。 我的瓶子路线如下所示:
@route('/stream/d')
@route('/stream/<val:re:d[\d]+>')
def _httpStream(val="d")
print("val: %s" % val)
(rest of code here)
但是,在提供第一张图片后(我看到图片在浏览器屏幕上闪烁,在开发者控制台上我看到 http://192.168.0.18:8080/stream/d; 我还看到“GET /stream/d”我启动应用程序的 rPi 终端)然后是下一个获取请求,如下所示: http://192.168.0.18:8080/stream/d1633472974918 失败并出现 404 错误,我想是因为路由不匹配?我也尝试过简单地使用如下路线:@route(/stream/) 但我仍然遇到同样的错误。 imageRefresh 函数像这样更新 img.src:
img.src=http + '/d' + d.getTime();
我已经多次阅读 bottle 文档,并且使用从 Windows 商店安装的“正则表达式正则表达式工具”测试了我的正则表达式。正则表达式工具显示它匹配。
可能问题是您指定了两条路由,但只有一条指定了变量名 val
,这是不一致的。我不是 Bottle
方面的专家,但您可以尝试以下方法:
@route('/stream/<val:re:d[\d]*>')
def _httpStream(val="d")
print("val: %s" % val)
(rest of code here)
这现在允许在 'd' 之后有 0 个或更多数字。
顺便说一下,您的正则表达式也可以更简单地指定为 d\d*
。
更新
我创建了以下简单程序...
from bottle import route, run
@route('/stream/<val:re:d[\d]*>')
def hello(val):
return val
run(host='localhost', port=8080, debug=True)
...一切都按预期进行。我应该补充一点,为参数 val
指定两个具有默认值的路由也有效:
from bottle import route, run
@route('/stream/d>')
@route('/stream/<val:re:d[\d]+>')
def hello(val="d"):
return val
run(host='localhost', port=8080, debug=True)
我终于明白了!首先,我把这条特定的路线放在程序的第一位。 然后,我将路线更改为:
@app.route('/stream/<time>')
@app.route('/stream/<time:re:d.*>')
这解决了 404 问题,现在我可以流式传输从相机拍摄的图像。 感谢上面的建议,我也升级到 0.13-dev 并更改了我的简化正则表达式。