@realgord88

Проверка правильного ввода в Python/Flask?

Помогите написать программу, которая будет проверять правильность введенного ответа на математическое выражение, но с главным условием - сессии. Сейчас нерабочий код такой:
def index():
    form = NameForm()
    first = random.randint(0,10)
    second = random.randint(0,10)
    answer = first * second
    if form.validate_on_submit():
        if answer == int(form.ans.data):
            flash('Right')
        return redirect(url_for('index'))


C меня плюшки ;)
  • Вопрос задан
  • 4241 просмотр
Решения вопроса 1
@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 для поля пользовательского ввода, а также реализовать специфичный валидатор формы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы