代码之家  ›  专栏  ›  技术社区  ›  ababuji

Flask和HTML:重定向json响应以显示在同一页面的底部,而不是在单独的页面上显示响应

  •  -1
  • ababuji  · 技术社区  · 6 年前

    对网络开发来说是个新概念。。我正在部署一个 sklearn公司 基于Flask的机器学习模型。

    app.py 以这样一种方式,预测响应出现在新创建的容器元素中,正好位于 form

    这是我的 index.html

    <!DOCTYPE html>
    <html>
    <head>
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <link rel="stylesheet" href= "{{ url_for('static',filename='css/style.css') }}">
    
    
    </head>
    <body>
    <div class = 'intro'>
      This is a simple website that hosts a Machine Learning model trained using <i>sklearn</i> to predict one of three authors:
      <b>HP Lovecraft</b>, <b>Edgar Allan Poe</b> and <b>Mary Shelley</b>. Simply enter a passage of one of those three authors and you will get a prediction.
    
    
    </div>
    
    <div class="authorimage">
      <div class="row">
      <div class="column">
        <h2>Mary Shelley</h2>
        <p><img src = "{{ url_for('static',filename='img/mary.jpeg') }}"></p>
      </div>
      <div class="column">
        <h2>H.P Lovecraft</h2>
    
        <p><img src = "{{ url_for('static',filename='img/lovecraft.jpeg') }}"></p>
      </div>
      <div class="column">
        <h2>Edgar Allan Poe</h2>
        <p><img src = "{{ url_for('static',filename='img/eap.jpeg') }}"></p>
      </div>
    </div>
    
    
    </div>
    
    
    <div class = 'input'>
      <form action="/api" method="POST">
        <textarea name = "passage_input" cols="35" wrap="soft"></textarea>
        <input type="submit">
    </form>
    </div>
    
    
    <div class = "prediction">
    Not sure how to collect the response from app.py into a box here..
    </div>
    
    </body>
    </html>
    

    这是我的 应用程序类型

    import numpy as np
    import pandas as pd
    from flask import Flask, render_template, abort, jsonify, request
    import pickle
    from vectorspace import VectorSpace
    import json
    
    with open('/Users/abhishekbabuji/Desktop/spooky_author_model.pkl', 'rb') as fid:
         pkl_model_loaded = pickle.load(fid)
    
    
    app = Flask(__name__, static_url_path='')
    
    @app.route('/')
    def input_form():
      return render_template('/index.html')
    
    
    @app.route('/api', methods = ['POST'])
    def predict():
      text_input = request.form['passage_input']
      return parse(pd.Series([text_input]))
    
    def parse(input_passage):
    
        reduction_type = 'lemmatize'
        trans_input_passage = VectorSpace(input_passage, reduction = reduction_type).apply_reduction()
    
    
        return json.dumps(pkl_model_loaded.predict(trans_input_passage)[0])
    
    
    
    
    if __name__ == '__main__':
      app.run(port = 9000, debug = True)
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   elpidaguy    6 年前

    您可以在jinja中使用for以html格式解析json结果,如:

    {% for key, value in results %}        
      <span>{{key}} : {{value}}</span>
    {% endfor %}
    

    return render_template("index.html", results = your result)
    
        2
  •  2
  •   Ajax1234    6 年前

    你必须使用 jquery

    <!DOCTYPE html>
    <html>
    <head>
     <meta name="viewport" content="width=device-width, initial-scale=1">
     <link rel="stylesheet" href= "{{ url_for('static',filename='css/style.css') }}">
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    </head>
     <body>
       ...
     <div class = 'input_wrapper'>
        <textarea name = "passage_input" cols="35" wrap="soft" class="paragraph"></textarea>
        <button class='predict'>Predict</button>
     </form>
     </div>
    <div class = "prediction"></div>
    </body>
    <script> 
    $(document).ready(function(){
       $('.input_wrapper').on('click', '.predict', function(){
          var data = $('.paragraph').val();
          $.ajax({
           url: "/api",
          type: "get",
          data: {text:data},
          success: function(response) {
            $(".prediction").html(response.name);
           }
        });
       });
    });
    </script>
    </html>
    

    在应用程序中:

    @app.route('/api')
    def predict():
      text_input = request.args.get('text')
      return flask.jsonify({'name':parse(pd.Series([text_input]))})
    

    现在,当单击“Predict”按钮时,javascript从 textarea 并动态调用路由 '/api' 并更新 prediction

    推荐文章