• Как сделать проверку данных из формы с данными из базы данных?

    zigen
    @zigen
    Необходимо переопределить метод form.is_valid() и в него добавить сравнение введенного ответа с истинно верным из БД
    Ответ написан
    Комментировать
  • Как проверить уникальности Nickname в БД SQLAlchemy Flask/Python?

    Сделайте unique index на атрибут nickname в модельке User. Как-то так: nickname = Column(..., unique=True)

    И проверяйте так:
    try:
        user = User.query.filter_by(nickname=user.nickname).one()
    except NoResultFound:
        # ник уникален
        pass
    else:
        # ник не уникален
        pass

    p.s. Если не нужен результат результат запроса, то можно посмотреть на exists(). Не думаю, что оно критично для подобного рода задач, однако с ним выгрузки данных не происходит.
    Ответ написан
    3 комментария
  • Проверка правильного ввода в 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 комментария
  • Почему не работает счетчик в Python/Flask?

    yokotoka
    @yokotoka
    Python guru
    У вас логика программы нерабочая. :) Вы answer неправильно считаете. Вот что это такое?
    first = random.randint(1, 10)
    second = random.randint(1, 10)
    answer = first*second


    Вы генерируете first и second рандомно, показываете пользователю. Пользователь вводит ответ. При следующем запросе вы опять их рандомно генерируете (вместо того, чтобы взять те, с которыми пользователь дело имел) и проверяете произведение новых с тем что ввёл пользователь (а там произведение старых). Естественно, что счётчик увеличится с вероятностью той же, что и слон пролетит за окном. :)

    А вообще, если делать правильно, то заведите пользователю сессию (например, flask-beaker) и сохраняйте результаты туда (в том числе answer, который ожидается с предыдущего шага). Иначе при количестве пользователей >1 на приложение у вас опять будут баги.
    Ответ написан
    5 комментариев