2015-09-26 2 views
3

У меня есть вид в Django, который очень медленный для рендеринга. Я хотел бы сделать это представление и кэшировать его программным способом, но не понял, как это сделать. Есть ли простой способ просто вызвать мой StatusView и получить разметку в виде строки, чтобы я мог ее кэшировать?Как я могу визуализировать и кэшировать представление программно в Django?

Вот мой взгляд с декоратором кэша:

class StatusView(ListView): 
    template_name = 'network/list.htm' 
    context_object_name = 'network' 

    def get_queryset(self): 
     return Network.objects.filter(date__lte=date.today()).order_by('-id') 

    def get_context_data(self, **kwargs): 
     context = super(StatusView, self).get_context_data(**kwargs) 
     ... 
     ... 
     return context 

    @method_decorator(cache_page(60 * 1)) 
    def dispatch(self, *args, **kwargs): 
     return super(StatusView, self).dispatch(*args, **kwargs) 

На полпути. Мне удалось отобразить представление программно. Теперь мне просто нужно его кэшировать.

str(StatusView(request=request).get(request).render())

+0

Разве это не то, что вы делаете с 'cache_page' декоратора? –

+0

Извините, я должен был быть более подробным. У меня есть фоновая работа, из которой я хотел бы периодически вызывать мой просмотр и кэшировать полученный результат. Представление занимает очень много времени, когда его запрашивают в браузере, и содержимое изменяется только тогда, когда выполняется фоновое задание, так что генерация и кэширование его программным способом помогут. –

ответ

0

Потребовалось немного рыть, так как мои навыки Django ржавый, но я получил здесь:

from django.middleware.cache import UpdateCacheMiddleware 
from django.utils.cache import learn_cache_key 
from django.http import HttpRequest 
from network.views import StatusView 

request = HttpRequest() 
request.META['SERVER_NAME'] = '1.0.0.127.in-addr.arpa' # important 
request.META['SERVER_PORT'] = '8000'     # important 
request._cache_update_cache = True 
response = StatusView(request=request).get(request) 
cacher = UpdateCacheMiddleware() 
cacher.process_response(request, response).render()