app_sync.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #!/usr/bin/env python
  2. from datetime import datetime
  3. from functools import lru_cache
  4. import os
  5. from random import randint
  6. from alchemical import Alchemical
  7. import sqlalchemy as sqla
  8. from cachetools import cached
  9. from cachetools.keys import hashkey
  10. from microdot_wsgi import Microdot
  11. from microdot_jinja import render_template
  12. app = Microdot()
  13. db = Alchemical(os.environ['DATABASE_URL'])
  14. class World(db.Model):
  15. __tablename__ = "world"
  16. id = sqla.Column(sqla.Integer, primary_key=True)
  17. randomnumber = sqla.Column(sqla.Integer)
  18. def to_dict(self):
  19. return {"id": self.id, "randomNumber": self.randomnumber}
  20. class CachedWorld(db.Model):
  21. __tablename__ = "cachedworld"
  22. id = sqla.Column(sqla.Integer, primary_key=True)
  23. randomnumber = sqla.Column(sqla.Integer)
  24. def to_dict(self):
  25. return {"id": self.id, "randomNumber": self.randomnumber}
  26. class Fortune(db.Model):
  27. __tablename__ = "fortune"
  28. id = sqla.Column(sqla.Integer, primary_key=True)
  29. message = sqla.Column(sqla.String)
  30. def get_num_queries(request, name="queries"):
  31. try:
  32. num_queries = request.args.get(name, 1, type=int)
  33. except ValueError:
  34. num_queries = 1
  35. if num_queries < 1:
  36. return 1
  37. if num_queries > 500:
  38. return 500
  39. return num_queries
  40. def generate_ids(num_queries):
  41. ids = {randint(1, 10000) for _ in range(num_queries)}
  42. while len(ids) < num_queries:
  43. ids.add(randint(1, 10000))
  44. return list(ids)
  45. @app.route("/json")
  46. def test_json(request):
  47. return {"message": "Hello, World!"}
  48. @app.route("/db")
  49. def test_db(request):
  50. id = randint(1, 10000)
  51. with db.Session() as session:
  52. world = session.get(World, id)
  53. return world.to_dict()
  54. @app.route("/queries")
  55. def test_queries(request):
  56. with db.Session() as session:
  57. worlds = [session.get(World, id).to_dict() for id in generate_ids(get_num_queries(request))]
  58. return worlds
  59. @app.route("/fortunes")
  60. def test_fortunes(request):
  61. with db.Session() as session:
  62. fortunes = list(session.scalars(Fortune.select()))
  63. fortunes.append(Fortune(id=0, message="Additional fortune added at request time."))
  64. fortunes.sort(key=lambda f: f.message)
  65. return render_template("fortunes.html", fortunes=fortunes), {'Content-Type': 'text/html; charset=utf-8'}
  66. @app.route("/updates")
  67. def test_updates(request):
  68. worlds = []
  69. ids = generate_ids(get_num_queries(request))
  70. ids.sort() # to avoid deadlocks
  71. with db.begin() as session:
  72. for id in ids:
  73. world = session.get(World, id)
  74. world.randomnumber = (randint(1, 9999) + world.randomnumber - 1) % 10000 + 1
  75. worlds.append(world.to_dict())
  76. return worlds
  77. @app.route("/plaintext")
  78. def test_plaintext(request):
  79. return b"Hello, World!"
  80. @cached(cache={}, key=lambda session, id: hashkey(id))
  81. def get_cached_world(session, id):
  82. return session.get(World, id).to_dict()
  83. @app.route("/cached-queries")
  84. def test_cached_queries(request):
  85. with db.Session() as session:
  86. worlds = [get_cached_world(session, id) for id in generate_ids(get_num_queries(request, 'count'))]
  87. return worlds