【问题标题】:Problem when getting 'Authorization' header on test Flask application with FlaskClient使用 FlaskClient 在测试 Flask 应用程序上获取“授权”标头时出现问题
【发布时间】:2019-04-15 13:57:06
【问题描述】:

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

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

此视图在正常环境中正常工作,它正确返回“授权”标头,但是当我在测试环境中测试此视图时,它不返回“授权”标头。视图在“授权”标头中返回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, "")

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我尝试获取此标头而不是 Authorization,但不幸的是,此提示不起作用。我打印了返回的标头列表,没有HTTP_AUTHORIZATION 标头,但有一个Authorization 标头返回None。谢谢。
    • 抱歉不清楚,我的意思是你应该在请求头中添加HTTP_AUTHORIZATION,所以你的请求是:headers = { 'Access-Control-Allow-Origin': '*', 'Content-Type': 'application/json','HTTP_AUTHORIZATION': authorization}
    • 我尝试按照您的提示进行操作,但尚未奏效。感谢您的帮助。
    • 现在我已经弄清楚发生了什么。我试图在答案中描述。谢谢你的帮助凯西。
    【解决方案2】:

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

    我刚刚替换了来自

    的请求

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

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

    现在它开始工作了。

    如果有人遇到同样愚蠢的错误,我会在这里提出这个问题。

    非常感谢。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-04
        • 2017-03-07
        • 2012-08-14
        • 2021-04-16
        • 2021-06-26
        • 1970-01-01
        相关资源
        最近更新 更多