adobe / adobe/target-python-sdk

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

オープン
#43 コメント 0 件 リアクション 0 件 担当者 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 から始め、無効な mbox または audience の不一致を使って、報告されている get_attributes の再現を行います。mbox.options が None に設定されたレスポンスがどのように処理されるかを確認し、完成した動作で TypeError が発生せず、期待される空の属性または利用可能な属性が返されることを確認します。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
python
領域
api
issue の種類
バグ
難易度
2/5
見積もり時間
1〜3時間
活発さ
停滞
明瞭さ
明確に書かれている
初心者へのやさしさ
45/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。