Django AJAX возвращает неопределенные вместо переменных - PullRequest
0 голосов
/ 28 декабря 2018

Итак, у меня есть простой скрипт Django, который я нашел в сети для функции AJAX, которая запускает скрипт Python и получает вывод через stdout.

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который запускается после нажатия кнопки.Затем скрипт возвращает 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()

Однако, когда я запускаю сервер и нажимаю на кнопку,консоль показывает undefined для обоих значений, то есть response.keys и response.message не определены.

Console

Теперь, когда я вместо этого переключаю код на console.log(response) в homepage/page.html.Консоль распечатывает весь код external_func.py в тексте.

Я не смог найти решение онлайн.Кажется, что люди редко вызывают скрипт Python в запросе AJAX, я вижу много сообщений на форуме о том, что AJAX вместо этого требует код php.

EDIT1: Я должен уточнить одну вещь.Это всего лишь небольшой раздел моего проекта, на котором я хочу провести тестирование.В моем реальном проекте у меня будет функция в python, которая требует много времени для вычисления, поэтому я предпочитаю, чтобы веб-страница частично отображалась со значком ожидания во время обработки функции.Выходные данные функции будут отображаться на веб-странице.

1 Ответ

0 голосов
/ 28 декабря 2018

У вас есть приложение django, и все же вы используете CGI для этой функции?Зачем?Почему бы просто не сделать функцию еще одним представлением django?Обслуживание вашего ответа с помощью django намного превосходит CGI, если только эта функция не значительно увеличивает или замедляет ваше django.Это так просто:

from django.http import JsonResponse
def func(request):
    result = ...
    return JsonResponse(result)

Если вы действительно хотите разделить это на CGI-скрипт, наиболее вероятная причина, по которой вы не получаете ответ, - ваш веб-сервер не настроен для обработки CGI.запрос.(Ваша вкладка «Инструменты разработчика» - отличная помощь для точной диагностики того, какой ответ вы получили.) По соображениям безопасности CGI по умолчанию не включен.Вы должны сообщить Apache (или любому веб-серверу, который вы используете), что CGI должен быть включен для этого каталога и что он должен быть связан с .py файлами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...