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

时间:2019-04-15 13:57:07

标签: python python-3.x flask flask-testing

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

我创建了一个“ sign_in”视图,当用户成功登录前端时,该视图将返回带有加密令牌的“ Authorization”标头。

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

我已经在Internet上尝试了一些解决方案,例如在测试用例中添加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, "")

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

对于这个愚蠢的问题,我感到抱歉。 现在我已经找到答案了。 问题是我试图在使用GET方法的视图中发出POST请求。

我刚刚替换了来自

的请求

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

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

现在它开始工作了。

在有人遇到相同的愚蠢错误的情况下,我将在此提出这个问题。

非常感谢您。