gpt4 book ai didi

python - 测试 Flask 登录和身份验证?

转载 作者:太空狗 更新时间:2023-10-29 17:01:21 26 4
gpt4 key购买 nike

我正在开发一个 Flask 应用程序并使用 Flask-security 进行用户身份验证(这又在底层使用 Flask-login)。

我有一个需要身份验证的路由,/user。我正在尝试编写一个单元测试来测试,对于经过身份验证的用户,这会返回适当的响应。

在我的单元测试中,我正在创建一个用户并以该用户身份登录:

from unittest import TestCase
from app import app, db
from models import User
from flask_security.utils import login_user

class UserTest(TestCase):
def setUp(self):
self.app = app
self.client = self.app.test_client()
self._ctx = self.app.test_request_context()
self._ctx.push()

db.create_all()

def tearDown(self):
if self._ctx is not None:
self._ctx.pop()

db.session.remove()
db.drop_all()

def test_user_authentication():
# (the test case is within a test request context)
user = User(active=True)
db.session.add(user)
db.session.commit()
login_user(user)

# current_user here is the user
print(current_user)

# current_user within this request is an anonymous user
r = test_client.get('/user')

在测试中 current_user 返回正确的用户。但是,请求的 View 总是返回一个 AnonymousUser 作为 current_user

/user 路由定义为:

class CurrentUser(Resource):
def get(self):
return current_user # returns an AnonymousUser

我很确定我只是没有完全理解测试 Flask 请求上下文的工作原理。我读过这个 Flask Request Context documentation一堆,但我仍然不明白如何处理这个特定的单元测试。

最佳答案

问题是不同的请求上下文。

在您的普通 Flask 应用程序中,每个请求都会创建一个新的上下文,它将在整个链中重复使用,直到创建最终响应并将其发送回浏览器。

当您创建并运行 Flask 测试并执行请求(例如 self.client.post(...))时,上下文会在收到响应后被丢弃。因此,current_user 始终是 AnonymousUser

为了解决这个问题,我们必须告诉 Flask 在整个测试中重用相同的上下文。您可以通过简单地包装您的代码来做到这一点:

with self.client:

您可以在以下精彩文章中阅读有关此主题的更多信息: https://realpython.com/blog/python/python-web-applications-with-flask-part-iii/

示例

之前:

def test_that_something_works():
response = self.client.post('login', { username: 'James', password: '007' })

# this will fail, because current_user is an AnonymousUser
assertEquals(current_user.username, 'James')

之后:

def test_that_something_works():
with self.client:
response = self.client.post('login', { username: 'James', password: '007' })

# success
assertEquals(current_user.username, 'James')

关于python - 测试 Flask 登录和身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21506326/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com