2015-08-29 10 views
8

से पाइथन फ़ंक्शन कॉल करें मैं अपने जावास्क्रिप्ट कोड से पायथन में एक फ़ंक्शन कॉल करने का प्रयास कर रहा हूं। मैंने कोड का उपयोग here समझाया लेकिन यह मेरे लिए काम नहीं करता है।जेएस

import csv 
from numpy import genfromtxt 
from numpy import matrix 

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

क्या आपको पता है इसके साथ गलत है:

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

अजगर कोड:

यहाँ मेरी जे एस कोड है?

+1

'~/reverse_pca.py' एक रिश्तेदार पथ है और जैसे कि यह एक पूर्ण पथ करने के लिए है यह लग रहा है। वैसे भी, आपको किसी भी त्रुटि संदेश का उल्लेख करना चाहिए (क्योंकि "काम नहीं करता" कई चीजों का मतलब हो सकता है) और आपको वेब सर्वर लॉग देखना चाहिए। – betterworld

उत्तर

7

उल्लिखित बिंदुओं के अलावा और यह मानते हुए कि आपके पास पहले से ही आपकी पायथन स्क्रिप्ट की सेवा करने और प्रतिक्रिया वापस करने के लिए उचित सेटअप है। आपको एक एसिंक्रोनस अनुरोध जमा करना चाहिए, खासकर यदि पायथन कोड कुछ भारी गणना करता है।

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)