views.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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
  7. import sys
  8. from pyramid.view import view_config
  9. from pyramid.response import Response
  10. from frameworkbenchmarks.models import DBSession, World, Fortune
  11. from sqlalchemy.ext import baked
  12. if sys.version_info[0] == 3:
  13. xrange = range
  14. bakery = baked.bakery()
  15. @view_config(route_name='test_1', renderer='json')
  16. def test_1(request):
  17. """
  18. Test type 1: JSON serialization
  19. """
  20. return {"message": "Hello, World!"}
  21. @view_config(route_name='test_2', renderer='json')
  22. def test_2(request):
  23. """
  24. Test type 2: Single database query
  25. """
  26. num = randint(1, 10000)
  27. baked_query = bakery(lambda session: session.query(World))
  28. result = baked_query(DBSession).get(num)
  29. return result.__json__()
  30. @view_config(route_name='test_3', renderer='json')
  31. def test_3(request):
  32. """
  33. Test type 3: Multiple database queries
  34. """
  35. queries = request.GET.get('queries', 1)
  36. try:
  37. queries = int(queries)
  38. except ValueError:
  39. queries = 1
  40. else:
  41. if queries < 1:
  42. queries = 1
  43. elif queries > 500:
  44. queries = 500
  45. baked_query = bakery(lambda session: session.query(World))
  46. result = [
  47. baked_query(DBSession).get(num).__json__()
  48. for num in (randint(1, 10000) for _ in xrange(queries))
  49. ]
  50. return result
  51. @view_config(route_name='test_4', renderer='templates/test_4.pt')
  52. def test_4(request):
  53. """
  54. Test type 4: Fortunes
  55. """
  56. baked_query = bakery(lambda session: session.query(Fortune))
  57. fortunes = [obj.__json__() for obj in baked_query(DBSession).all()]
  58. fortunes.append(
  59. {"id": 0, "message": "Additional fortune added at request time."}
  60. )
  61. fortunes.sort(key=itemgetter('message'))
  62. return {'fortunes': fortunes}
  63. @view_config(route_name='test_5', renderer='json')
  64. def test_5(request):
  65. """
  66. Test type 5: Database updates
  67. """
  68. queries = request.GET.get('queries', 1)
  69. try:
  70. queries = int(queries)
  71. except ValueError:
  72. queries = 1
  73. else:
  74. if queries < 1:
  75. queries = 1
  76. elif queries > 500:
  77. queries = 500
  78. baked_query = bakery(lambda session: session.query(World))
  79. resultset = []
  80. for num in sorted(randint(1, 10000) for _ in xrange(queries)):
  81. obj = baked_query(DBSession).get(num)
  82. obj.randomNumber = randint(1, 10000)
  83. resultset.append(obj.__json__())
  84. DBSession.commit()
  85. return resultset
  86. @view_config(route_name='test_6')
  87. def test_6(request):
  88. """
  89. Test type 6: Plaintext
  90. """
  91. response = Response(
  92. body=b'Hello, World!',
  93. content_type='text/plain',
  94. )
  95. return response