Page 1 of 1

Testen einer Flask-Wtforms-App, die CSRF Token (PyTest) verwendet

Posted: 24 Feb 2025, 13:09
by Anonymous
Ich habe eine Flask -App, die auf dem Tutorial hier basiert https://flask.palletsprojects.com/en/stable/tutorial/. Das Tutorial wird mit einer Testsuite geliefert, aber die App angepasst, um WTForms zu verwenden, um die Tests zu verwenden, bei denen die Datenversorgungsdaten nicht mehr funktionieren. Ich kann sehen, dass keiner der Formen bestätigt, da sie kein CSRF -Token enthält. Wie kann ich das Token zu den gesendeten Postdaten hinzufügen? Ich bin auf diesen ziemlich alten Wild gestoßen, das zeigt, wie es geht, aber es scheint veraltet für die Version von Werkzug, die ich verwende, da es sich auf das Selbst bezieht. /gist.github.com/singingwolfboy/2fca1de64950d5dfed72.
Ich verwende Flask == 3.1.0
flask_wtf==1.2.2
PYTEST==8.3.4
SELENIUM==4.29.0
WERKZUGE==.1.1.3
WtForms == 3.2.1
tests/conftest.py

Code: Select all

import os
import tempfile

import pytest
from flaskr import create_app
from flaskr.db import get_db, init_db

with open(os.path.join(os.path.dirname(__file__), 'data.sql'), 'rb') as f:
_data_sql = f.read().decode('utf8')

@pytest.fixture
def app():
db_fd, db_path = tempfile.mkstemp()

app = create_app({
'TESTING': True,
'DATABASE': db_path,
})

with app.app_context():
init_db()
get_db().executescript(_data_sql)

yield app

os.close(db_fd)
os.unlink(db_path)

@pytest.fixture
def client(app):
return app.test_client()

@pytest.fixture
def runner(app):
return app.test_cli_runner()
tests/test_auth.py

Code: Select all

import pytest
from flask import g, session
from flaskr.db import get_db

def test_register(client, app):
assert client.get('/auth/register').status_code == 200
response = client.post_csrf(
'/auth/register', data={'username': 'a', 'password': 'a'}
, follow_redirects=True)
print(f'{response.status=}')
print(f'{response.response=}')
for x in response.response:
print(x)
assert response.headers["Location"] == "/auth/login"

with app.app_context():
assert get_db().execute(
"SELECT * FROM user WHERE username = 'a'",
).fetchone() is not None