Python django预计算并缓存视图

Python django预计算并缓存视图,python,django,Python,Django,这可能是一个python问题。可以肯定,这是一个不切实际的问题 客户端请求计算密集型页面[page-1],并最终请求第二个计算密集型页面[page-2],该页面可在已知第1页请求的实例中计算。我不想在提供第1页之前计算每一组数据,因为这会显著降低初始响应的性能 我确实想在客户端读取第1页时计算第2页的值。客户机还可能单击一些按钮,这些按钮会导致响应提供第1页数据的不同视图,但不需要进行大量计算。最终,但不一定是立即,客户机将请求第2页,我希望能够使用预先呈现的响应进行响应 如何做到这一点?如评论

这可能是一个python问题。可以肯定,这是一个不切实际的问题

客户端请求计算密集型页面[page-1],并最终请求第二个计算密集型页面[page-2],该页面可在已知第1页请求的实例中计算。我不想在提供第1页之前计算每一组数据,因为这会显著降低初始响应的性能

我确实想在客户端读取第1页时计算第2页的值。客户机还可能单击一些按钮,这些按钮会导致响应提供第1页数据的不同视图,但不需要进行大量计算。最终,但不一定是立即,客户机将请求第2页,我希望能够使用预先呈现的响应进行响应


如何做到这一点?

如评论中所述,听起来您需要使用异步后台任务来处理此问题,并将结果保存到。我个人会将其用于任务队列

基本上,在请求第1页之后,您将添加一个异步任务来启动第2页的计算,并将结果存储在缓存中。因此,当请求第2页时,您可以检查缓存中的预呈现响应,如果它不存在,您可以同步计算该值

因此,您的代码看起来是这样的(任务将位于应用程序中的task.py文件中,但这会让您大致了解):


您可能希望触发一个异步函数,该函数根据page1信息计算第2页,将其存储在缓存(或任何位置)中,然后在第2页:持续轮询知道检查缓存中某个键的视图,以确定后台任务何时完成计算step2任务。我不知道如何做。任何一点指导都会有很大帮助。对不起,不写一篇文章,我就不能谈得更详细了。基本上,只要client1阅读页面,您就需要触发这个昂贵的函数。如果不希望客户端在加载页面之前等待,则需要使作业异步。后台任务。然后,在第2页中,您需要考虑后台作业尚未完成的可能性。因此,您的第二个页面需要有一种机制来持续轮询服务器,直到BG任务完成,此时您可以向用户显示第2页。实际上,第2页的一个更简单的实现是简单地要求用户刷新页面,直到作业完成?无论如何,这只是一个评论,而不是一个原因的答案。我希望有人能回答你的问题。我只是想帮忙。
from celery import task
from django.core.cache import cache

def page_two_calculation(arg1, arg2):
    return arg1 + arg2

@task
def page_two_task(arg1, arg2):
    result = page_two_calculation(arg1, arg2)
    cache_key = "page-two-%s-%s" (arg1, arg2)
    cache.set(cache_key, result)

def page_one(request, arg1, arg2):

    # Start the page two task
    page_two_task.delay(arg1, arg2)

    # Return the page one response
    return HttpResponse('page one')

def page_two(request, arg1, arg2)
    cache_key = "page-two-%s-%s" (arg1, arg2)
    result = cache.get(cache_key)
    if result is None:
         # the result will only be None if the page 2 calculation
         # doesn't exist in the cache, in which case we'll have to
         # return the value synchronously.
         result = page_two_calculation(arg1, arg2)
    return result