Как модулировать HTTPS-запросы в Flask?

Для некоторых страниц в приложении Flask, которое я создаю, у меня есть система перенаправления HTTPS следующим образом.

def requires_https(f, code=302):
    """defaults to temp. redirect (301 is permanent)"""
    @wraps(f)
    def decorated(*args, **kwargs):
        passthrough_conditions = [
            request.is_secure,
            request.headers.get('X-Forwarded-Proto', 'http') == 'https',
            'localhost' in request.url
        ]

        if not any(passthrough_conditions):
            if request.url.startswith('http://'):
                url = request.url.replace('http://', 'https://')
                r = redirect(url, code=code)
                return r
    return decorated

Если вы не запрашиваете версию HTTPS на странице, она перенаправляет вас на нее. Я хочу написать модульные тесты для этой службы. Я написал тот, который гарантирует, что вы перенаправлены на версию HTTPS (в основном, для 301 или 301). Я хочу проверить, что если вы запрашиваете https-версию страницы и уже находитесь на https, она не перенаправляет вас (в основном, на 200). Как мне получить Flask для отправки запроса https в unit test?

Ответ 1

Вы можете принудительно вызвать вызов get() для проверки флажков для использования HTTPS следующим образом:

response = self.app.get('/login', base_url='https://localhost')
assert(response.status_code == 200)

Добавление base_url используется базовым Werkzeug для установки схемы URL (HTTP/HTTPS). Для локальных тестовых вызовов, подобных этим, имя хоста не используется и может быть опущено. Вы можете увидеть базовую документацию кода для base_url здесь.

Ответ 2

Вы просмотрели модульное тестирование для фляжки?

После вашего кода установки у вас будет что-то вроде этого

response = self.client.get(url)
self.assertEquals(response.status_code, 301)
self.assertEquals(resonse.text.find('https'), 0)

Update

Кажется, лучший способ - создать среду werkzeug. Flask использует клиент тестирования werkzeug. Вы можете посмотреть здесь api здесь. Быстрый старт (что полезно) здесь.

Вы увидите, что werkzeug имеет EnvironBuilder с base_url. Возможно, его можно поиграть с этим, чтобы имитировать среду https в вашем тестовом наборе.

Ответ 3

Я бы использовал библиотеку запросов python: http://docs.python-requests.org/en/latest/

Довольно легко выполнить с ним http-запросы.

Ответ 4

В библиотеке запросов вы можете игнорировать SSL с флагом проверки.

requests.get('https://example.com', verify=False)

Это будет игнорировать предупреждения SSL от использования самозаверяющего сертификата