使用烧瓶登录对烧瓶进行单元测试时禁用@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-Login
在 init_app
(https://github.com/maxcountryman/flask-login/blob/master/flask_login.py#L164) 上缓存 TESTING
或 LOGIN_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的主要内容,如果未能解决你的问题,请参考以下文章