【问题标题】:How can I render and cache a view programatically in Django?如何在 Django 中以编程方式呈现和缓存视图?
【发布时间】:2015-09-26 14:48:02
【问题描述】:

我在 Django 中有一个渲染速度很慢的视图。我想渲染这个视图并以编程方式缓存它,但还没有弄清楚如何去做。有什么简单的方法可以简单地调用我的StatusView 并将标记作为字符串获取以便我可以缓存它?

这是我对缓存装饰器的看法:

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())

【问题讨论】:

  • 这不就是你用cache_page 装饰器做的吗?
  • 对不起,我应该更冗长。我有一个后台作业,我想定期调用我的视图并缓存渲染结果。当从浏览器请求时,视图需要很长时间才能呈现,并且内容仅在后台作业运行时才会更改,因此以编程方式生成和缓存它会有所帮助。

标签: python django django-templates django-views django-cache


【解决方案1】:

由于我的 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()

【讨论】:

  • 我也有类似的问题,想达到同样的效果。你的想法很有趣。为什么 request.META['SERVER_NAME'] 很重要?你是怎么想出这个解决方案的?你有没有找到例如描述这个的教程?
猜你喜欢
  • 1970-01-01
  • 2012-10-22
  • 2021-04-28
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多