使用 FlaskClient 在测试 Flask 应用程序上获取"授权"标头时出现问题



我正在使用FlaskClient测试我的Flask应用程序,以避免在测试应用程序时始终运行Flask服务器。

我创建了一个"sign_in"视图,当用户在我的前端成功登录时,该视图会返回带有加密令牌的"授权"标头。

此视图在正常环境中正常工作,它正确返回"授权"标头,但是当我在测试环境中测试此视图时,它不会返回"授权"标头。视图在"授权"标头中返回None

我已经在互联网上尝试了一些解决方案,例如在我的测试用例中添加self.app.config['TESTING'] = True,但是终端提出了一个错误'FlaskClient' object has no attribute 'config'我已经尝试寻找解决方案,但没有成功。

我想知道可能会发生什么。

有谁知道这个问题有什么解决方案吗?

我在下面发送我的代码进行分析。

提前谢谢你。

view.py

@app.route("/sign_in", methods = ["POST"])
def sign_in():
...
username, password = ...
try:
encoded_jwt_token = auth_login(username, password)
except UserDoesNotExistException as error:
return str(error), error.status_code
resp = Response("Returned Token")
resp.headers['Authorization'] = encoded_jwt_token
return resp

test.py

class TestAPIAuthLogin(TestCase):
def setUp(self):
self.app = catalog_app.test_client()
# self.app.config['TESTING'] = True  # config does not exist
def test_get_api_auth_login_user_test(self):
username = "test"
password = get_string_in_hash_sha512("test")
authorization = 'Basic ' + get_string_in_base64(username + ":" + password)
headers = {
'Access-Control-Allow-Origin': '*',
'Content-Type': 'application/json',
'Authorization': authorization
}
response = self.app.get('/sign_in', headers=headers)
# it returns None 
authorization = response.headers.get("Authorization")
self.assertIsNotNone(authorization)
self.assertNotEqual(authorization, "")

我相信这可能与HTTP请求处理标头的方式有关,它们将它们大写并添加HTTP_作为前缀。尝试将标头更改为HTTP_AUTHORIZATION而不仅仅是Authorization,因为测试客户端不会正确设置它。

我很抱歉这个愚蠢的问题。 现在我已经找到了答案。 问题是我试图在使用POST方法的视图中执行GET请求。

我刚刚替换了来自的请求

response = self.app.get('/sign_in', headers=headers)

response = self.app.post('/sign_in', headers=headers)

现在它开始工作了。

我会把这个问题放在这里,以防有人遇到同样的愚蠢错误。

非常感谢。

如果 DRF 客户端出现类似问题,您可以使用,

client = APIClient()
client.credentials(HTTP_AUTHORIZATION='Token {token}'.format(token=token))

参考: https://www.django-rest-framework.org/api-guide/testing/#credentialskwargs

相关内容

  • 没有找到相关文章

最新更新