使用烧瓶登录对烧瓶进行单元测试时禁用@login_required

Posted

技术标签:

【中文标题】使用烧瓶登录对烧瓶进行单元测试时禁用@login_required【英文标题】:Disabling @login_required while unit-testing flask with flask-login 【发布时间】:2014-03-12 23:29:39 【问题描述】:

我正在对使用 flask-login 扩展的烧瓶应用程序进行单元测试。

我正在使用 webtest 像这样设置我的所有测试:

class TestCase(unittest.TestCase):

    def setUp(self):
        app.config['TESTING'] = True
        self.client = webtest.TestApp(app)

但是当我尝试通过 self.client.get() 访问带有 @login_required 修饰的 url 时,我收到 401 错误消息,提示我无权访问该 url。

根据文档https://flask-login.readthedocs.org/en/latest/#protecting-views 还有这个discussion, 将“TESTING”的配置值设置为 True 应该禁用登录要求,但这似乎对我不起作用。

有什么建议吗?

【问题讨论】:

【参考方案1】:

这是因为 Flask-Logininit_app (https://github.com/maxcountryman/flask-login/blob/master/flask_login.py#L164) 上缓存 TESTINGLOGIN_DISABLED

因此,如果您创建应用程序然后在配置中设置某些内容,那么您的配置更改将被忽略。

更好地使用具有分离配置的应用程序工厂进行生产和测试,它还可以降低测试中未清理应用程序状态的错误概率。

重新初始化login_manager的最简单方法:

class TestCase(unittest.TestCase):
    def setUp(self):
        app.config['TESTING'] = True
        app.login_manager.init_app(app)
        self.client = webtest.TestApp(app)

【讨论】:

似乎适用于LOGIN_DISABLED,但不适用于TESTING。 github.com/maxcountryman/flask-login/issues/216【参考方案2】:

来自flask login documentation 据说:

可以方便的在unit的时候全局关闭认证 测试。要启用此功能,如果应用程序配置变量 LOGIN_DISABLED 设置为 True,此装饰器将被忽略。

如果您使用的是应用程序工厂设计模式,请将其添加到您的测试配置中:

LOGIN_DISABLED = True

或者您可以在创建应用程序时添加它:

class TestCase(unittest.TestCase):
    def setUp(self):
        app.config['LOGIN_DISABLED'] = True
        self.client = webtest.TestApp(app)

希望对遇到同样问题的人有所帮助

【讨论】:

【参考方案3】:

我不确定这是否会有所帮助,但是:

在我的旧烧瓶项目文件中,我的“flaskr.py”文件中有配置,它们看起来像这样:

# configuration
DATABASE = 'flaskr.db'
DEBUG = True
SECRET_KEY = 'development key'
USERNAME = 'admin'
PASSWORD = 'default'

所以也许你会有

TESTING = True

?

【讨论】:

从我上面的代码中可以看出,我在每次测试之前为应用程序设置了 TESTING 配置变量。在调试期间,我检查了配置,确实 TESTING 设置为 True。

以上是关于使用烧瓶登录对烧瓶进行单元测试时禁用@login_required的主要内容,如果未能解决你的问题,请参考以下文章

无法使用烧瓶路由到“/ login”?

如何在具有多个蓝图的烧瓶中处理登录?

烧瓶登录:Chrome 忽略 cookie 过期?

为啥我的 current_user 没有在烧瓶登录中进行身份验证?

烧瓶登录:无法理解它是如何工作的

使用 mysql 和烧瓶登录的 Flask-sqlalchemy 损坏管道错误 32