我有一个 Flask API,它被请求垃圾邮件淹没,所以日志里充满了废话。我想将 API 中包含的端点列入白名单以记录请求。我已经实现了一个可以用于此目的的函数,可以在here找到。
def restrict_access_logs():
parent_log_request = serving.WSGIRequestHandler.log_request
permitted = ['hello','getEvidencesByProductID','getEvidencesByModifierEventTime','getEvidences']
permitted = [rule.endpoint for rule in app.url_map.iter_rules()]
def log_request(self, *args, **kwargs):
if any(re.match(f"/api/v1/{str(endpoint)}.*$", self.path) for endpoint in permitted):
parent_log_request(self, *args, **kwargs)
serving.WSGIRequestHandler.log_request = log_request
第一个“允许”列表是手动输入的并且按预期工作。第二个是我尝试获取所有端点,这样我就不必手动输入每个新端点。第二个列表不起作用,并且不会在日志中显示任何请求。
我设置了一个测试端点来查看返回的内容,它看起来像这样:
@app.route('/testpoint', methods=['GET'])
def testpoint():
ep_list = [rule.endpoint for rule in app.url_map.iter_rules()]
ep_str = ", ".join(ep_list)
return ep_str
这是该端点的输出:
getEvidencesByModifierEventTime、getEvidencesByFuzzAndTime、getEvidencesByProductID、getEvidencesByFuzz、getEvidences、你好、stopServer、测试点、静态
为什么这个方法不起作用?我对这两个列表之间的区别感到困惑。
我意识到在程序读取端点之前我太早调用了restrict_access_logs()函数。将函数调用移动到文件底部使其可以工作。