这个错误 "411 Length Required" 通常意味着你在发送一个 HTTP 请求时,服务器期望在请求体(body)中看到一个 `Content-Length` 头,但是你没有提供。在尝试使用 DELETE 方法发送一个请求,并且附带了一些数据(`data={"site_id": site_id}`)。
对于 DELETE 请求,通常我们不在请求体中发送数据,而是在 URL 的查询字符串中发送。然而,你的代码尝试在 DELETE 请求的请求体中发送数据,这可能导致服务器期望一个 `Content-Length` 头,但却没有收到。
一种可能的解决方案是将数据从请求体移动到查询字符串中。这可以通过修改 URL 来实现。下面是修改后的代码:
def get_response(url, method="get", **kwargs):
s = requests.session()
kwargs["verify"] = False
headers = {"User-Agent": "System"}
if not url.startswith("http"):
url = "%s%s" % (HOST_SERVER, url) if url.startswith("/") else "%s/%s" % (HOST_SERVER, url)
# 如果method是"delete",并且kwargs中有"data",将data移到url的查询字符串中
if method == "delete" and "data" in kwargs:
query_params = urllib.parse.urlencode(kwargs["data"])
if "?" not in url:
url += "?"
url += query_params
del kwargs["data"] # 删除kwargs中的"data"
try:
resp = s.request(method, url, **kwargs)
except:
log.error("get_response {method} {url} {kwargs}".format(method=method, url=url, kwargs=kwargs))
raise
return resp
response = get_response(api_url, "delete", data={"site_id": site_id})
这个修改的代码将检查是否正在尝试发送一个 DELETE 请求,并且请求体中有数据。如果是这种情况,它会将数据移动到 URL 的查询字符串中,并删除请求体中的数据。