Python 向django发送ajax请求并更新html

Python 向django发送ajax请求并更新html,python,django,ajax,subprocess,Python,Django,Ajax,Subprocess,我正在用Django编写一个web应用程序,它通过ajaxPOSTrequest在服务器上执行一些用python编写的代码,并且应该在客户端以JSON的形式检索输出,并用javascript部分更新HTML。我可以将请求发送到服务器并执行子流程,还可以检索JSON数据,但不在HTML中更新,而是作为字典显示给网站,而不包含HTML内容。最后一部分不起作用,我发现当我在视图函数中测试ajax请求时,它返回false。另一个问题是子进程有一个文件作为输出,因此我无法从子进程捕获标准输出 view.p

我正在用Django编写一个web应用程序,它通过ajax
POST
request在服务器上执行一些用python编写的代码,并且应该在客户端以JSON的形式检索输出,并用javascript部分更新HTML。我可以将请求发送到服务器并执行子流程,还可以检索JSON数据,但不在HTML中更新,而是作为字典显示给网站,而不包含HTML内容。最后一部分不起作用,我发现当我在视图函数中测试ajax请求时,它返回false。另一个问题是子进程有一个文件作为输出,因此我无法从子进程捕获标准输出

view.py:

def调用(请求):
call\u form=call(request.POST)
print(request.is_ajax())->返回false?
如果调用表单有效():
纯度参数=调用表格。已清理的数据['purity']
chr_sex=呼叫表单。已清理的_数据['chromosomal_sex']
command=“cnvkit.py call-m clonal--纯度%s--删除低覆盖率%s”%(纯度参数,颜色)
process\u call=subprocess.Popen(command.split(),stdout=subprocess.PIPE,stderr=subprocess.PIPE,cwd=sfs.path('cnv\u app/call\u CNS/'),universal\u newlines=True)
stdout,stderr=process_call.communicate()
如果进程调用返回代码和标准:
输出调用+=stdout+'\n'
输出\u err\u call+=stderr+'\n'
其他:
输出调用+=stdout+'\n'
process_call.poll()
响应={'output\u call':output\u call,'output\u err\u call':output\u err\u call}
返回JsonResponse(response)
.html:

呼叫
给定分段log2比率估计值(.cns),使用以下任一方法推导每个分段的绝对整数拷贝数:

{%if call_form%} {%csrf_令牌%} {{叫|脆}} 提交 {%endif%}
url.py

path('ajax_call/', views.call, name='ajax_call')
urlpatterns=[
路径('home/',views.home,name='home'),
路径('cnvPipeline/',views.pipeline,name='cnvkit_pipeline'),
]
.js

$('post form')。关于('submit',函数(事件){
event.preventDefault();
$.ajax({
url:“”,
键入:“POST”,
数据:$(this).serialize(),//{'pursity':'0.9','chromosomal_sex':'X'},
数据类型:“json”,
成功:功能(数据){
$(#response_msg).prepend(data.output_调用)
}
});
});

我自己也能找到解决方案,我遵循了本教程:最后我提出了第一个异步请求

.js

url.py

path('ajax_call/', views.call, name='ajax_call')
views.py

def call(request):
    call_form = Call(request.POST)
    print(request.is_ajax())
    if call_form.is_valid():
        
        purity_arg = call_form.cleaned_data['purity']
        chr_sex = call_form.cleaned_data['chromosomal_sex']
        command = "cnvkit.py call -m clonal --purity %s --drop-low-coverage  %s -o %s" % (purity_arg, sex_arg)
            process_call = subprocess.Popen(command.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                                            cwd=sfs.path('cnv_app/call_CNS/'), universal_newlines=True)
            stdout, stderr = process_call.communicate()
            #if process_call.returncode and stderr:
            output_call = stdout + '\n'
            output_err_call = stderr + '\n'
            process_call.poll()
        response_data = {'output_call': output_call, 'output_err_call': output_err_call}
        return HttpResponse(
            json.dumps(response_data),
            content_type="application/json"
        )
.html

{%if调用\表单%}
{%csrf_令牌%}
{{叫|脆}}
提交
{%endif%}

无论如何谢谢你

我自己也能找到解决方案,我遵循了本教程:最后我提出了我的第一个异步请求

.js

url.py

path('ajax_call/', views.call, name='ajax_call')
views.py

def call(request):
    call_form = Call(request.POST)
    print(request.is_ajax())
    if call_form.is_valid():
        
        purity_arg = call_form.cleaned_data['purity']
        chr_sex = call_form.cleaned_data['chromosomal_sex']
        command = "cnvkit.py call -m clonal --purity %s --drop-low-coverage  %s -o %s" % (purity_arg, sex_arg)
            process_call = subprocess.Popen(command.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                                            cwd=sfs.path('cnv_app/call_CNS/'), universal_newlines=True)
            stdout, stderr = process_call.communicate()
            #if process_call.returncode and stderr:
            output_call = stdout + '\n'
            output_err_call = stderr + '\n'
            process_call.poll()
        response_data = {'output_call': output_call, 'output_err_call': output_err_call}
        return HttpResponse(
            json.dumps(response_data),
            content_type="application/json"
        )
.html

{%if调用\表单%}
{%csrf_令牌%}
{{叫|脆}}
提交
{%endif%}

无论如何谢谢你

我想补充的是,我已经将这段代码包含在我的主.js文件中,该文件将头自定义为包含csrf令牌。修复了子流程输出的问题。答案是,我想补充的是,我已经将此代码包含到我的主.js文件中,该文件将头自定义为包含csrf令牌。修复了子流程输出的问题。答案是肯定的