Как сохранить в список каждый вход, который я получаю из той же формы html? - PullRequest
0 голосов
/ 25 февраля 2020

как я могу сохранить в список каждый вход, который я получаю из той же формы? Как бы хотелось сохранить в списке каждый вес пользовательского ввода. Можно ли сохранить все веса, вставленные пользователем? Также, если он перезагрузит страницу?

Это форма:

<form action="/send" method="POST">
    <label for="">Weight</label>
    <input type="text" name="weight">
    <label for="">Height</label>
    <input type="text" name="height">
    <input type="submit" value="submit">
    <br>

<div class="alert">
    {{ BMI }}
</div>

И это приложение flask:


   from flask import Flask, render_template, url_for, request
   import schedule


   app = Flask(__name__)

   @app.route('/', methods=['GET', 'POST'])
   def index():
    return render_template('index.html')

   @app.route('/send', methods=['GET', 'POST'])
   def send():
    if request.method=='POST':
        weight = request.form['weight']
        height = request.form['height']
        a = float(weight)
        b = float(height)
        BMI = a/(b**2)
        weights = []
        weights.append(weight)
        return render_template('index.html', BMI=BMI, weights = weights)

1 Ответ

0 голосов
/ 25 февраля 2020

Вам нужно что-то, чтобы сохранить эти данные между запросами. Если вам это нужно только в течение короткого периода времени, вы можете просто использовать session. Документы для Flask-Session, кажется, показывают, что он импортируется из flask.ext.session сейчас, но моя версия импортируется как from flask_session import Session.

Ниже приведен минимальный, но полный пример игрушки, который можно показать как это работает (в этом случае я просто храню BMI, но вы можете хранить несколько списков в сеансе dict). Обратите внимание, что если вы используете сеанс по умолчанию, который идет с Flask, его емкость хранения очень мала; Вот почему я сохраняю данные сеанса в файл.

Если вам нужно, чтобы данные сохранялись дольше (то есть постоянно), вам необходимо использовать базу данных. Обратите внимание: дважды люди выступали за сохранение этих данных в глобальной переменной. Это ужасно для веб-приложения, потому что несколько пользователей начнут топтать данные друг друга, не говоря уже о том, что несколько процессов начнут выходить из строя c.

from flask import Flask, render_template_string, request, session
from flask_session import Session

app = Flask(__name__)
app.config['SECRET_KEY'] = b'_5#y2L"F4Q8z\n\xec]/'
app.config['SESSION_TYPE'] = 'filesystem'
sess = Session()
sess.init_app(app)

homepage_template = """
<form method="POST" action="{{ url_for('bmi_submission') }}" id="bmi_form">
Weight: <input type="text" name="weight" value=""><br>
Height: <input type="text" name="height" value=""><br>
<input type="submit" value="Submit">
</form>
<div id="result_div"></div>

<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script>
   $("#bmi_form").submit(function(e) {
       e.preventDefault();
       var form = $(this);
       var url = form.attr('action');

       $.ajax({
           type: "POST",
           url: url,
           data: form.serialize(),
           context: form,
           success: function(resp) {
               $("#result_div").html(resp); 
           }
       });
   });
</script>
"""

@app.route('/', methods=['GET'])
def homepage():
    return render_template_string(homepage_template)


@app.route('/calc_bmi', methods=['POST'])
def bmi_submission():
    weight = request.form.get('weight')
    height = request.form.get('height')
    a = float(weight)
    b = float(height)
    BMI = a/(b**2)

    if session.get('bmi'):
        session['bmi'].append(BMI)
    else:
        session['bmi'] = [BMI]

    return '<br>'.join([str(item) for item in session['bmi']])

if __name__ == '__main__':
    app.run()
...