найти проблему JSON форматирования с обработчиком ошибок в приложении flask? - PullRequest
0 голосов
/ 20 марта 2020

, поэтому я получаю эту странную ошибку, когда пытаюсь запустить свой юнит-тест ошибки Auth с POST, PATCH, DELETE. Нет проблем с запросами GET, у которых также есть @ require_auth.

По сути, идея состоит в том, что если токен-носитель Auth0 отсутствует, операция не может быть завершена.

вот ошибка:

    [2020-03-20 10:08:45,782] ERROR in app: Exception on /donors/1 [DELETE]
Traceback (most recent call last):
  File "/Users/alo/FSDE/UdacityNanoDegree/FSND/projects/capstone/starter/env/lib/python3.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/alo/FSDE/UdacityNanoDegree/FSND/projects/capstone/starter/env/lib/python3.7/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/alo/FSDE/UdacityNanoDegree/fsnd_capstone/auth.py", line 174, in wrapper
    token = get_token_auth_header()
  File "/Users/alo/FSDE/UdacityNanoDegree/fsnd_capstone/auth.py", line 44, in get_token_auth_header
    }, 401)
auth.AuthError: ({'code': 'authorization_header_missing', 'description': 'Authorization header missing'}, 401)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/alo/FSDE/UdacityNanoDegree/FSND/projects/capstone/starter/env/lib/python3.7/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/alo/FSDE/UdacityNanoDegree/FSND/projects/capstone/starter/env/lib/python3.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/alo/FSDE/UdacityNanoDegree/FSND/projects/capstone/starter/env/lib/python3.7/site-packages/flask_cors/extension.py", line 161, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "/Users/alo/FSDE/UdacityNanoDegree/FSND/projects/capstone/starter/env/lib/python3.7/site-packages/flask_cors/extension.py", line 161, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "/Users/alo/FSDE/UdacityNanoDegree/FSND/projects/capstone/starter/env/lib/python3.7/site-packages/flask/app.py", line 1719, in handle_user_exception
    return handler(e)
  File "/Users/alo/FSDE/UdacityNanoDegree/fsnd_capstone/app.py", line 181, in auth_error
    "message": "Error with authorization"
  File "/Users/alo/FSDE/UdacityNanoDegree/FSND/projects/capstone/starter/env/lib/python3.7/site-packages/flask/json/__init__.py", line 321, in jsonify
    dumps(data, indent=indent, separators=separators) + '\n',
  File "/Users/alo/FSDE/UdacityNanoDegree/FSND/projects/capstone/starter/env/lib/python3.7/site-packages/flask/json/__init__.py", line 179, in dumps
    rv = _json.dumps(obj, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/Users/alo/FSDE/UdacityNanoDegree/FSND/projects/capstone/starter/env/lib/python3.7/site-packages/flask/json/__init__.py", line 81, in default
    return _json.JSONEncoder.default(self, o)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type type is not JSON serializable
EF.....F..
======================================================================
ERROR: test_delete_donors_fail (__main__.fsnd_capstone)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_app.py", line 160, in test_delete_donors_fail
    data = json.loads(res.data)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
}

вот мой код:

   @app.route('/donors/<int:donor_id>', methods=['DELETE'])
    @requires_auth('delete:donors')
    def delete_donor(payload, donor_id):
        try:
            donor_to_delete = Donor.query.filter(Donor.id ==
                                                 donor_id).one_or_none()
            donor_to_delete.delete()

            return jsonify({
                'success': True,
                'delete': donor_id
                })

        except:
            abort(404)

Код Unittest:

def test_delete_donors_true(self):
    res = self.client().delete('/donors/1', headers=inventory_manager_auth)
    data = json.loads(res.data)

    self.assertEqual(res.status_code, 200)
    self.assertEqual(data['success'], True)
    self.assertEqual(data['delete'], '1')

Обработчик ошибок приложения:

@app.errorhandler(401)
def Unauthorized(error):
    return jsonify({
                    "success": False,
                    "error": 401,
                    "message": "Unauthorized"
                    }), 401
...