2015-08-29 11 views
8

Я пытаюсь вызвать функцию в Python из моего кода JavaScript. Я использовал код, объясненный here, но он не работает для меня.Вызов функции python из JS

Вот мой JS код:

<!DOCTYPE html> 
<body> 
<script type="text/javascript" src="d3/d3.js"></script> 
<script type="text/javascript" src="http://code.jquery.com/jquery-2.1.4.min.js"></script> 
<script> 
text ="xx"; 

$.ajax({ 
type: "POST", 
url: "~/reverse_pca.py", 
data: { param: text} 
}).done(function(o) { 
    console.log(data); 
    console.log(text); 
}); 

Python код:

import csv 
from numpy import genfromtxt 
from numpy import matrix 

def main(): 
    ... 
    return x 
if __name__ == "__main__": 
    x=main() 
    return x; 

Вы знаете, что случилось с ним?

+1

'~/reverse_pca.py' относительный путь и, похоже, это предназначается, чтобы быть абсолютный путь. В любом случае, вы должны указать любые сообщения об ошибках (потому что «не работает» может означать много вещей), и вы должны смотреть журналы веб-сервера. – betterworld

ответ

7

Помимо упомянутых пунктов и предположения, что у вас уже есть надлежащая настройка для обслуживания вашего скрипта на основе python и возврата ответа. Вы должны представить асинхронный запрос, особенно если код python выполняет тяжелые вычисления.

function postData(input) { 
    $.ajax({ 
     type: "POST", 
     url: "/reverse_pca.py", 
     data: { param: input }, 
     success: callbackFunc 
    }); 
} 

function callbackFunc(response) { 
    // do something with the response 
    console.log(response); 
} 

postData('data to process'); 

Если вы только сделать некоторый свет вычисления и у вас нет проблем, работая с кодом нежелателен из JQuery 1.8, идут с синхронным подходом. Это не рекомендуется, поскольку он блокирует основную нить.

function runPyScript(input){ 
    var jqXHR = $.ajax({ 
     type: "POST", 
     url: "/reverse_pca.py", 
     async: false, 
     data: { param: input } 
    }); 

    return jqXHR.responseText; 
} 

// do something with the response 
response= runPyScript('data to process'); 
console.log(response); 

Подробнее об этом здесь: How do I return the response from an asynchronous call? и http://api.jquery.com/jquery.ajax/

2

После поиска в течение нескольких часов я закончил тем, что это, и это работает прекрасно. Надеюсь, это поможет кому-то еще в будущем.

HTML and JS code -- loging.html 
<html> 
<head> 
    <title>Flask Intro - login page</title> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <link href="static/bootstrap.min.css" rel="stylesheet" media="screen"> 
    <script type="text/javascript" src="http://code.jquery.com/jquery 2.1.4.min.js"></script> 
</head> 
<body> 
    <input id="submitbutton" type="submit" value="Test Send Data"> 
    <!-----------------------------------> 
    <script type="text/javascript"> 

    function runPyScript(input){ 
     var jqXHR = $.ajax({ 
      type: "POST", 
      url: "/login", 
      async: false, 
      data: { mydata: input } 
     }); 

     return jqXHR.responseText; 
    } 

    $('#submitbutton').click(function(){ 
     datatosend = 'this is my matrix'; 
     result = runPyScript(datatosend); 
     console.log('Got back ' + result); 
    }); 

</script> 

Python code -- app.py 

from flask import Flask, render_template, redirect, url_for,request 
from flask import make_response 
app = Flask(__name__) 

@app.route("/") 
def home(): 
    return "hi" 
@app.route("/index") 

@app.route('/login', methods=['GET', 'POST']) 
def login(): 
    message = None 
    if request.method == 'POST': 
     datafromjs = request.form['mydata'] 
     result = "return this" 
     resp = make_response('{"response": '+result+'}') 
     resp.headers['Content-Type'] = "application/json" 
     return resp 
     return render_template('login.html', message='') 
if __name__ == "__main__": 
app.run(debug = True) 
Смежные вопросы