app.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. from vibora import Vibora
  2. from vibora.request import Request
  3. from vibora.responses import JsonResponse, Response
  4. from vibora.hooks import Events
  5. from random import randint
  6. from operator import itemgetter
  7. import psycopg2
  8. READ_ROW_SQL = 'SELECT * FROM "world" WHERE id={0}'
  9. WRITE_ROW_SQL = 'UPDATE "world" SET "randomnumber"={0} WHERE id={1} RETURNING id, randomNumber'
  10. READ_ALL_FORTUNES = 'SELECT * FROM "fortune"'
  11. ADDITIONAL_ROW = [0, 'Additional fortune added at request time.']
  12. sort_fortunes_key = itemgetter(1)
  13. app = Vibora()
  14. con = psycopg2.connect("dbname=hello_world user=benchmarkdbuser host=tfb-database password=benchmarkdbpass")
  15. cur = con.cursor()
  16. def getQueriesTotal(params):
  17. try:
  18. queries = params['queries']
  19. query_count = int(queries)
  20. except:
  21. return 1
  22. if query_count < 1:
  23. return 1
  24. if query_count > 500:
  25. return 500
  26. return query_count
  27. async def fetchWorld():
  28. rand = randint(1, 10000)
  29. cur.execute(READ_ROW_SQL.format(rand))
  30. res = cur.fetchone()
  31. return res
  32. async def updateWorld(world_id):
  33. new_num_rand = randint(1, 10000)
  34. cur.execute(WRITE_ROW_SQL.format(new_num_rand, world_id))
  35. res = cur.fetchone()
  36. return res
  37. async def fetchMultipleWorlds(total):
  38. worlds = []
  39. for x in range(total):
  40. res = await fetchWorld()
  41. worlds.append({'id': res[0], 'randomNumber': res[1]})
  42. return worlds
  43. async def updateMultipleWorlds(total):
  44. worlds = []
  45. for x in range(total):
  46. res = await fetchWorld()
  47. updated = await updateWorld(res[0])
  48. worlds.append({'id': updated[0], 'randomNumber': updated[1]})
  49. return worlds
  50. async def fetchFortunes():
  51. cur.execute(READ_ALL_FORTUNES)
  52. res = cur.fetchall()
  53. return res
  54. @app.route('/fortunes')
  55. async def fortunes():
  56. fortunes = await fetchFortunes()
  57. fortunes.append(ADDITIONAL_ROW)
  58. fortunes = fortunes.sort(key=sort_fortunes_key)
  59. return await app.render('index.html', fortunes=fortunes)
  60. @app.route('/db')
  61. async def single_query(request: Request):
  62. res = await fetchWorld()
  63. return JsonResponse({'id': res[0], 'randomNumber': res[1]}, headers={'Server': 'Vibora'})
  64. @app.route('/plaintext')
  65. async def plaintext():
  66. return Response(b'Hello, World!', headers={'Server': 'Vibora', 'Content-Type': 'text/plain'})
  67. @app.route('/json')
  68. async def json():
  69. return JsonResponse({'message': 'Hello, World!'}, headers={'Server': 'Vibora'})
  70. @app.route('/queries')
  71. async def multiple_queries(request: Request):
  72. total_queries = getQueriesTotal(request.args)
  73. worlds = await fetchMultipleWorlds(total_queries)
  74. return JsonResponse(worlds, headers={'Server': 'Vibora', 'Content-Type': 'application/json', 'Content-Length': str(total_queries)})
  75. @app.route('/updates')
  76. async def update_queries(request: Request):
  77. total_queries = getQueriesTotal(request.args)
  78. worlds = updateMultipleWorlds(total_queries)
  79. return JsonResponse(worlds, headers={'Server': 'Vibora', 'Content-Type': 'application/json', 'Content-Length': str(total_queries)})
  80. if __name__ == '__main__':
  81. app.run(host="0.0.0.0", port=8000)