Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Django,芹菜:检索异步生成的文件_Javascript_Ajax_Django_Pdf_Celery - Fatal编程技术网

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),所以我不确定如何处理“定期检查文件是否存在,如果存在,下载它”部分,因为他似乎在使用基于函数的视图,而我在我的项目中使用基于类的视图。

这里有很多缺失的部分,所以我将回答第一个缺失的部分:

  • 要从ajax帖子中获取任务id,视图应返回:
  • javascript ajax成功处理程序应该从通常在
    success
    处理程序中返回的响应中解包该任务id

  • 然后,javascript代码应该定期轮询一个单独的django视图,该视图可以检索芹菜任务的结果(可能是文件名),以获取生成的PDF的文件名


  • 这里有很多缺失的部分,因此我将回答第一个缺失部分:

  • 要从ajax帖子中获取任务id,视图应返回:
  • javascript ajax成功处理程序应该从通常在
    success
    处理程序中返回的响应中解包该任务id

  • 然后,javascript代码应该定期轮询一个单独的django视图,该视图可以检索芹菜任务的结果(可能是文件名),以获取生成的PDF的文件名

  • class 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
    })