<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def get_data_response(self):
 """ Execute the model and view, and handle the cache. Returns controller-agnostic response data. """

        if self.middleware_interrupt_exc:
            ## the middleware raised an exception, re-raise it here so
            ## get_concrete_response (defined in subclasses) can catch it.
            raise self.middleware_interrupt_exc

        if self.middleware_control:
            ## this redirect object came from middleware but return it as if it
            ## came from a view.
            return {'body': self.middleware_control}

        if self.model_mock and self.program.has_mock_defined():
            model_data = self.program.get_model_mock()
        else:
            args, kwargs = self.program.get_model_args_kwargs()
            data = self.get_data_for_model(args, kwargs)
            self.display_data = data # just for displaying in __repr__

            if self.program.cache and not self.errors:
                key = self.get_cache_key(data)
                hit = self.cache.get(key)
                if hit:
                    return hit
        
            model_data = self.program.execute_model(data)
        
        response = self.program.execute_view(model_data, self.mimetype, self.errors)

        if self.program.cache and not self.errors and not self.model_mock:
            self.cache.set(key, response, self.program.cache)

        if 'persist' in response:
            self.persist_data = response['persist']

        return response