Javascript Django,芹菜:检索异步生成的文件
我有一个页面(Javascript Django,芹菜:检索异步生成的文件,javascript,ajax,django,pdf,celery,Javascript,Ajax,Django,Pdf,Celery,我有一个页面(foo.com/process),您可以在其中生成数据报告。有时需要生成的数据量很大,因此需要一段时间。因此,我做了一个芹菜任务来处理PDF生成方面的事情。单击PDF图像时会生成报告: 单击该FA图标时,将向Django视图发送一个AJAX POST请求: $(".getPdf").on('click', function(event) { var thisId = $(this).data('processid'); var filename = $(this
foo.com/process
),您可以在其中生成数据报告。有时需要生成的数据量很大,因此需要一段时间。因此,我做了一个芹菜任务来处理PDF生成方面的事情。单击PDF图像时会生成报告:
单击该FA图标时,将向Django视图发送一个AJAX POST请求:
$(".getPdf").on('click', function(event) {
var thisId = $(this).data('processid');
var filename = $(this).data('filename');
$.post({
url: "{% url 'process' %}", // Points to foo.com/process
data: {
csrfmiddlewaretoken: "{{ csrf_token }}",
id: thisId
},
success: function(data) {
... handle sucess
},
error: function(data) {
... handle error
},
traditional: true
}).done();
downloadPdf(filename);
function downloadPdf(filename) {
setTimeout(function() { window.location.href = filename; }, 10000);
};
});
AJAX函数将请求发送到后端,以启动芹菜进程来生成PDF,然后立即调用downloadPfd
函数,这只是一个延迟函数,设置为(我认为是)通过JavaScript下载文件的方式。超时时间足以生成文件
我没有找到一个文件,即使PDF文件已经创建并且位于主项目文件夹中(我将在确保它工作后将其移动,可能会移动到Django中的媒体
文件夹)
现在,通过Django做这件事可能会更好,这是我尝试的另一条路线
在Django视图的帖子部分,我有以下内容:(
这篇文章的部分都可以工作。我点击一个按钮,它会发送一篇AJAX文章,这篇文章创建了一个芹菜任务,并生成了一个文件。我似乎无法在前端获得任务id
,即使它正在生成
我感到困惑的部分是如何使用前端的芹菜任务。任务id
定期轮询我的Django视图,以检查是否生成了PDF文件,然后如何下载所述PDF。我可以访问文件名和任务id
我试着去理解,但是我不太清楚它的脚本部分(我不太擅长JS),所以我不确定如何处理“定期检查文件是否存在,如果存在,下载它”部分,因为他似乎在使用基于函数的视图,而我在我的项目中使用基于类的视图。这里有很多缺失的部分,所以我将回答第一个缺失的部分:
success
处理程序中返回的响应中解包该任务id这里有很多缺失的部分,因此我将回答第一个缺失部分:
success
处理程序中返回的响应中解包该任务idclass ProcessView(generic.DetailView):
template_name = 'pages/process.html'
def get(self, request):
# GET stuff happens
return render(request, self.template_name, {'process_form': process_form, 'process': process_list})
def post(self, request):
# Get the Process ID from the incoming request
process_id = request.POST.get('id')
# Get relevant objects and queries
... python and DB stuff ...
# Fire off a Celery task to generate the PDF file asynchronously
task = create_pdf.delay(sensor, range_period)
return HttpResponseRedirect(self.request.path_info, {"task_id": task.task_id })
return JsonResponse({
'task_id': task_id
})