views.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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 json(request):
  25. response = {
  26. "message": "Hello, World!"
  27. }
  28. return HttpResponse(uj_dumps(response), mimetype="application/json")
  29. def db(request):
  30. r = random.randint(1, 10000)
  31. world = uj_dumps({'id' : r, 'randomNumber' : World.objects.get(id=r).randomnumber})
  32. return HttpResponse(world, mimetype="application/json")
  33. def dbs(request):
  34. queries = _get_queries(request)
  35. # fun fact: every dot-notation lookup calls some python magic under the hood. Like every other code,
  36. # one can eliminate dereferences by storing the end dereferenced thing in an identifier
  37. g = World.objects.get
  38. # but wait! there's more! if we're calling a function over and over with the same parameters,
  39. # we can use even more function magic.
  40. #r = random.randint
  41. rp = partial(random.randint, 1, 10000)
  42. # now we're ready to write our awesome query iterator thingy
  43. # first of all, we know the id's correspond to the random number we're picking, so we can create
  44. # dictionaries on the fly instead of serializing later
  45. # by creating dicts, we don't need to user the model serializer, which is probably slow and only appropriate
  46. # for complicated serializations of joins and crazy query sets etc
  47. # test xrange vs range if the query number is gigantic
  48. worlds = uj_dumps([{'id' : r, 'randomNumber' : g(id=r).randomnumber} for r in [rp() for q in xrange(queries)]])
  49. return HttpResponse(worlds, mimetype="application/json")
  50. def fortunes(request):
  51. fortunes = list(Fortune.objects.all())
  52. fortunes.append(Fortune(id=0, message="Additional fortune added at request time."))
  53. fortunes = sorted(fortunes, key=attrgetter('message'))
  54. context = {'fortunes': fortunes}
  55. return render(request, 'fortunes.html', context)
  56. def update(request):
  57. queries = _get_queries(request)
  58. g = World.objects.get
  59. rp = partial(random.randint, 1, 10000)
  60. worlds = []
  61. for r in [rp() for q in xrange(queries)]:
  62. w = g(id=r)
  63. w.randomnumber=rp()
  64. w.save()
  65. worlds.append({'id' : r, 'randomNumber' : w.randomnumber})
  66. return HttpResponse(uj_dumps(worlds), mimetype="application/json")