Проблема при получении заголовка «Авторизация» в тестовом приложении Flask с FlaskClient - PullRequest
1 голос
/ 15 апреля 2019

Я тестирую свое приложение 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, "")

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

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

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

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

до

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

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

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

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

0 голосов
/ 15 апреля 2019

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

...