Заставить Python принимать запросы POST / GET

#python #php

#python #php

Вопрос:

У меня есть страница PHP и программа на Python. Программа Python выполняет внутренний вызов API для получения информации, необходимой для отображения на странице PHP.

Программа Python настроена на принятие аргумента и обработку вызова API с использованием этого аргумента. Например myPythonProgram 12345 — получает информацию, относящуюся к учетной записи 12345.

Я хотел бы вызвать это со своей страницы PHP через Ajax, но если я вызываю программу так, как она должна вызываться, я получаю 404 (между программой и аргументом есть пробел). Я изменил скрипт Python для приема запросов (я думаю), но когда я делаю это, отображается код Python, а не результат. Следующий сбой:

 $.ajax({
    type: 'POST',
    url: "myPythonProgram",
    data: { id: '12345' },
    success: function(response) {
        // Stuff
    },
    fail: function() {
       alert('Error');
    },
    complete: function() {
        // Stuff
    }
});
 

Я подумал, что, возможно, я мог бы вызвать другую страницу PHP для выполнения программы Python через shell_exec() , но, похоже, страница отображается до того, как программа Python завершит свой запрос. Что-то вроде:

 $.ajax({
   type: 'POST',
   url: "callPy.php",
   data: { id: '12345' },
   success: function(response) {
       // Stuff
   },
   ....
});
 

с callPy.php быть:

 <?php

$data = $_REQUEST['data'];

if (isset($data) amp;amp; $data['id'] != NULL) {
    $info = shell_exec("myPythonProgram " . $data['id']);
    print_r(json_encode($info));
}

?>
 

Если бы я запустил эту точную команду myPythonProgram 12345 в оболочке, это сработало. Если я изменю callPy.php чтобы жестко закодировать идентификатор, а затем вызвать php callPy.php оболочку, это работает. Но вызов этого в браузере приводит к нулевому значению.

Как я могу заставить python принять запрос POST или GET или заставить PHP ждать завершения работы программы на Python, прежде чем она отобразит страницу?

Ответ №1:

Это было решено путем изменения разрешений для файлов, необходимых для вызова API.

Сначала я проверил, какой пользователь используется для веб-браузера: ps aux | egrep '(apache|httpd)' , который показал мне, что это «apache». Затем я попытался запустить программу python от имени этого пользователя : sudo -u apache ./myPythonProgram 12345 . Это привело к ошибке в сертификате, который требовался для вызова API.

При shell_exec() этом PHP будет ждать завершения процесса. Таким образом, изменение разрешений для этого сертификата позволило мне запустить программу от имени пользователя apache, и я смог добиться желаемого эффекта.