如何在Django视图的返回中运行2个进程?

bwitn5fc  于 2023-06-25  发布在  Go
关注(0)|答案(3)|浏览(165)

我有一个django网站-做的东西。当按下打印按钮时,我需要它运行def(),然后返回主页

return view_xlsx(request, xlspath)
return render(request, 'webpage/HomePage.html', {'last_update': lastupdted})

我怎样才能既运行view_xlsx(在浏览器中下载),然后返回主页?
我试过了

return view_xlsx(request, xlspath), render(request, 'webpage/HomePage.html', {'last_update': lastupdted})

和/或

try:
            return view_xlsx(request, xlspath)
        finally:
            return render(request, 'website/HomePage.html', {'last_update': lastupdted})

他们两个都独立工作,但似乎不会一起工作。有什么想法?
编辑

def view_xlsx(request, xlspath):
    filename = xlspath.replace('\\', '/')
    name = filename.split('/')[-1]
    if os.path.exists(filename):
        response = FileResponse(open(filename, 'rb'), content_type='application/xlsx')
        response['Content-Disposition'] = f'inline; filename={name}'  # user will be prompted display the PDF in the browser
        # response['Content-Disposition'] = f'filename={name}'  # user will be prompted display the PDF in the browser
        return response
    else:
        return HttpResponseNotFound('Cannot find the XLS')
dgenwo3n

dgenwo3n1#

你不能。这是HTTP协议的限制。
一个典型的解决方法是重定向到一个html页面,该页面包含一个到生成的xls的链接(或者如果要求不高的话,它将“动态”生成xls)。您的视图将启动另一个进程(或Celery任务等)来生成xls,并将创建一个对象来表示结果,初始值/字段表示“pending”或“ETA 4 mins”。
您可以将“您的下载”构建到主页中(如果是这样的话),以便在(异步)生成完成后进行检索。
另一种解决方法是使用JS和 AJAX 定期询问xls是否准备就绪,并在HTML页面中显示微调器或估计的等待时间。如果你这样做,你必须考虑如果用户变得不耐烦并离开页面会发生什么。

bn31dyow

bn31dyow2#

您可以通过使用JavaScript来处理下载,然后将用户重定向到主页来实现这一点。首先,修改你的view_xlsx函数返回一个包含文件URL的JSON响应,而不是直接返回文件:

from django.http import JsonResponse

def view_xlsx(request, xlspath):
    filename = xlspath.replace('\\', '/')
    name = filename.split('/')[-1]
    if os.path.exists(filename):
        file_url = f'/path/to/your/files/{name}'  # Replace this with the actual URL path to your files
        return JsonResponse({'file_url': file_url})
    else:
        return HttpResponseNotFound('Cannot find the XLS')

接下来,在urls.py中为view_xlsx函数创建一个新端点:

from django.urls import path
from . import views

urlpatterns = [
    # ... other paths ...
    path('view_xlsx/', views.view_xlsx, name='view_xlsx'),
]

现在,在模板中添加一个JavaScript函数来处理下载和重定向:

<script>
function downloadAndRedirect() {
    fetch('/view_xlsx/')
        .then(response => response.json())
        .then(data => {
            const link = document.createElement('a');
            link.href = data.file_url;
            link.download = 'your_file_name.xlsx';  // Replace this with the desired file name
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);

            // Redirect to the home page
            window.location.href = '/';
        });
}
</script>

最后,修改打印按钮以在单击时调用downloadAndRedirect函数:

<button onclick="downloadAndRedirect()">Print</button>

这样,当用户点击打印按钮时,JavaScript函数将下载文件,然后将用户重定向到主页。

7ajki6be

7ajki6be3#

我通过定义一个新的组合函数并调用它来做到这一点

return downloadandredirect(request, xlspath, lastupdated)

def downloadandredirect(request, xlspath, lastupdated):
    context = {'last_update': lastupdated}
    response = render(request, 'referrals/HomePage.html', context)
    return view_xlsx(request, xlspath)

相关问题