【问题标题】:Is there a way to write single prepare function for all the KPIs in Gramex有没有办法为 Gramex 中的所有 KPI 编写单个准备函数
【发布时间】:2021-06-22 04:40:38
【问题描述】:

我有一个通用功能,需要在执行所有 KPI 之前对其进行评估。所以我写了一个准备函数,但准备函数分别调用所有 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 中提供准备功能,但得到了

AttributeError: 'str' 对象没有属性 'get'

【问题讨论】:

    标签: gramex


    【解决方案1】:

    您分享的方法是正确的。错误可能在自定义函数之一中,例如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}]}
    

    ...命令提示符显示prepare函数为每个数据集调用一次:

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

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

    【讨论】:

    • 我写的端点工作正常@S Anand,但我想修改它类似于下面的 url: project-test: pattern: /$YAMLURL/test handler: FormHandler kwargs: prepare: validations.validate_request(args, handler) kpi1: url: data1.csv kpi2: url: data2.csv 一个准备函数,该函数应该适用于导致上述情况的端点内的所有 KPI错误
    • 啊,我明白了。不,我们不能那样做。您可以重复使用相同的函数,但必须为每个数据集单独指定它。这是因为当有多个数据集时,Gramex 不知道 prepare: 是数据集/KPI 的名称,还是要调用的函数。
    • 谢谢,Manoj。您能否将答案标记为正确?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 2019-10-10
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      相关资源
      最近更新 更多