Django SECURE_SSL_REDIRECT 破坏了使用内置客户端的单元测试

2024-06-24

我正在开发一个已经有数百个单元测试的项目,其中许多使用内置的 django 客户端或 django 休息框架 APIClient 来发出请求和测试响应。

最近实现了使 SSL 在本地工作的必要条件,并设置SECURE_SSL_REDIRECT为真(试图让我们的dockerizeddev and test环境尽可能接近production as possible),我发现这么多单元测试失败了,因为(API)客户端请求默认总是使用 http,而不是 https。

许多(大多数)请求如下所示:

response = self.client.get(some_url)

我知道我可以使用:

response = self.client.get(some_url, secure=True)

但这确实意味着改变a lot单元测试。使用时也是如此follow=True,但还有一个额外的缺点,即这可能会产生其他一些不良行为。

我看不到将安全请求的使用设置为 Django 客户端中的默认行为的方法。我可以制作自己的 SecureClient(和 SecureAPIClient),但是我必须确保制作一个新的基础 TestCase(可能是多个)来继承,并在所有测试中随处更改它 - 仍然有很多工作。

当然可以对客户端进行猴子修补,但我不愿意这样做,因为它可能会产生不良影响,以后很难调试。

太长了;有没有一种简单的(理想支持的)方法,通过 django 测试的客户端发出所有单元测试请求,默认使用 SSL?


  • 选项 1. 禁用SECURE_SSL_REDIRECT需要的时候:

    from django.test import override_settings
    
    class FooTest(TestCase):
    
        def setUp(self):
            settings_manager = override_settings(SECURE_SSL_REDIRECT=False)
            settings_manager.enable()
            self.addCleanup(settings_manager.disable)
    
  • 选项 2:包裹get and post的方法APIClient:

    class ApiTestCase(TestCase):
        def setUp(self):
            self.client = APIClient()
    
        def get(self, *args, **kwargs):
            return self.client.get(secure=True, *args, **kwargs)
    
        def post(self, *args, **kwargs):
            return self.client.post(secure=True, *args, **kwargs)
    
  • 选项 3:只需为测试环境维护一个单独的设置文件SECURE_SSL_REDIRECT没有被设置。

我已经尝试了所有三个选项并建议使用(3)。原因如下:

  1. django.test.client只是对真实客户的模仿。它可以对您的观点进行单元测试。它不会产生真正的 WSGI 请求,因此测试环境无论如何都不会与生产环境匹配。

  2. SECURE_SSL_REDIRECT is a SecurityMiddleware环境。不要对第三方代码进行单元测试 https://coderwall.com/p/45wycg/don-t-unit-test-third-party-code.

  3. 确保您的代码始终使用 SSL 是一个很好的目标。然而,这是一个一体化测试问题。适合这项工作的工具是硒 + LiveServerTestCase https://docs.djangoproject.com/en/2.0/topics/testing/tools/#django.test.LiveServerTestCase.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django SECURE_SSL_REDIRECT 破坏了使用内置客户端的单元测试 的相关文章

  • 使用 django 和 tastypie 通过 RESTful api 发布文件

    我正在为 Django 网站创建 RESTful api 我在用tastypie https github com toastdriven django tastypie因为这样做 我的问题是我无法设计如何通过此 api 发布图像或文件 我
  • Django 表单指示输入类型

    恐怕我正在努力解决另一个基本问题 我已经浏览了各种 Django 文档页面并搜索了这个站点 我在这里找到的唯一内容是在 2013 年 其中建议设置自定义过滤器模板 无论如何 我试图生成我自己的表单 而不是使用 Django 自己的方式通过
  • pytz 时区标签来调整模板中打印的日期

    在我的应用程序中 我使用普通的日期时间对象 在我的模板中 load tz datetimeobject timezone Europe Paris timezone Europe Paris datetimeobject endtimezo
  • 如何从 Azure Key Vault 获取证书以在 docker 镜像中使用

    我在构建 docker 映像时使用 ssl 证书来与 Kubernetes 中的其他不同服务进行通信 现在我的存储库中有 ssl 证书 并将作为工件的一部分发布 我们计划将证书移至密钥库并在执行管道时获取它 我不确定如何在构建 docker
  • django modelformset_factory - 管理表单数据丢失

    我仍在与表单集作斗争 我无法真正理解为什么会出现此错误 u ManagementForm 数据丢失或已被篡改 那是我的代码 请指出我的错误并帮助我解决这个问题 csrf protect transaction commit on succe
  • Django:如何从模型中验证 unique_together

    我有以下内容 class AccountAdmin models Model account models ForeignKey Account is master models BooleanField name models CharF
  • Django 视图有一个意外的关键字参数

    我有以下网址模式 urlpatterns pattern url r edit offer P
  • 如何构建具有依赖关系的单元测试?

    给出以下简单示例 class MathObject object A completely superfluous class def add self a b return a b def multiply self a b result
  • Django + Nginx 配置(获取“Welcome to nginx!”)

    我在 Ubuntu 上有 Django Nginx Gunicorn 使用 Letscrypt 生成的证书 In etc nginx sites available myproject I have server server name m
  • 如何使用 EntityType 字段对 Symfony 4 表单进行单元测试

    如何使用 EntityType 字段对 Symfony 4 表单进行单元测试 当我运行测试时 vendor bin simple php单元测试 Unit Form ProductFormTest php 这是我的终端中的输出 PHPUni
  • 在代理后面使用 Maven 和 SSL 时出现问题

    我刚刚下载了 Maven 并尝试运行 五分钟内的 Maven 页面上找到的简单命令 http maven apache org guides getting started maven in Five millions html http
  • 模型形式中的值错误

    我正在使用模型表单来获取播放列表及其项目 它还包含登录脚本 我正在尝试将当前登录的用户设置为用户模型 你可以看看我之前发过的这篇文章如何避免这个下拉组合框 https stackoverflow com questions 8763612
  • 在 django 中进行单元测试时出现“auth_user 不存在”

    我已经尝试解决这个错误一周了 但我似乎不知道如何解决这个错误 使用这个存储库的其他人都没有遇到与我相同的问题 我是最新的源 所以它必须是某种本地问题 但我不知道它会是什么 每次我尝试运行我们编写的 django 单元测试时都会发生这种情况
  • 在AWS Windows实例中获取SSL的CSR文件

    我需要获取 CSR 才能完成 godaddy com 的 SSL 订单 我在 Amazon AWS 实例中运行 Windows 2012 服务器是 Express js 域名指向该实例IP 一切正常 我想我必须从控制台或类似的东西创建该密钥
  • Django:用户在线/离线 - 即使用户在线,用户也没有 false

    我想知道我的用户是在线还是离线 我有不同的应用程序 我正在为所有用户使用用户应用程序 用户 模型 py class UserProfile models Model def last seen self return cache get l
  • python 请求 SSL 错误(证书验证失败)

    我已经为我的服务器和客户端生成了以下自签名证书 我创建了 ca crt 和 ca key 使用 ca cert 和 ca key 我分别为服务器创建了 server crt server key 为客户端创建了 client crt cli
  • 使用 get_queryset 对列表视图进行排序

    两种模型 帖子和作者该视图显示每个作者的最后一篇文章 作者是一个外键 我想按降序排列这些帖子 但这不起作用 模板继续以升序方式显示这些内容 我尝试以下操作 views py class LastestListView ListView co
  • Django 1.6:清除一张表中的数据

    我有一个名为 UGC 的表 想要清除该表中的所有数据 我不想重置整个应用程序 这也会删除所有其他模型中的所有数据 是否可以只清除一个模型 我还为我的应用程序配置了 South 如果这有帮助的话 你可以使用原始 SQL https docs
  • 当测试文件定义为模块时,使用堆栈调用 hspec 定义的测试会抛出错误

    我试图弄清楚为什么包含定义为模块的单元测试的测试文件在运行时失败stack build test 假设有一个从头开始定义的简单测试模块 stack new test module cd test module vim package yam
  • Jmeter关闭SSL证书

    如何在 Apache Jmeter 3 2 中禁用 SSL 证书验证 类似于邮递员 SSL证书验证开 关 中的开关 默认情况下 JMeter 不验证证书 如果您遇到 ssl 问题 这是另一个原因 根据您的评论 根本原因是缺少标头 添加这些标

随机推荐