如何在Flask中对HTTPS请求进行单元测试?

jcl*_*ncy 10 python 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
Run Code Online (Sandbox Code Playgroud)

如果您没有请求页面的HTTPS版本,则会将您重定向到该版本.我想为这项服务编写单元测试.我写了一个确保你被重定向到HTTPS版本(基本上检查301或301).我想测试一下,如果您要求https版本的页面并且已经在https上,它不会重定向您(基本上,对于200).如何让Flask在单元测试中发送https请求?

Bel*_*rog 5

您可以强制 Flask 测试的 get() 调用使用 HTTPS,如下所示:

response = self.app.get('/login', base_url='https://localhost')
assert(response.status_code == 200)
Run Code Online (Sandbox Code Playgroud)

底层 Werkzeug 使用添加的 base_url 来设置 url 方案(HTTP/HTTPS)。对于像这样的本地测试调用,不使用主机名,可以省略。您可以在此处查看 base_url 的基本代码文档。


Gev*_*ous 1

您看过Flask 的单元测试吗?

设置代码后,您将看到类似这样的内容

response = self.client.get(url)
self.assertEquals(response.status_code, 301)
self.assertEquals(resonse.text.find('https'), 0)
Run Code Online (Sandbox Code Playgroud)

更新

似乎最好的方法是创建一个 werkzeug 环境。Flask 使用 werkzeug 测试客户端。你可以在这里查看 api 。快速入门(很有用)就在这里

您将看到 werkzeug 有一个带有 base_url 的 EnvironBuilder。也许可以在测试套件中模拟 https 环境。