有没有办法为 Gramex 中的所有 KPI 编写单个准备函数

Is there a way to write single prepare function for all the KPIs in Gramex

我有一个通用函数需要在执行所有 KPI 之前对其进行评估。所以我写了一个 prepare 函数,但 prepare 函数分别调用所有 KPI。相反,我希望为每个端点执行一次准备函数。我的终点是这样的

project-test:
    pattern: /$YAMLURL/test
    handler: FormHandler
    kwargs:
      auth: &AUTH
        login_url: /$YAMLURL/login
      kpi1:
        prepare: validations.validate_request(args, handler)
        url: $CONNECTION_STRING
        queryfunction: queries.query1(args) 
      kpi2:
        prepare: validations.validate_request(args, handler)
        url: $CONNECTION_STRING
        queryfunction: queries.query2(args)
      modify: project.refactor(data, handler)

我试图在 kwargs 中提供 prepare 功能,但得到

AttributeError: 'str' object has no attribute 'get'

您分享的方法是正确的。错误可能出在自定义函数之一中,例如validations.validate_requestqueries.query*project.refactor

为了对此进行测试,我创建了以下 data1.csv

a,b
1,2
3,4

... 和 data2.csv

a,b
4,5
6,7

这是我的gramex.yaml

url:
  project-test:
      pattern: /$YAMLURL/test
      handler: FormHandler
      kwargs:
        kpi1:
          prepare: validations.validate_request(args, handler)
          url: data1.csv
        kpi2:
          prepare: validations.validate_request(args, handler)
          url: data2.csv

...这是我的 validations.py:

def validate_request(args, handler):
    print(args, handler)
    args['_c'] = ['a']    # Filter column 'a' alone

当我访问 /test 时,输出仅显示列 'a':

{"kpi1":[{"a":1},{"a":3}],"kpi2":[{"a":4},{"a":6}]}

... 并且命令提示符显示为每个数据集调用一次准备函数:

{'_limit': [10000]} <gramex.services.FormHandler object at 0x000001B1C14A43C8>
{'_limit': [10000]} <gramex.services.FormHandler object at 0x000001B1C14A43C8>

也许您可以分享有关 AttributeError 出现位置的完整错误消息?这可能会有所帮助。

我想这更像是一个准备功能问题。您能否检查一下您是否正在尝试使用其密钥访问字符串。只是一个快速的假设——检查你的字典是否是 json/ 字符串格式。