【问题标题】:Python when using "def" API - return nothing (or error)使用“def”API 时的 Python - 不返回任何内容(或错误)
【发布时间】:2018-07-17 16:53:30
【问题描述】:

我不知道如何准确地提出这个问题,因为我无法共享 API 访问权限。如果有人可以帮助提出正确的提问方式,将不胜感激。

我有一个代码可以完美运行并执行我所需要的,但是当我在 DEF 函数中使用这个 API 请求代码时,它返回时没有任何内容或错误...

错误很简单,我无法获取输出,或者返回 0 值

这是代码:

def sm_main_data():


    #DATA PROCESSING - Impression|Engagements|VideoViews
    urlMain = "https://api.simplymeasured.com/v1/analytics/" + key.accountId + "/posts/metrics?\
    filter=analytics.timeseries_key.gte(" + config.start + ").lte(" + config.end + ")&\
    filter=channel.eq(" + config.which_social_media + ")&\
    metrics=analytics.engagement_total,analytics.video.views_count,analytics.impressions&\
    dimensions=data_source_id,channel,analytics.timeseries_key.by(" + config.per_what + ")"

    headers = {'content-type': 'application/json',
            'Authorization': 'Bearer ' + key.token}

    #Receive data from SM (main data) / modified it and save as JSON file
    responseMain = requests.get(urlMain, headers=headers).json()
    pprint.pprint(responseMain)
    pass

sm_main_data()

我尝试在 def 中打印变量:

print(key.accountId)
print(config.start)
print(config.end)
print(config.which_social_media)
print(config.per_what)

所有打印正确。

目前我迷路了......并且无法对可能出现的问题有一个甚至理论上的想法。为什么这段代码在 def 函数中不起作用???

编辑 1.0

错误

{u'errors': [{u'detail': u'`    filter` parameter is not supported.,`    metrics` parameter is not supported.,`    dimensions` parameter is not supported.',
              u'status': u'422',
              u'title': u'Unprocessable Entity'}]}

编辑 1.1

没有def的代码

#DATA PROCESSING - Impression|Engagements|VideoViews
urlMain = "https://api.simplymeasured.com/v1/analytics/" + key.accountId + "/posts/metrics?\
filter=analytics.timeseries_key.gte(" + config.start + ").lte(" + config.end + ")&\
filter=channel.eq(" + config.which_social_media + ")&\
metrics=analytics.engagement_total,analytics.video.views_count,analytics.impressions&\
dimensions=data_source_id,channel,analytics.timeseries_key.by(" + config.per_what + ")"

headers = {'content-type': 'application/json',
    'Authorization': 'Bearer ' + key.token}

#Receive data from SM (main data) / modified it and save as JSON file
responseMain = requests.get(urlMain, headers=headers).json()
pprint.pprint(responseMain)

【问题讨论】:

  • 您至少必须分享您遇到的错误。
  • @MartijnPieters 完成
  • @MartijnPieters 但是当我删除 def 时,一切正常。
  • @MartijnPieters 你看到的问题是,我不能让你访问 API,有人可以测试它,所以我假设也许有人会知道为什么会发生,我可以测试它.
  • 啊,你的字符串是缩进的,所以现在字符串中包含了额外的空格。

标签: python function


【解决方案1】:

错误表明您正在尝试将带有额外空格的参数发送到服务器:

`    filter` parameter is not supported.
`    metrics` parameter is not supported.

名称前的那些额外空格是参数名称的一部分,因为您在字符串中包含了这些空格:

def sm_main_data():
    # ...
    urlMain = "https://api.simplymeasured.com/v1/analytics/" + key.accountId + "/posts/metrics?\
    filter=analytics.timeseries_key.gte(" + config.start + ").lte(" + config.end + ")&\
    filter=channel.eq(" + config.which_social_media + ")&\
    metrics=analytics.engagement_total,analytics.video.views_count,analytics.impressions&\
    dimensions=data_source_id,channel,analytics.timeseries_key.by(" + config.per_what + ")"

# ^^^ those lines are indented but the whitespace is part of the string

如果您出于任何其他原因缩进了urlMain 字符串定义,例如if 语句或try...except 语句,而不仅仅是一个函数,您会遇到同样的问题。您不必缩进字符串文字中的那些部分。

您可以使用separate string literals to create one long string,而不是在字符串中使用\ 延续,或者在字符串文字结束时以" 结尾,然后在下一行使用+" 开头引号:

urlMain = (
    "https://api.simplymeasured.com/v1/analytics/" + 
    key.accountId + "/posts/metrics?" +
    "filter=analytics.timeseries_key.gte(" + config.start + ").lte(" + config.end + ")&" +
    "filter=channel.eq(" + config.which_social_media + ")&" +
    "metrics=analytics.engagement_total,analytics.video.views_count,analytics.impressions&" +
    "dimensions=data_source_id,channel,analytics.timeseries_key.by(" + config.per_what + ")"
)

所有那些+ 的连接都不是很可读,你真的应该使用string formatting 将值插入到字符串中。

但是,您不需要构建这样的字符串无论如何,因为requests 可以做到这一点你给它一个字典作为@987654335 @ 争论。使用列表为给定的参数名称传递多个值:

url = "https://api.simplymeasured.com/v1/analytics/{k.accountId}/posts/metrics".format(
    k=key)
params = {
    'filter': [  # a list for multiple entries: filter=...&filter=...
        'analytics.timeseries_key.gte({c.start}).lte({c.end})'.format(c=config),
        'channel.eq({c.which_social_media})'.format(c=config),
    ],
    'metrics': (
        'analytics.engagement_total,analytics.video.views_count,'
        'analytics.impressions'),
    'dimensions':
        'data_source_id,channel,'
        'analytics.timeseries_key.by({c.per_what})'.format(c=config),
}
headers = {'Authorization': 'Bearer {k.token}'.format(k=key)}
responseMain = requests.get(urlMain, params=params, headers=headers).json()

这里我使用str.format() 插入来自configkey 对象的值;注意占位符拉出属性

注意:我删除了 Content-Type 标头,因为该标头不适用于 GET 请求(没有 内容,请求正文始终为空)。

【讨论】:

  • 这行得通!!但是还有一个额外的问题,如何修改我的代码以使其真正起作用?有可能吗?
  • 是的...)谢谢您的帮助...对不起,不清楚的问题,但这个答案对我帮助很大!!!!
猜你喜欢
  • 1970-01-01
  • 2015-05-06
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 2017-02-17
  • 1970-01-01
  • 2016-11-11
  • 2015-10-18
相关资源
最近更新 更多