-
Notifications
You must be signed in to change notification settings - Fork 34
Description
Checklist
- I have looked into the README and have not found a suitable solution or answer.
- I have looked into the documentation and have not found a suitable solution or answer.
- I have searched the issues and have not found a suitable solution or answer.
- I have upgraded to the latest version of OpenFGA and the issue still persists.
- I have searched the Slack community and have not found a suitable solution or answer.
- I agree to the terms within the OpenFGA Code of Conduct.
Description
See original reach out in OpenFGA slack channel here
Performing a write that fails (for example a bad request or duplicated tuple) results in the client raising an attribute error rather than providing the error in the response. See example below:
response = await self.client.write(
ClientWriteRequest(
writes=[
ClientTuple(
user=f"{user_type}:{user_id}",
relation=relation,
object=f"{object_type}:{object_id}",
),
],
),
)
Results in the traceback:
response = await self.client.write(
../../.venv/lib/python3.13/site-packages/openfga_sdk/client/client.py:572: in write
results = await self._write_with_transaction(body, options)
../../.venv/lib/python3.13/site-packages/openfga_sdk/client/client.py:535: in _write_with_transaction
await self._api.write(
../../.venv/lib/python3.13/site-packages/openfga_sdk/api/open_fga_api.py:2692: in write
return await self.write_with_http_info(body, **kwargs)
../../.venv/lib/python3.13/site-packages/openfga_sdk/api/open_fga_api.py:2825: in write_with_http_info
return await self.api_client.call_api(
../../.venv/lib/python3.13/site-packages/openfga_sdk/api_client.py:601: in call_api
return await self.__call_api(
../../.venv/lib/python3.13/site-packages/openfga_sdk/api_client.py:288: in __call_api
response_data = await self.request(
../../.venv/lib/python3.13/site-packages/openfga_sdk/api_client.py:677: in request
return await self.rest_client.request(
../../.venv/lib/python3.13/site-packages/openfga_sdk/rest.py:465: in request
await self.handle_response_exception(raw_response)
../../.venv/lib/python3.13/site-packages/openfga_sdk/rest.py:283: in handle_response_exception
raise ValidationException(http_resp=response)
../../.venv/lib/python3.13/site-packages/openfga_sdk/exceptions.py:187: in __init__
super().__init__(status, reason, http_resp)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = ValidationException(), status = None, reason = None
http_resp = <ClientResponse(http://localhost:65044/stores/01JZ893BKZNSEDKAG85TYVH6JB/write) [400 Bad Request]>
<CIMultiDictProxy('...equest-Id': '6ec34b25-fa71-4d31-809e-b58faa5aa33b', 'Date': 'Thu, 03 Jul 2025 13:55:00 GMT', 'Content-Length': '308')>
def __init__(self, status=None, reason=None, http_resp=None):
if http_resp:
try:
headers = http_resp.headers.items()
except AttributeError:
headers = http_resp.getheaders().items()
self.status = http_resp.status
self.reason = http_resp.reason
> self.body = http_resp.data
E AttributeError: 'ClientResponse' object has no attribute 'data'
../../.venv/lib/python3.13/site-packages/openfga_sdk/exceptions.py:128: AttributeError
The python sdk version: 0.9.4.
This seems to also be the case for other methods.
Expectation
I'd expect that it would not raise and instead allow me to access something like
response.errors as the API works for singles or I'd get the exception to why the call failed.
Reproduction
configuration = openfga_sdk.ClientConfiguration(
api_url=config.OPENFGA_API_URL,
credentials=Credentials(
method="api_token",
configuration=CredentialConfiguration(
api_token=config.OPENFGA_SECRET,
),
),
)
client = OpenFgaClient(OpenFgaClientSDK(configuration))
response = await client.write(
ClientWriteRequest(
writes=[
ClientTuple(
user=f"{user_type}:{user_id}",
relation=relation,
object=f"{object_type}:{object_id}",
),
],
),
)OpenFGA SDK version
0.9.4
OpenFGA version
v1.8.16
SDK Configuration
configuration = openfga_sdk.ClientConfiguration( api_url=config.OPENFGA_API_URL, credentials=Credentials( method="api_token", configuration=CredentialConfiguration( api_token=config.OPENFGA_SECRET, ), ), ) client = OpenFgaClient(OpenFgaClientSDK(configuration))
Logs
No response
References
No response
Metadata
Metadata
Assignees
Labels
Type
Projects
Status