Testen einer Flask-Wtforms-App, die CSRF Token (PyTest) verwendet
Posted: 24 Feb 2025, 13:09
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
tests/test_auth.py
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()
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