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}}
为了简单起见,我删除了很多代码,但这是它的要点。尽管我为我的函数发布了代码,但它是一个耗时的函数,在访问index.html时会导致加载一段时间。如何使用芹菜和redis在后台运行我的函数,以便更快地加载index.htmlPython 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
我已经阅读了芹菜文档,但是我仍然无法设置芹菜和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)
]