在Django网站中提交表单后,如何执行繁重的后台python代码?

Jco*_*ine 5 python django pythonanywhere background-task

我对Django中的后台任务有一个概念性的问题。我正在通过PythonAnywhere运行一个Python / Django站点。

我有一个名为“ databooks”的网络应用,该应用由具有以下条目的表单组成:

  1. 数据手册名称
  2. 文件夹位置/链接(在我的PythonAnywhere文件系统上)

然后,此数据手册应用程序查看文件夹位置,并编译其中的所有其他文件以创建一个大PDF。然而,由于合并页面并添加页脚等的性质,它被认为是“重处理”PythonAnywhere,他们定义为一个网络工作者超过5分钟,他们分别杀了。

我想到的解决方案是在提交表单后执行background-python脚本,该脚本将databooks views.py文件中的整个内容输入到backgrounddatabookgenerator.py文件中,该文件可以独立于用户在浏览器窗口中的运行而运行。

在查看了PythonAnywhere对此的诊断之后,我一直在研究一些选项,但是到目前为止,在实现后台任务(即django-background-tasks)方面还没有成功。

是否有人熟悉Django工作流程,在单击“提交”按钮后,可以实现将另一个python文件作为后台任务调用的实现?为此,我想使此后台任务独立于用户单击提交后的操作,允许繁重的数据手册生成过程自行完成,而无需考虑时间

views.py

def Databook_req(request):
    submitted = False
    if request.method == 'POST':
        form = DatabookForm(request.POST, request.FILES)
        What_would_you_like_to_save_the_completed_data_book_as = request.POST['What_would_you_like_to_save_the_completed_data_book_as']
        Major_Equipment_Folder = request.POST['Major_Equipment_Folder']
        if form.is_valid():
            data_dict = {
                'What_would_you_like_to_save_the_completed_data_book_as_': str(What_would_you_like_to_save_the_completed_data_book_as),
                'Major_Equipment_Folder': str(Major_Equipment_Folder)
            }
            form.save()
            DataBookName = str(What_would_you_like_to_save_the_completed_data_book_as) + '.pdf'
            original_path = str(Major_Equipment_Folder)
Run Code Online (Sandbox Code Playgroud)

***然后,数据手册代码通过引用上述变量来遵循此规则。我不确定是否需要一个单独的python文件来作为后台任务运行下面的所有内容,但是它目前正在超时。

min*_*lyu 1

注意background装饰器对调用函数时可以传递的参数进行了限制 - 它们必须全部可序列化为 JSON,而您的请求对象则不可序列化为 JSON。 因此,不要将请求对象传递给您的任务函数。在视图函数之外定义后台任务函数,并仅传递 json-serialized 的参数,在视图中调用该函数。使用 django-background-tasks 的一个主要缺点是它可能会阻塞主程序。

解决此问题的另一种方法是生成一个新的任务线程来生成文件,同时使用 ajax 查询状态。