views.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. # Create your views here.
  2. from django.template import Context, loader
  3. from django.http import HttpResponse
  4. from django.core import serializers
  5. from world.models import World, Fortune
  6. from django.shortcuts import render
  7. from ujson import dumps as uj_dumps
  8. import random
  9. import sys
  10. from operator import attrgetter
  11. from functools import partial
  12. if sys.version_info[0] == 3:
  13. xrange = range
  14. def _get_queries(request):
  15. try:
  16. queries = int(request.GET.get('queries', 1))
  17. except Exception:
  18. queries = 1
  19. if queries < 1:
  20. queries = 1
  21. if queries > 500:
  22. queries = 500
  23. return queries
  24. def plaintext(request):
  25. return HttpResponse("Hello, World!", content_type="text/plain")
  26. def json(request):
  27. response = {
  28. "message": "Hello, World!"
  29. }
  30. return HttpResponse(uj_dumps(response), content_type="application/json")
  31. def db(request):
  32. r = random.randint(1, 10000)
  33. world = uj_dumps({'id' : r, 'randomNumber' : World.objects.get(id=r).randomnumber})
  34. return HttpResponse(world, content_type="application/json")
  35. def dbs(request):
  36. queries = _get_queries(request)
  37. # fun fact: every dot-notation lookup calls some python magic under the hood. Like every other code,
  38. # one can eliminate dereferences by storing the end dereferenced thing in an identifier
  39. g = World.objects.get
  40. # but wait! there's more! if we're calling a function over and over with the same parameters,
  41. # we can use even more function magic.
  42. #r = random.randint
  43. rp = partial(random.randint, 1, 10000)
  44. # now we're ready to write our awesome query iterator thingy
  45. # first of all, we know the id's correspond to the random number we're picking, so we can create
  46. # dictionaries on the fly instead of serializing later
  47. # by creating dicts, we don't need to user the model serializer, which is probably slow and only appropriate
  48. # for complicated serializations of joins and crazy query sets etc
  49. # test xrange vs range if the query number is gigantic
  50. worlds = uj_dumps([{'id' : r, 'randomNumber' : g(id=r).randomnumber} for r in [rp() for q in xrange(queries)]])
  51. return HttpResponse(worlds, content_type="application/json")
  52. def fortunes(request):
  53. fortunes = list(Fortune.objects.all())
  54. fortunes.append(Fortune(id=0, message="Additional fortune added at request time."))
  55. fortunes = sorted(fortunes, key=attrgetter('message'))
  56. context = {'fortunes': fortunes}
  57. return render(request, 'fortunes.html', context)
  58. def update(request):
  59. queries = _get_queries(request)
  60. g = World.objects.get
  61. rp = partial(random.randint, 1, 10000)
  62. worlds = []
  63. for r in [rp() for q in xrange(queries)]:
  64. w = g(id=r)
  65. w.randomnumber=rp()
  66. w.save()
  67. worlds.append({'id' : r, 'randomNumber' : w.randomnumber})
  68. return HttpResponse(uj_dumps(worlds), content_type="application/json")