adobe / adobe/target-python-sdk

get_attributes crashes with TypeError: 'NoneType' object is not iterable

未关闭
#43 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
Python
星标
4
派生
7
PR 合并指标
30 天内没有已合并 PR

描述

Hello,

I'm using version 1.1.0 of the `target-python-sdk` and some calls to `get_attributes` raises the following error:

```
Traceback (most recent call last):
File "/app/.venv/lib/python3.11/site-packages/target_python_sdk/__init__.py", line 268, in get_attributes
return AttributesProvider(response)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/app/.venv/lib/python3.11/site-packages/target_tools/attributes_provider.py", line 46, in __init__
self.indexed = create_indexed(offers_response.get("response"))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/app/.venv/lib/python3.11/site-packages/target_tools/attributes_provider.py", line 28, in create_indexed
for option in mbox.options:
TypeError: 'NoneType' object is not iterable
```

The error happens when an mbox name is wrong or even when the request doesn't match the audience rule for the given mbox.

The following code snippet would help to reproduce the problem:

```
target_client = TargetClient.create({
"client": "Client",
"organization_id": "Org-ID",
"events": {
"client_ready": client_ready_callback,
},
})

def get_attrs():
delivery_request = DeliveryRequest(
id=VisitorId(third_party_id="some-user-id"),
context=Context(
channel=ChannelType.WEB,
),
execute=ExecuteRequest(mboxes=[MboxRequest(name="invalid-mbox-name", index=1)]),
)

# target_client was correctly created and initialized
attrs = target_client.get_attributes(flag_names, {"request": delivery_request}) # Code crashes at this point

return attrs
```

Notice that you can pass a valid mbox name for an activity with a custom audience filter that doesn't match with the request context and the code will crash. For example, you could limite the activity with geolocation as this:

Image

The problem is with this part of the target-python-sdk's code:

```
def create_indexed(response):
"""
:param response: (delivery_api_client.Model.delivery_response.DeliveryResponse)
Target View Delivery API response
:return (dict) returns a map of mbox names to content
"""
result = {}
for request_type in REQUEST_TYPES:
if getattr(response, request_type) and getattr(response, request_type).mboxes:
for mbox in getattr(response, request_type).mboxes:
name = mbox.name
for option in mbox.options: # <---- mbox.options is None as returned by Adobe Target
if option.type == OptionType.JSON and option.content:
result[name] = {} if not result or not result.get(
name) else result[name]
result[name].update(option.content)
return result
```

Is there something I can do to prevent sdk from crashing?

贡献指南

打开贡献指南

调研方向

从 target_tools/attributes_provider.py 中的 create_indexed 开始,使用报告的 get_attributes 复现,测试无效的 mbox 或 audience 不匹配的情况。检查如何处理 mbox.options 设置为 None 的响应,并确认完成后的行为不再引发 TypeError,且返回预期的空属性或可用属性。

由索引模型根据 Issue 内容生成。

评估

技术栈
python
领域
api
Issue 类型
缺陷
难度
2/5
预计耗时
1-3 小时
活跃度
停滞
描述清晰度
描述清楚
新手友好度
45/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。