context.py 1.9KB

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