所以我有一个简单的Django脚本,我在网上找到了一个运行Python脚本并通过stdout获取输出的AJAX函数。
views.py
from django.shortcuts import render
def index(request):
return render(request,'homepage/page.html')
homepage / page.html
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>test</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
$(function()
{
$('#clickme').click(function(){
alert('Im going to start processing');
$.ajax({
url: "static/homepage/js/external_func.py",
type: "POST",
datatype:"json",
data: {'key':'value','key2':'value2'},
success: function(response){
console.log(response.keys);
console.log(response.message);
}
});
});
});
</script>
</head>
<body>
<button id="clickme"> click me </button>
</body>
</html>
因此您可以看到我的URL链接到external_func.py
,该URL在单击按钮后运行。然后,脚本返回一个json。
external_func.py
import sys
import json
import cgi
fs = cgi.FieldStorage()
sys.stdout.write("Content-Type: application/json")
sys.stdout.write("\n")
sys.stdout.write("\n")
result = {}
result['success'] = True
result['message'] = "The command Completed Successfully"
result['keys'] = ",".join(fs.keys())
d = {}
for k in fs.keys():
d[k] = fs.getvalue(k)
result['data'] = d
sys.stdout.write(json.dumps(result, indent=1))
sys.stdout.write("\n")
sys.stdout.close()
但是,当我运行服务器并单击按钮时,控制台显示两个值均未定义,这意味着response.keys
和response.message
未定义。
现在,当我改为将代码切换为console.log(response)
中的homepage/page.html
时。控制台以文本形式打印出整个external_func.py
代码。
我无法在线找到解决方案。似乎人们很少在AJAX请求中调用Python脚本,我在论坛上看到了很多有关AJAX要求使用php代码的帖子。
EDIT1: 我必须澄清一件事。这只是我的项目的一小部分,我想对其进行一些测试。在我的实际项目中,我将在python中使用一个函数,该函数需要花费很长时间才能计算出来,因此我更喜欢在函数处理过程中使用一个等待图标来部分渲染网页。该功能的输出将显示在网页上。
答案 0 :(得分:1)
您有一个django应用程序,但是您正在使用CGI来实现此功能吗?为什么?为什么不简单地使函数成为另一个django视图呢?使用django服务您的响应要比CGI更好,除非该功能会大大膨胀或减慢django的速度。就这么简单:
from django.http import JsonResponse
def func(request):
result = ...
return JsonResponse(result)
如果您确实希望将其分为CGI脚本,则最有可能无法获得响应的原因是未将Web服务器配置为处理CGI请求。 (“开发人员工具”的“网络”选项卡对于准确诊断您收到的响应是非常有帮助的。)出于安全原因,默认情况下未启用CGI。您需要告诉Apache(或您使用的任何Web服务器)应该为该目录启用CGI,并且该CGI应该与.py
文件关联。