【发布时间】:2021-11-22 04:46:11
【问题描述】:
我的小型 Django 项目只有一个视图。用户可以输入一些选项并按提交,因此提交需要>3 分钟的作业。我使用redis-queue 通过后台进程执行作业——Web 进程只是返回(并呈现.html)。这一切都有效。 问题是,如何在完成后将后台的结果(确实下载文件的文件名)传递回 html,以便显示下载按钮?
我想我必须将一个小的 Java / jQuery 脚本放入 .html 中,该脚本会持续轮询工作是否完成(也许利用 RQ 的 on_success / on_failure 函数?)。但是,我不确定这种方法。搜索此事没有成功(simular issue)。谁能指导我这样做的正确方法是什么?我不打算使用芹菜。理想的解决方案是提供一些代码或明确路径的解决方案。这是一个剥离的例子:
view.py
from django.shortcuts import render
from django.contrib import messages
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
from .forms import ScriptParamForm
from .queue_job import my_job
@csrf_exempt
def home(request):
context = {}
if request.method == 'POST':
if request.POST.get("btn_submit"):
req_dict = dict(request.POST)
form = ScriptParamForm(request.POST)
context['form'] = form
if form.is_valid():
req_dict = dict(request.POST)
job = my_job(outdir=tmp_dir, **req_dict)
context['job'] = job
return render(request, 'webapp/home.html', context)
elif request.POST.get("btn_download"):
serve_file = request.POST.get("btn_download")
with open(serve_file, 'rb') as fp:
response = HttpResponse(fp, headers={
'Content-Type': 'application/zip',
'Content-Disposition': f'attachment; filename="{serve_file}"'
})
return response
else:
form = ScriptParamForm()
context['form'] = form
return render(request, 'webapp/home.html', context)
home.html
{% extends 'base.html' %}
{% block content %}
<form method="POST" autocomplete="on">
{% csrf_token %}
<!-- FORM FIELDS -->
...
<!-- SUBMIT / DOWNLOAD BUTTONS -->
<div>
<button type="submit" name="btn_submit" value="submit" class="btn btn-primary" id="btn-submit">Submit</button>
{% if serve_file %}
<button type="submit" name="btn_download" value={{serve_mode}} class="btn btn-primary">Download</button>
{% endif %}
<span class="not-visible" id="calc-msg"> This may take a few, relax! :) </span>
</div>
</form>
{% endblock content %}
main.js
var x = document.getElementById("btn-submit")
console.log(x)
x.onclick = function () {
$("#calc-msg").removeClass("not-visible");
setInterval(function(){blink()}, 1000);
};
function blink() {
$("#calc-msg").fadeTo(100, 0.1).fadeTo(200, 1.0);
}
【问题讨论】:
标签: python django asynchronous redis