Проблема при получении заголовка авторизации в тестовом приложении Flask с FlaskClient

Я тестирую свое приложение Flask с помощью FlaskClient, чтобы не запускать сервер 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, "")

person rmmariano    schedule 15.04.2019    source источник


Ответы (2)


Я считаю, что это может быть связано с тем, как HTTP-запросы обрабатывают заголовки, где они пишутся с заглавной буквы и добавляют HTTP_ в качестве префикса. Попробуйте изменить заголовок на HTTP_AUTHORIZATION, а не просто на Authorization, поскольку тестовый клиент не будет правильно его настраивать.

person Kathy Rindhoops    schedule 15.04.2019
comment
Я попытался получить этот заголовок вместо Authorization, но, к сожалению, этот совет не сработал. Я распечатал список возвращаемых заголовков, но там нет заголовка HTTP_AUTHORIZATION, но есть заголовок Authorization, который возвращает None. Спасибо. - person rmmariano; 15.04.2019
comment
Извините за непонятность, я имел в виду, что вы должны добавить HTTP_AUTHORIZATION в заголовок запроса, чтобы ваш запрос был: headers = { 'Access-Control-Allow-Origin': '*', 'Content-Type': 'application/json','HTTP_AUTHORIZATION': authorization} - person Kathy Rindhoops; 15.04.2019
comment
Я пытался последовать твоему совету, но это пока не помогло. Спасибо за помощь. - person rmmariano; 15.04.2019
comment
Теперь я понял, что происходило. Я попытался описать в ответ. Спасибо за помощь, Кэти. - person rmmariano; 15.04.2019

Простите, ребята, за этот глупый вопрос. Теперь я понял ответ. Проблема заключалась в том, что я пытался выполнить GET запрос в представлении, использующем метод POST.

Я только что заменил запрос от

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

to

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

и теперь он начал работать.

Я оставлю этот вопрос здесь, если кто-то получит ту же глупую ошибку.

Большое спасибо.

person rmmariano    schedule 15.04.2019