Python Django-如何使用芹菜和redis的异步任务队列 #在my views.py文件中 pi1=无 pis1=无 def my_func(): #本质上,该函数将随机整数设置为pi1和pis1 全球pi1,pis1 pi1=randint(0,9) pis1=randint(0,9) 返回 def索引(请求): my_func() 上下文={ “pi1”:pi1, “pis1”:pis1, } 返回呈现(请求“index.html”,上下文) #在index.html文件中 {{pi1}} {{pis1}}

Python Django-如何使用芹菜和redis的异步任务队列 #在my views.py文件中 pi1=无 pis1=无 def my_func(): #本质上,该函数将随机整数设置为pi1和pis1 全球pi1,pis1 pi1=randint(0,9) pis1=randint(0,9) 返回 def索引(请求): my_func() 上下文={ “pi1”:pi1, “pis1”:pis1, } 返回呈现(请求“index.html”,上下文) #在index.html文件中 {{pi1}} {{pis1}},python,django,asynchronous,redis,celery,Python,Django,Asynchronous,Redis,Celery,为了简单起见,我删除了很多代码,但这是它的要点。尽管我为我的函数发布了代码,但它是一个耗时的函数,在访问index.html时会导致加载一段时间。如何使用芹菜和redis在后台运行我的函数,以便更快地加载index.html 我已经阅读了芹菜文档,但是我仍然无法设置芹菜和redis。谢谢。这里不需要芹菜。您可以通过AJAX请求在页面上加载这些值。您应该创建一个单独的视图来计算这些值,加载index.html后,用javascript调用它。如前所述,您可能不需要芹菜。下面是一个从这种情况的案例2

为了简单起见,我删除了很多代码,但这是它的要点。尽管我为我的函数发布了代码,但它是一个耗时的函数,在访问index.html时会导致加载一段时间。如何使用芹菜和redis在后台运行我的函数,以便更快地加载index.html


我已经阅读了芹菜文档,但是我仍然无法设置芹菜和redis。谢谢。

这里不需要芹菜。您可以通过AJAX请求在页面上加载这些值。您应该创建一个单独的视图来计算这些值,加载index.html后,用javascript调用它。

如前所述,您可能不需要芹菜。下面是一个从这种情况的案例2中派生的示例:。这对我来说完全有效:

#In my views.py file
pi1 = None
pis1 = None
def my_func():
    #Essentially this function sets a random integer to pi1 and pis1
    global pi1, pis1
    pi1 = randint(0,9)
    pis1 = randint(0,9)
    return        

def index(request):

    my_func()

    context = {
        "pi1" : pi1,
        "pis1" : pis1,
    }

    return render(request, "index.html", context)

#In the index.html file
<h1>{{ pi1 }}</h1>
<h1>{{ pis1 }}</h1>
My index.html包含:

from time import sleep
import json
from django.http import HttpResponse
from django.shortcuts import render

def main_view(request):
    return render(request, 'index.html')

def ajax_view(request):
    sleep(10) #This is whatever work you need
    pi1 = "This is pi1" #I just made pi1/pis1 random values
    pis1 = "This is pis1"
    context = {
        "pi1" : pi1,
        "pis1" : pis1,
    }
    data = json.dumps(context)

    return HttpResponse(data, content_type='application/json')
当我访问localhost:8000/test/时,我会立即看到:

大约10秒钟后,我看到:


其思想是,您可以立即返回页面,并在操作完成时使用jquery获取操作结果,并相应地更新页面。你可以添加更多的东西,如进度条/加载图像等。例如,你可以在后台处理
pi1
pis
,并在完成后将其加载到HTML中。

这样做:context={“pi1”:pi1,“pis1”:pis1,}起作用吗?一切都很慢。我很困惑,你能给我举个例子吗。谢谢。谢谢你的想法,但是你能解释一下javascript部分吗?我不明白你在那里做什么。另外,在阅读了你链接的页面后,我感觉这不会更快地加载我的页面,但它只允许我在页面上添加一个加载栏。让我们给它添加一些数字。如果您的
pi1
pi1
需要大约10秒来计算。你必须花10秒的时间来计算。除非已经有缓存值,否则无法真正避免这种情况。从我展示的链接来看,如果不使用任何异步的东西,用户必须提前等待10秒。他们必须在看到空白页时等待10秒钟。async所做的是,它允许您显示某些内容,并在用户等待10秒时将页面控制权返回给用户。这意味着没有更多的空白页,这使它变得更好。芹菜不会让你避免等待10秒钟,就像使用这样的东西一样。芹菜的好处来自于你需要做很多工作的时候。如果你只是偶尔需要一件东西,那就真的不需要了。不管怎样,javascript在我的示例中所做的是,当加载页面时,它使用AJAX发送请求以获取
pis
和pi1s`的信息,然后在计算10秒后,用
pi1
pis1
的值填充s。这样,用户就可以获得他们想要的信息,而不必一直盯着空白屏幕。JSON是一种数据格式。它不是特定于javascript的。我把它放在JSON中,因为它相当容易阅读并且是可移植的。jQuery是一个方便的javascript包。它有一个名为
.ajax
的函数,这就是我所使用的。您可以在这里了解ajax的基本概念:
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Main View</title>
    <script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
    <script>
    $(document).ready(function(){
        $.ajax({
            url: "/test_ajax/",
        }).done(function( data) {
            $("#pi1").text(data.pi1);
            $("#pis1").text(data.pis1); 
        });
    });
</script>
  </head>
  <body>
      <h1 id = "pi1">Loading</h1>
      <h1 id = "pis1">Loading</h1>
  </body>
</html>
from django.conf.urls import include, url
from django.contrib import admin
from testDjango.test import main_view, ajax_view

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^test/', main_view),
    url(r'^test_ajax/', ajax_view)
]