app_bjoern.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #!/usr/bin/env python
  2. import bjoern
  3. import falcon
  4. import re
  5. from email.utils import formatdate
  6. from db_orm import session, World, Fortune
  7. from helpers import load_template, FortuneTuple, generate_ids, sanitize
  8. from operator import attrgetter
  9. from random import randint
  10. # setup
  11. wsgi = app = falcon.App()
  12. # Note:
  13. # Bjoern doesn't provide any additional response headers like Date and Server
  14. # so we need to provide them manually.
  15. bjoern_version = [i for i in open('requirements-bjoern.txt', 'r') if re.search('bjoern', i)][0].strip().split('==')
  16. server_info = '{}/{}'.format(*bjoern_version).title()
  17. # resource endpoints
  18. class JSONResource(object):
  19. def on_get(self, request, response):
  20. response.set_header('Date', formatdate(timeval=None, localtime=False, usegmt=True))
  21. response.set_header('Server', server_info)
  22. response.media = {'message': "Hello, world!"}
  23. class RandomWorld(object):
  24. @session(serializable=False)
  25. def on_get(self, request, response):
  26. wid = randint(1, 10000)
  27. world = World[wid]
  28. response.set_header('Date', formatdate(timeval=None, localtime=False, usegmt=True))
  29. response.set_header('Server', server_info)
  30. response.media = world.to_dict()
  31. class RandomQueries(object):
  32. @session(serializable=False)
  33. def on_get(self, request, response, **params):
  34. num = params.get("num", "1")
  35. num = sanitize(num)
  36. worlds = [World[ident].to_dict() for ident in generate_ids(num)]
  37. response.set_header('Date', formatdate(timeval=None, localtime=False, usegmt=True))
  38. response.set_header('Server', server_info)
  39. response.media = worlds
  40. class UpdateQueries(object):
  41. @session(serializable=False)
  42. def on_get(self, request, response, **params):
  43. num = params.get("num", "1")
  44. num = sanitize(num)
  45. ids = generate_ids(num)
  46. ids.sort()
  47. worlds = []
  48. for item in ids:
  49. world = World[item]
  50. world.randomNumber = randint(1, 10000)
  51. worlds.append({"id": world.id, "randomNumber": world.randomNumber})
  52. response.set_header('Date', formatdate(timeval=None, localtime=False, usegmt=True))
  53. response.set_header('Server', server_info)
  54. response.media = worlds
  55. class Fortunes(object):
  56. _template = load_template()
  57. @session(serializable=False)
  58. def on_get(self, request, response):
  59. fortunes = [FortuneTuple(id=f.id, message=f.message) for f in Fortune.select()]
  60. fortunes.append(FortuneTuple(id=0, message="Additional fortune added at request time."))
  61. fortunes.sort(key=attrgetter("message"))
  62. content = self._template.render(fortunes=fortunes)
  63. response.set_header('Date', formatdate(timeval=None, localtime=False, usegmt=True))
  64. response.set_header('Server', server_info)
  65. response.content_type = falcon.MEDIA_HTML
  66. response.text = content
  67. class PlaintextResource(object):
  68. def on_get(self, request, response):
  69. response.set_header('Date', formatdate(timeval=None, localtime=False, usegmt=True))
  70. response.set_header('Server', server_info)
  71. response.content_type = falcon.MEDIA_TEXT
  72. response.text = 'Hello, world!'
  73. # register resources
  74. app.add_route("/json", JSONResource())
  75. app.add_route("/db", RandomWorld())
  76. app.add_route("/queries/{num}", RandomQueries())
  77. app.add_route("/updates/{num}", UpdateQueries())
  78. app.add_route("/fortunes", Fortunes())
  79. app.add_route("/plaintext", PlaintextResource())
  80. if __name__ == "__main__":
  81. host = '0.0.0.0'
  82. port = 8080
  83. bjoern.run(wsgi, host=host, port=port)