Django AJAX返回undefined而不是变量

时间:2018-12-28 04:22:11

标签: javascript python jquery ajax django

所以我有一个简单的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.keysresponse.message未定义。

Console

现在,当我改为将代码切换为console.log(response)中的homepage/page.html时。控制台以文本形式打印出整个external_func.py代码。

我无法在线找到解决方案。似乎人们很少在AJAX请求中调用Python脚本,我在论坛上看到了很多有关AJAX要求使用php代码的帖子。

EDIT1: 我必须澄清一件事。这只是我的项目的一小部分,我想对其进行一些测试。在我的实际项目中,我将在python中使用一个函数,该函数需要花费很长时间才能计算出来,因此我更喜欢在函数处理过程中使用一个等待图标来部分渲染网页。该功能的输出将显示在网页上。

1 个答案:

答案 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文件关联。