Как модулировать 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 от использования самозаверяющего сертификата