web-dev-qa-db-fra.com

Appelez python de JS

J'essaie d'appeler une fonction en Python à partir de mon code JavaScript. J'ai utilisé le code expliqué ici mais cela ne fonctionne pas pour moi.

Voici mon code 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);
});

Code Python:

import csv
from numpy import genfromtxt
from numpy import matrix

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

Savez-vous ce qui ne va pas?

10
Bahador Saket

En dehors des points mentionnés et en supposant que vous disposez déjà d'une configuration appropriée pour servir votre script python et renvoyer la réponse. Vous devez soumettre une demande asynchrone, surtout si le code python effectue des calculs lourds.

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');

Si vous ne faites que des calculs légers et que vous n'avez aucun problème à travailler avec un code obsolète à partir de jQuery 1.8, optez pour l'approche synchrone. Ceci n'est pas recommandé car il bloque le thread principal.

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);

Pour en savoir plus, cliquez ici: Comment renvoyer la réponse d'un appel asynchrone? et http://api.jquery.com/jquery.ajax/

13
Farshid T

Après avoir cherché pendant quelques heures, j'ai fini par avoir ce qui suit, et cela a bien fonctionné. J'espère que cela aidera quelqu'un d'autre à l'avenir.

code HTML et JS: 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>

Code Python: 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)
6
Bahador Saket