views.py 2.7 KB

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