将 URL 端点列入白名单以登录 Flask API

问题描述 投票:0回答:1

我有一个 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、测试点、静态

为什么这个方法不起作用?我对这两个列表之间的区别感到困惑。

python flask logging wsgi
1个回答
0
投票

我意识到在程序读取端点之前我太早调用了restrict_access_logs()函数。将函数调用移动到文件底部使其可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.