Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PATCH Bad Request (400) Using Requests #1274

Closed
masrayie opened this issue May 27, 2019 · 4 comments

Comments

Projects
None yet
4 participants
@masrayie
Copy link

commented May 27, 2019

Environment

  • Python version: 3.7
  • Eve version: latest

iam using requests.patch
i've added If-Match headers on headers like this

headers = {'Content-Type': 'application/json', 'If-Match' : '741372f7206cb126aa465c720ba90d2312bfb308'}

data = {'field_name' : value}
response = requests.patch(api_url, data= data, auth=('uname', 'pswd'), headers=headers)

but i got 400 bad request
could somebody help me ?
or my codes are wrong ?

Thanks !

@nicolaiarocci

This comment has been minimized.

Copy link
Member

commented May 28, 2019

If you set debug mode on, you are likely to get back an error explanation in the body of the response. See if that helps.

@gwainer

This comment has been minimized.

Copy link

commented May 31, 2019

I've found HTTP 400 error when patching a sub-document, If the key being patched is nullable and still does not exist in the document being patched.

Eve 0.9.1
Python 3.5

Note: Using eve 0.8.1 in same scenario, the error does not occur.

The error stack is:

[2019-05-31 14:01:29,019] ERROR in patch: 'test'
Traceback (most recent call last):
  File "path/lib/python3.5/site-packages/eve/methods/patch.py", line 179, in patch_internal
    updates, object_id, original, normalize_document
  File "path/lib/python3.5/site-packages/eve/validation.py", line 44, in validate_update
    document, update=True, normalize=normalize_document
  File "path/lib/python3.5/site-packages/cerberus/validator.py", line 870, in validate
    self.__normalize_mapping(self.document, self.schema)
  File "path/lib/python3.5/site-packages/cerberus/validator.py", line 617, in __normalize_mapping
    self.__normalize_containers(mapping, schema)
  File "path/lib/python3.5/site-packages/cerberus/validator.py", line 680, in __normalize_containers
    field, mapping, schema)
  File "path/lib/python3.5/site-packages/cerberus/validator.py", line 731, in __normalize_mapping_per_schema
    always_return_document=True)
  File "path/lib/python3.5/site-packages/cerberus/validator.py", line 594, in normalized
    self.__normalize_mapping(self.document, self.schema)
  File "path/lib/python3.5/site-packages/cerberus/validator.py", line 617, in __normalize_mapping
    self.__normalize_containers(mapping, schema)
  File "path/lib/python3.5/site-packages/cerberus/validator.py", line 680, in __normalize_containers
    field, mapping, schema)
  File "path/lib/python3.5/site-packages/cerberus/validator.py", line 731, in __normalize_mapping_per_schema
    always_return_document=True)
  File "path/lib/python3.5/site-packages/cerberus/validator.py", line 594, in normalized
    self.__normalize_mapping(self.document, self.schema)
  File "path/lib/python3.5/site-packages/cerberus/validator.py", line 617, in __normalize_mapping
    self.__normalize_containers(mapping, schema)
  File "path/lib/python3.5/site-packages/cerberus/validator.py", line 680, in __normalize_containers
    field, mapping, schema)
  File "path/lib/python3.5/site-packages/cerberus/validator.py", line 731, in __normalize_mapping_per_schema
    always_return_document=True)
  File "path/lib/python3.5/site-packages/cerberus/validator.py", line 594, in normalized
    self.__normalize_mapping(self.document, self.schema)
  File "path/lib/python3.5/site-packages/cerberus/validator.py", line 617, in __normalize_mapping
    self.__normalize_containers(mapping, schema)
  File "path/lib/python3.5/site-packages/cerberus/validator.py", line 680, in __normalize_containers
    field, mapping, schema)
  File "path/lib/python3.5/site-packages/cerberus/validator.py", line 731, in __normalize_mapping_per_schema
    always_return_document=True)
  File "path/lib/python3.5/site-packages/cerberus/validator.py", line 594, in normalized
    self.__normalize_mapping(self.document, self.schema)
  File "path/lib/python3.5/site-packages/cerberus/validator.py", line 615, in __normalize_mapping
    self.__normalize_default_fields(mapping, schema)
  File "path/lib/python3.5/site-packages/cerberus/validator.py", line 806, in __normalize_default_fields
    self._normalize_default(mapping, schema, field)
  File "path/lib/python3.5/site-packages/eve/validation.py", line 71, in _normalize_default
    challenge = challenge[sub_field]
KeyError: 'test'

Minimum schema for example is like this:

'export_data': {
    'type': 'dict',
    'schema': {
        'test': {
            'type': 'dict',
            'schema': {
                'codes': {
                    'type': 'dict',
                    'schema': {
                        'extra_50': {
                            'type': 'dict',
                            'schema': {
                                'code': {'type': 'integer', 'nullable': True}
                            }
                        },
                    }
                }
            }
        }
    }
}

PATCH body is:

{
    "export_data": {
        "test": {
            "codes": {
                "extra_75": {
                    "code": 98
                }
            }
        }
    }
}

If code key is changed to nullable: False or test key already exists in the document, the error does not happen

@sunbit

This comment has been minimized.

Copy link
Contributor

commented Jun 5, 2019

@gwainer can you try with eve from this branch https://github.com/sunbit/eve/tree/fix_put_normalize_%231280

I have a pending PR #1280 to approve, that fixed just that lines of code that are giving you the problem.

@gwainer

This comment has been minimized.

Copy link

commented Jun 5, 2019

@sunbit I've just tested and I'm happy to inform that it solves my scenario too. Thanks a lot for your work.

@nicolaiarocci nicolaiarocci added this to the 0.9.2 milestone Jun 6, 2019

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.