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 并更改了我的简化正则表达式。