serve_pyramid.py 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. # -*- coding: utf-8 -*-
  2. from datetime import datetime
  3. from http import HTTPStatus
  4. import json
  5. from pyramid.config import Configurator
  6. import time
  7. from wsgiref.simple_server import make_server
  8. from hapic import Hapic
  9. from hapic.data import HapicData
  10. from hapic.ext.pyramid import PyramidContext
  11. from example.usermanagement.schema import AboutSchema
  12. from example.usermanagement.schema import NoContentSchema
  13. from example.usermanagement.schema import UserDigestSchema
  14. from example.usermanagement.schema import UserIdPathSchema
  15. from example.usermanagement.schema import UserSchema
  16. from example.usermanagement.userlib import User
  17. from example.usermanagement.userlib import UserLib
  18. from example.usermanagement.userlib import UserNotFound
  19. hapic = Hapic()
  20. class PyramidController(object):
  21. @hapic.with_api_doc()
  22. @hapic.output_body(AboutSchema())
  23. def about(self, context, request):
  24. """
  25. This endpoint allow to check that the API is running. This description
  26. is generated from the docstring of the method.
  27. """
  28. return {
  29. 'version': '1.2.3',
  30. 'datetime': datetime.now(),
  31. }
  32. @hapic.with_api_doc()
  33. @hapic.output_body(UserDigestSchema(many=True))
  34. def get_users(self, context, request):
  35. """
  36. Obtain users list.
  37. """
  38. return UserLib().get_users()
  39. @hapic.with_api_doc()
  40. @hapic.handle_exception(UserNotFound, HTTPStatus.NOT_FOUND)
  41. @hapic.input_path(UserIdPathSchema())
  42. @hapic.output_body(UserSchema())
  43. def get_user(self, context, request, hapic_data: HapicData):
  44. """
  45. Return a user taken from the list or return a 404
  46. """
  47. return UserLib().get_user(int(hapic_data.path['id']))
  48. @hapic.with_api_doc()
  49. # TODO - G.M - 2017-12-5 - Support input_forms ?
  50. # TODO - G.M - 2017-12-5 - Support exclude, only ?
  51. @hapic.input_body(UserSchema(exclude=('id',)))
  52. @hapic.output_body(UserSchema())
  53. def add_user(self, context, request, hapic_data: HapicData):
  54. """
  55. Add a user to the list
  56. """
  57. print(hapic_data.body)
  58. new_user = User(**hapic_data.body)
  59. return UserLib().add_user(new_user)
  60. @hapic.with_api_doc()
  61. @hapic.handle_exception(UserNotFound, HTTPStatus.NOT_FOUND)
  62. @hapic.output_body(NoContentSchema(), default_http_code=204)
  63. @hapic.input_path(UserIdPathSchema())
  64. def del_user(self, context, request, hapic_data: HapicData):
  65. UserLib().del_user(int(hapic_data.path['id']))
  66. return NoContentSchema()
  67. def bind(self, configurator: Configurator):
  68. configurator.add_route('about', '/about', request_method='GET')
  69. configurator.add_view(self.about, route_name='about', renderer='json')
  70. configurator.add_route('get_users', '/users', request_method='GET') # nopep8
  71. configurator.add_view(self.get_users, route_name='get_users', renderer='json') # nopep8
  72. configurator.add_route('get_user', '/users/{id}', request_method='GET') # nopep8
  73. configurator.add_view(self.get_user, route_name='get_user', renderer='json') # nopep8
  74. configurator.add_route('add_user', '/users', request_method='POST') # nopep8
  75. configurator.add_view(self.add_user, route_name='add_user', renderer='json') # nopep8
  76. configurator.add_route('del_user', '/users/{id}', request_method='DELETE') # nopep8
  77. configurator.add_view(self.del_user, route_name='del_user', renderer='json') # nopep8
  78. if __name__ == "__main__":
  79. configurator = Configurator(autocommit=True)
  80. controllers = PyramidController()
  81. controllers.bind(configurator)
  82. hapic.set_context(PyramidContext(configurator))
  83. print('')
  84. print('')
  85. print('GENERATING OPENAPI DOCUMENTATION')
  86. openapi_file_name = 'api-documentation.json'
  87. with open(openapi_file_name, 'w') as openapi_file_handle:
  88. openapi_file_handle.write(
  89. json.dumps(
  90. hapic.generate_doc(
  91. title='Demo API documentation',
  92. description='This documentation has been generated from '
  93. 'code. You can see it using swagger: '
  94. 'http://editor2.swagger.io/'
  95. )
  96. )
  97. )
  98. print('Documentation generated in {}'.format(openapi_file_name))
  99. time.sleep(1)
  100. print('')
  101. print('')
  102. print('RUNNING PYRAMID SERVER NOW')
  103. # Run app
  104. server = make_server('127.0.0.1', 8083, configurator.make_wsgi_app())
  105. server.serve_forever()