Jco*_*ine 5 python django pythonanywhere background-task
我对Django中的后台任务有一个概念性的问题。我正在通过PythonAnywhere运行一个Python / Django站点。
我有一个名为“ databooks”的网络应用,该应用由具有以下条目的表单组成:
然后,此数据手册应用程序查看文件夹位置,并编译其中的所有其他文件以创建一个大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文件来作为后台任务运行下面的所有内容,但是它目前正在超时。
注意:
background装饰器对调用函数时可以传递的参数进行了限制 - 它们必须全部可序列化为 JSON,而您的请求对象则不可序列化为 JSON。
因此,不要将请求对象传递给您的任务函数。在视图函数之外定义后台任务函数,并仅传递 json-serialized 的参数,在视图中调用该函数。使用 django-background-tasks 的一个主要缺点是它可能会阻塞主程序。
解决此问题的另一种方法是生成一个新的任务线程来生成文件,同时使用 ajax 查询状态。