【发布时间】:2019-01-04 21:20:45
【问题描述】:
我的应用程序需要登录到 google 以便以后使用 google api。我有烧瓶舞蹈、烧瓶安全、烧瓶 sqlalchemy 工作到可以在我的开发系统中登录和注销的地步。
我一直在努力使用 pytest 测试登录。我正在尝试通过调用 flask_security.login_user 来强制登录,但 test_login 失败,好像没有人登录一样。我怀疑这是由于上下文设置的问题,但我尝试了很多不同的东西,但没有找到灵丹妙药。
不幸的是,虽然我在软件开发(尤其是 python)方面有很多经验,但我没有解决这个问题所需的 pytest / flask-dance / flask-security 背景。
在settings.py中
class Testing():
# default database
SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'
TESTING = True
WTF_CSRF_ENABLED = False
# need to set SERVER_NAME to something, else get a RuntimeError about not able to create URL adapter
SERVER_NAME = 'dev.localhost'
# need a default secret key - in production replace by config file
SECRET_KEY = "<test secret key>"
# fake credentials
GOOGLE_OAUTH_CLIENT_ID = 'fake-client-id'
GOOGLE_OAUTH_CLIENT_SECRET = 'fake-client-secret'
# need to allow logins in flask-security. see https://github.com/mattupstate/flask-security/issues/259
LOGIN_DISABLED = False
在conftest.py中
import pytest
from racesupportcontracts import create_app
from racesupportcontracts.dbmodel import db
from racesupportcontracts.settings import Testing
@pytest.fixture
def app():
app = create_app(Testing)
yield app
@pytest.fixture
def dbapp(app):
db.drop_all()
db.create_all()
yield app
在 test_basic.py 中
def login_test_user(email):
from racesupportcontracts.dbmodel import db, User
from flask_security import login_user
user = User.query.filter_by(email=email).one()
login_user(user)
db.session.commit()
def test_login(dbapp):
app = dbapp
from racesupportcontracts.dbmodel import db, init_db
from racesupportcontracts import user_datastore
from flask import url_for
# init_db should create at least superadmin, admin roles
init_db(defineowner=False)
useremail = 'testuser@example.com'
with app.test_client() as client:
create_user(useremail, 'superadmin')
login_test_user(useremail)
resp = client.get('/', follow_redirects=True)
assert resp.status_code == 200
assert url_for('admin.logout') in resp.data
【问题讨论】:
标签: python flask flask-sqlalchemy pytest flask-security