问题描述
我正在使用 Bottle 为简单的数据库系统实现 Web 界面。 As documented,Bottle 通过回退到相应的 GET 路由并切断响应体来处理 HTTP HEAD 请求。但是,根据我的经验,这意味着附加到 GET 路由的函数会两次执行以响应 GET 请求。如果该函数执行具有副作用的操作(例如数据库操作),则这可能会出现问题。
有没有办法防止这种双重执行的发生?还是应该为每个 GET 路由定义一个假的 HEAD 路由?
解决方法
更新:听起来 Bottle 正在按设计工作(每个请求只调用一次函数)。您的浏览器是 HEAD
请求的明显来源。
对于 HEAD 请求,Bottle 调用该方法一次,而不是两次。你能演示一些代码来显示你所描述的行为吗?当我运行以下代码时,我只看到一次“调用”行:
from bottle import Bottle,request
app = Bottle()
@app.get("/")
def home():
print(f"Called: {request.method}")
return "Some text\n"
app.run()
输出:
$ curl --head http://127.0.0.1:8080/
Called: HEAD
HTTP/1.0 200 OK
127.0.0.1 - - [13/Jan/2021 08:28:02] "HEAD / HTTP/1.1" 200 0
Date: Wed,13 Jan 2021 13:28:02 GMT
Server: WSGIServer/0.2 CPython/3.8.6
Content-Length: 10
Content-Type: text/html; charset=UTF-8