2017-10-11 12 views
1

J'ai une application flask qui prend du texte en entrée, exécute un script python et crache une sortie sur la même page html, sauf qu'elle va à une nouvelle page. Je ne vois pas pourquoi cela irait à une nouvelle page.Comment publier le résultat de sortie sur la même page dans l'application flacon?

Ceci est mon fichier app.py:

#!/usr/bin/env python3 

from flask import * 
from flask import render_template 
from myclass import myfunction 

app = Flask(__name__) 

@app.route('/') 
def homepage(): 
    return render_template('index.html') 

@app.route('/', methods= ["POST"]) 
def background_process(): 
    if request.method == 'POST': 
     try: 
      story = request.form.get('story') 
      if story: 
       result = myfunction(story) 
       return render_template('index.html', **jsonify(result)) 
      else: 
       return jsonify(result='Input needed') 
     except Exception as e: 
      return (str(e)) 

if __name__ == "__main__": 
    app.debug=True 
    app.run() 

Et voici mon fichier index.html:

<!DOCTYPE html> 
<html> 
    <head> 
     <link rel="stylesheet" href="../static/main.css"> 
     <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
     <script type=text/javascript> 
      $(function() { 
       $('a#process_input').bind('click', function() { 
       $.getJSON('/background_process', { 
        story: $('textarea[name="story"]').val(), 
       }, function(data) { 
        $('#result').text(data.result); 
       }); 
       return false; 
       }); 
      }); 
     </script> 
    </head> 

    <body> 
     <div class='container'> 
      <form> 
       <textarea id="text_input" rows="20" cols="80" name=story></textarea> 
       <br> 
       <a href=# id=process_input><button class='btn btn-default'>Submit</button></a> 
      </form> 
      <br> 
      <p><h2 align='center'>Result:</h2><h2 id=result align='center'></h2></p> 

     </div> 
    </body> 
</html> 

Lorsque l'entrée est donnée, il montre le résultat dans une nouvelle page sur JSON format. Je veux le montrer sur la même page. Qu'est-ce qui ne va pas ici? Merci!

+0

Vous ne postez pas 'my_function()' qui semble faire le travail majeur. –

+0

Combien de temps faut-il pour traiter 500 mots? –

+0

Moins d'une seconde. Je pense que le problème est dans la demande de get. Probablement obtenir une requête ne peut pas prendre autant de texte. J'ai essayé d'utiliser post, mais je ne peux pas obtenir la sortie sur la même page. – 0x1

Répondre

1

Comme vous utilisez déjà une méthode ajax capable de gérer la réponse, vous pouvez renvoyer la réponse JSON directement au lieu de rendre un nouveau modèle:

return jsonify(result=result) 

Aussi, vous voudrez peut-être changer GET à POST pour la méthode JQuery:

<!DOCTYPE html> 
<html> 
    <head> 
     <link rel="stylesheet" href="../static/main.css"> 
     <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
     <script type=text/javascript> 
      $(function() { 
       $('a#process_input').bind('click', function() { 
       $.post('/', { 
        story: $('textarea[name="story"]').val(), 
       }, function(data) { 
        $('#result').text(data.result); 
       }); 
       return false; 
       }); 
      }); 
     </script> 
    </head> 

(. Notez que vous devez écrire $.post('/background_process' si vous gardez deux fonctions séparées, et non celui que je suggère ci-dessous)

Ensuite, vous pouvez recueillir le code dans une fonction, le modèle sera rendu avec une méthode GET, et la réponse sera rendu à partir d'un POST:

app = Flask(__name__) 

@app.route('/', methods= ["GET", "POST"]) 
def homepage(): 
    if request.method == 'POST': 
     story = request.form.get('story') 
     if story: 
      result = myfunction(story) 
      return jsonify(result=result) 
     else: 
      return jsonify(result='Input needed') 

    return render_template('index.html') 

if __name__ == "__main__": 
    app.debug=True 
    app.run() 
+0

Merci. Cela a fonctionné. – 0x1