Bottle:HEAD 总是退回到 GET,因此函数总是执行两次?
Bottle: HEAD always falls back to GET, thus functions always executed twice?
我正在使用Bottle to implement a web interface for a simple database system. 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
我正在使用Bottle to implement a web interface for a simple database system. 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