【问题标题】:How do I pass data to a flask form using pytest?如何使用 pytest 将数据传递到烧瓶表单?
【发布时间】:2021-07-06 12:34:32
【问题描述】:

我正在努力使用 pytest 将数据传递给表单。我希望将用户名和密码传递给登录表单。这是我尝试过的:

conftest.py

import pytest
from wahoo_connect import init_app, db
from wahoo_connect.models import User

from dotenv import load_dotenv
load_dotenv('.flaskenv')

@pytest.fixture(scope='module')
def app():
    app = init_app()
    with app.app_context():
        db.create_all()
        user = User(username='testuser', email='test@gmail.com', forename='Test', surname='User', confirmed=True)
        user.set_password('testing')
        db.session.add(user)
        db.session.commit()
        yield app

@pytest.fixture(scope='module')
def client(app):
    return app.test_client()

这设置了我的测试使用的客户端夹具:

def test_index_page__logged_in(client):
    with client:
        formdata = {'username': 'testuser', 'password': 'testing', 'remember_me': False}
        client.post('/auth/login', data=formdata)
        assert current_user.username == 'testuser'

路线在蓝图中定义为:

@auth_bp.route('/login', methods=['GET', 'POST'])
def login():
    # Login route logic goes here
    if current_user.is_authenticated:
        return redirect(url_for('home_bp.index'))
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(username=form.username.data).first()
        if user is None or not user.check_password(form.password.data):
            flash('Invalid username or password', 'warning')
            return redirect(url_for('auth_bp.login'))
        login_user(user, remember=form.remember_me.data)
        next_page = request.args.get('next')
        if not next_page or url_parse(next_page).netloc != '':
            next_page = url_for('home_bp.index')
        return redirect(next_page)
    return render_template('auth/login.html', title='Sign In', form=form)

这是表格:

class LoginForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    password = PasswordField('Password', validators=[DataRequired()])
    remember_me = BooleanField('Remember Me')
    submit = SubmitField('Sign In')

和模板:

{% extends "base.html" %}
{% block content %}
<div class="form-signin text-center">
    <form action="" method="post" novalidate>
        <h3>Please sign in</h3>
        <div class="form-floating">
            {{ form.username(type="text", class="form-control", id="floatingInput", placeholder="Username") }}
            {% for error in form.username.errors %}
                <span style="color: red;">[{{ error }}]</span>
            {% endfor %}
            <label for="floatingInput">{{ form.username.label.text }}</label>
        </div>
        <div class="form-floating">
            {{ form.password(type="password", class="form-control", id="floatingPassword", placeholder="Password") }}
            {% for error in form.password.errors %}
                <span style="color: red;">[{{ error }}]</span>
            {% endfor %}
            <label for="floatingPassword">{{ form.password.label.text }}</label>
        </div>

        <div class="checkbox mb-3">
        <label>
            {{ form.remember_me() }} {{ form.remember_me.label.text }}
        </label>
        </div>
        <button class="btn btn-lg btn-primary btn-block" type="submit">{{ form.submit.label.text }}</button>
        {{ form.hidden_tag() }}
    </form>
</div>
<p class="text-center">Forgot Your Password? <a href="{{ url_for('auth_bp.reset_password_request') }}">Click to Reset</a></p>
<p class="text-center pt-3"><a href="{{ url_for('auth_bp.register') }}">Create an Account</a></p>
{% endblock %}

我可以在视图中看到“if form.validate_on_submit():”语句之前的数据,并且是正确的,但是在提交过程中我永远无法超越这一点。我好像漏掉了什么!

谢谢

马丁

【问题讨论】:

    标签: flask pytest flask-wtforms flask-login


    【解决方案1】:

    我好像漏掉了一个重要的标志:

    WTF_CSRF_ENABLED = False
    

    现在可以了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-11
      • 2021-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-21
      相关资源
      最近更新 更多