import json
from functools import lru_cache, partial
from django.http import HttpRequest

def _lazy_json(request):
    return json.loads(request.body)

def JSONRequestMiddleware(get_response):
    def middleware(request: HttpRequest):
        request.json = lru_cache(partial(_lazy_json, request))
        response = get_response(request)
        return response

    return middleware