【问题标题】:How do I unit-test HTTPS requests in Flask?如何在 Flask 中对 HTTPS 请求进行单元测试?
【发布时间】:2013-06-10 06:06:09
【问题描述】:

对于我正在创建的 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 请求?

【问题讨论】:

  • 你有没有想过这个问题?
  • @nu_everest 这是很久很久以前的事了,我没有尝试 Belrog 的回答,因为项目已经结束。 IIRC 我们最终获得了测试环境的 HTTPS 证书并编写了一个快速的手动测试......并不理想。

标签: python https flask


【解决方案1】:

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

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

基础 Werkzeug 使用添加的 base_url 来设置 url 方案(HTTP/HTTPS)。对于像这样的本地测试调用,不使用主机名,可以省略。 You can see basic in code documentation for base_url here.

【讨论】:

  • 虽然这可行,但回答 stackoverflow.com/a/63708394/9415337 会好得多。它允许更少的重复(在不同的单元测试之间)并且不需要硬编码主机地址。
【解决方案2】:

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

你可以找到它的定义here。您可以找到 Flask here 在内部使用它的规则。您还可以找到它的使用方式here

【讨论】:

    【解决方案3】:

    你看过unit testing for flask吗?

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

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

    更新

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

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

    【讨论】:

    • 这不是我真正想要的;我刚才澄清了。我想在单元测试中模拟一个 https 请求。
    • 我更新了我的答案。我真的不确定测试套件是否适合 https 测试。以上是我寻找解决方案的最佳方法。
    【解决方案4】:

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

    用它很容易做http请求。

    【讨论】:

    • 我试过了,但我希望在不运行 HTTPS 服务器的情况下运行单元测试。
    【解决方案5】:

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

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

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

    【讨论】:

    • 我试过了,但问题是我需要运行 HTTPS 服务器(在端口 483 或其他端口上)。 Flask 是否为此提供了便利?
    猜你喜欢
    • 2018-03-13
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 2023-03-20
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    相关资源
    最近更新 更多