context.py 1.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. # -*- coding: utf-8 -*-
  2. import json
  3. import typing
  4. from http import HTTPStatus
  5. from flask import request, Response
  6. from hapic.context import ContextInterface
  7. from hapic.exception import OutputValidationException
  8. from hapic.processor import RequestParameters, ProcessValidationError
  9. class FlaskContext(ContextInterface):
  10. def get_request_parameters(self, *args, **kwargs) -> RequestParameters:
  11. return RequestParameters(
  12. path_parameters=request.view_args,
  13. query_parameters=request.args, # TODO: Check
  14. body_parameters=request.get_json(), # TODO: Check
  15. form_parameters=request.form,
  16. header_parameters=request.headers,
  17. )
  18. def get_response(
  19. self,
  20. response: dict,
  21. http_code: int,
  22. ) -> Response:
  23. return Response(
  24. response=json.dumps(response),
  25. mimetype='application/json',
  26. status=http_code,
  27. )
  28. def get_validation_error_response(
  29. self,
  30. error: ProcessValidationError,
  31. http_code: HTTPStatus=HTTPStatus.BAD_REQUEST,
  32. ) -> typing.Any:
  33. # TODO BS 20171010: Manage error schemas, see #4
  34. from hapic.hapic import _default_global_error_schema
  35. unmarshall = _default_global_error_schema.dump(error)
  36. if unmarshall.errors:
  37. raise OutputValidationException(
  38. 'Validation error during dump of error response: {}'.format(
  39. str(unmarshall.errors)
  40. )
  41. )
  42. return Response(
  43. response=json.dumps(unmarshall.data),
  44. mimetype='application/json',
  45. status=int(http_code),
  46. )