繁体   English   中英

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

[英]How do I unit-test HTTPS requests in 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 请求?

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

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

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

你看过烧瓶的单元测试吗?

在你的设置代码之后,你会有这样的东西

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

更新

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

你会看到 werkzeug 有一个带有 base_url 的 EnvironBuilder。 也许可以使用它来模拟测试套件中的 https 环境。

有一种更简单的 Flask 方法可以做到这一点,只需使用PREFERRED_URL_SCHEME配置参数等于“https”。

你可以在这里找到它的定义。 您可以在此处找到 Flask 如何在内部使用它的规则。 您还可以在此处找到它的使用方法。

我会使用 python 请求库: http : //docs.python-requests.org/en/latest/

用它做 http 请求很容易。

使用请求库,您可以使用验证标志忽略 SSL。

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

这将忽略使用自签名证书的 SSL 警告

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM