views.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. """
  2. Test views, per the spec here:
  3. http://www.techempower.com/benchmarks/#section=code&hw=i7&test=json
  4. """
  5. from operator import itemgetter
  6. from random import randint, sample
  7. from pyramid.response import Response
  8. from pyramid.view import view_config
  9. from sqlalchemy import select
  10. from sqlalchemy.orm.attributes import flag_modified
  11. from frameworkbenchmarks.models import Fortune, World
  12. def parse_query(request):
  13. queries = request.GET.get("queries", 1)
  14. try:
  15. queries = int(queries)
  16. except ValueError:
  17. queries = 1
  18. else:
  19. if queries < 1:
  20. queries = 1
  21. elif queries > 500:
  22. queries = 500
  23. return queries
  24. @view_config(route_name="test_1", renderer="json")
  25. def test_1(request):
  26. """
  27. Test type 1: JSON serialization
  28. """
  29. return {"message": "Hello, World!"}
  30. @view_config(route_name="test_2", renderer="json")
  31. def test_2(request):
  32. """
  33. Test type 2: Single database query
  34. """
  35. num = randint(1, 10000)
  36. result = request.dbsession.get(World, num)
  37. return result.__json__()
  38. @view_config(route_name="test_3", renderer="json")
  39. def test_3(request):
  40. """
  41. Test type 3: Multiple database queries
  42. """
  43. queries = parse_query(request)
  44. result = [
  45. request.dbsession.get(World, num).__json__()
  46. for num in sample(range(1, 10001), queries)
  47. ]
  48. return result
  49. @view_config(route_name="test_4", renderer="templates/test_4.pt")
  50. def test_4(request):
  51. """
  52. Test type 4: Fortunes
  53. """
  54. fortunes = (
  55. request.dbsession.execute(select(Fortune.id, Fortune.message)).mappings().all()
  56. )
  57. fortunes.append({"id": 0, "message": "Additional fortune added at request time."})
  58. fortunes.sort(key=itemgetter("message"))
  59. return {"fortunes": fortunes}
  60. @view_config(route_name="test_5", renderer="json")
  61. def test_5(request):
  62. """
  63. Test type 5: Database updates
  64. """
  65. queries = parse_query(request)
  66. resultset = []
  67. sess = request.dbsession
  68. for num in sample(range(1, 10001), queries):
  69. obj = sess.get(World, num)
  70. obj.randomNumber = randint(1, 10000)
  71. # force sqlalchemy to UPDATE entry even if the value has not changed
  72. # doesn't make sense in a real application, added only for pass `tfb verify`
  73. flag_modified(obj, "randomNumber")
  74. resultset.append(obj.__json__())
  75. sess.commit()
  76. return resultset
  77. @view_config(route_name="test_6")
  78. def test_6(request):
  79. """
  80. Test type 6: Plaintext
  81. """
  82. response = Response(
  83. body=b"Hello, World!", content_type="text/plain", charset="utf-8"
  84. )
  85. return response