app_fastwsgi.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #!/usr/bin/env python
  2. import fastwsgi
  3. import falcon
  4. import re
  5. from db_orm import session, World, Fortune
  6. from helpers import load_template, FortuneTuple, generate_ids, sanitize
  7. from operator import attrgetter
  8. from random import randint
  9. # setup
  10. app = falcon.App()
  11. server_info = 'FastWSGI+Falcon'
  12. # resource endpoints
  13. class JSONResource(object):
  14. def on_get(self, request, response):
  15. response.set_header('Server', server_info)
  16. response.media = {'message': "Hello, world!"}
  17. class SingleQuery(object):
  18. @session(serializable=False)
  19. def on_get(self, request, response):
  20. wid = randint(1, 10000)
  21. world = World[wid]
  22. response.set_header('Server', server_info)
  23. response.media = world.to_dict()
  24. class MultipleQueries(object):
  25. @session(serializable=False)
  26. def on_get(self, request, response, num):
  27. num = sanitize(num)
  28. worlds = [World[ident].to_dict() for ident in generate_ids(num)]
  29. response.set_header('Server', server_info)
  30. response.media = worlds
  31. class UpdateQueries(object):
  32. @session(serializable=False)
  33. def on_get(self, request, response, num):
  34. num = sanitize(num)
  35. ids = generate_ids(num)
  36. ids.sort()
  37. worlds = []
  38. for item in ids:
  39. world = World[item]
  40. world.randomNumber = randint(1, 10000)
  41. worlds.append({"id": world.id, "randomNumber": world.randomNumber})
  42. response.set_header('Server', server_info)
  43. response.media = worlds
  44. class Fortunes(object):
  45. _template = load_template()
  46. @session(serializable=False)
  47. def on_get(self, request, response):
  48. fortunes = [FortuneTuple(id=f.id, message=f.message) for f in Fortune.select()]
  49. fortunes.append(FortuneTuple(id=0, message="Additional fortune added at request time."))
  50. fortunes.sort(key=attrgetter("message"))
  51. content = self._template.render(fortunes=fortunes)
  52. response.set_header('Server', server_info)
  53. response.content_type = falcon.MEDIA_HTML
  54. response.text = content
  55. class PlaintextResource(object):
  56. def on_get(self, request, response):
  57. response.set_header('Server', server_info)
  58. response.content_type = falcon.MEDIA_TEXT
  59. response.text = 'Hello, world!'
  60. # register resources
  61. app.add_route("/json", JSONResource())
  62. app.add_route("/db", SingleQuery())
  63. app.add_route("/queries/{num}", MultipleQueries())
  64. app.add_route("/updates/{num}", UpdateQueries())
  65. app.add_route("/fortunes", Fortunes())
  66. app.add_route("/plaintext", PlaintextResource())
  67. if __name__ == "__main__":
  68. import os
  69. import multiprocessing
  70. _is_travis = os.environ.get('TRAVIS') == 'true'
  71. workers = int(multiprocessing.cpu_count())
  72. if _is_travis:
  73. workers = 2
  74. host = '0.0.0.0'
  75. port = 8080
  76. def run_app():
  77. fastwsgi.run(app, host=host, port=port, loglevel=0)
  78. def create_fork():
  79. n = os.fork()
  80. # n greater than 0 means parent process
  81. if not n > 0:
  82. run_app()
  83. # fork limiting the cpu count - 1
  84. for i in range(1, workers):
  85. create_fork()
  86. run_app() # run app on the main process too :)