views.py 2.6 KB

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