Ответы пользователя по тегу Flask
  • Проверка правильного ввода в Python/Flask?

    @throughtheether
    human after all
    Помогите написать программу, которая будет проверять правильность введенного ответа на математическое выражение,
    Примерно так. Пользователю вы показываете (при получении GET-запроса) два числа. На форме, кроме этого, должны присутствовать два скрытых поля ввода с этими же числами. Защиту от подделки (чтобы пользователь складывал именно те числа, которые ему прислали) можно реализовать при помощи csrf-токена или самостоятельного хэширования двух значений (первый вариант предпочтительнее). При получении POST-запроса, сравниваете сумму чисел (из скрытых полей) с пользовательским вводом и делаете выводы.

    UPD:
    validate.py:
    from flask import Flask, render_template, request
    from wtforms import TextField, HiddenField
    from flask.ext.wtf import Form
    from random import randint
    app = Flask(__name__)
    app.secret_key = 'perkele 9000'
    
    class TestForm(Form):
        answer = TextField("answer")
        val1 = HiddenField("val1")
        val2 = HiddenField("val2")
    
    
    @app.route('/', methods=["POST", "GET"])
    def test():
        if request.method == 'POST':
            form = TestForm(request.form)
            try:
                if int(form.val1.data) + int(form.val2.data) == int(form.answer.data):
                    return "OK!"
            except ValueError:
                pass
            return "Not OK!"
    
        if request.method == 'GET':
            form = TestForm()
            form.val1.data = randint(1,99)
            form.val2.data = randint(1,99)
            return render_template('template.html', form = form)
    
    if __name__ == '__main__':
        app.debug = True
        app.run()

    templates/template.html:
    <html>
    <head>
            <title>Test your arithmetic skills</title>
    </head>
    <body>
    <table>
        <tr><td>Calculate <b>{{form.val1.data}} + {{form.val2.data}}</b></td></tr>
        <tr>
        <td>
        <form method=post action="{{ url_for('test') }}">
            {% for field in form %}
                {{field}}
            {% endfor %}
            <input type=submit value="OK">
        </form>
        </td>
        </tr>
    </table>
    </body>
    </html>

    Здесь показан только набросок, в качестве развития темы можно использовать IntegerField для поля пользовательского ввода, а также реализовать специфичный валидатор формы.
    Ответ написан
    3 комментария