在 Django 中使用 Pytest 时有没有办法禁用节流?

Is there a way to disable throttling while using Pytest in Django?

问题:

我想找到一种方法来在 运行 我使用 pytest -vv

进行测试时禁用节流

详情:

我的 settings.py 文件中有此默认限制策略:

  'DEFAULT_THROTTLE_RATES': {
        'anon': '100/day',
        'user': '1000/day'
    }

我的 confest.py 中也有这个固定装置,每当我超过请求限制时 returns 就会出错:

def get_token(user, client):
    response = client.post(
        "/email-login",
        {"email":user.email, "password": "B9vX95phJDi3C4"},
    )
    return {
        "HTTP_AUTHORIZATION": f"Bearer {response.json()['token']['access']}"
    }

我试过的:

我曾尝试在这个 GitHub 问题中使用解决方案:https://github.com/encode/django-rest-framework/issues/1336,但它对我的情况不起作用。

首先,您需要创建一种方法来区分测试环境和其他环境。就像我们使用 settings.DEBUG 配置对 PROD 和 DEV 所做的那样。

我的建议是创建一个环境变量 test=True 然后在你的 settings.py 中写 -

if os.environ.get("test", False):
   REST_FRAMEWORK = {
     'DEFAULT_THROTTLE_CLASSES': [
    'rest_framework.throttling.AnonRateThrottle',
    'rest_framework.throttling.UserRateThrottle'
  ],
  'DEFAULT_THROTTLE_RATES': {
    'anon': '100/day',
    'user': '1000/day'
   }
}

否则它什么都不做,drf 将不会节流。

我能够通过以下步骤解决此问题:

  • 我创建了一个继承自基本设置文件的新设置文件。即 from settings import *
  • 然后我删除了 DEFAULT_THROTTLE_RATES 键,即 del REST_FRAMEWORK["DEFAULT_THROTTLE_RATES"]
  • 接下来我要做的是指向 pytest.ini 中的新设置文件,即 DJANGO_SETTINGS_MODULE="new_settings.py"

现在测试将使用新的设置文件

@ra123 的想法总体上是正确的。作为另一种方法,对于所有 Django 项目,我将类似的内容添加到我的 settings/__init__.py(或者如果你只做一个文件的事情,则只添加 settings.py)。它查看 argv 以查看其是否处于测试模式

IS_TESTING = bool(set(sys.argv[:2]) & {"pytest", "test", "jenkins"})

REST_FRAMEWORK = { "YOUR_CONFIG": "..." }

# at the very very end, AFTER your settings are loaded:
if IS_TESTING:
    # override your rest framework settings in test mode
    REST_FRAMEWORK["DEFAULT_THROTTLE_CLASSES"] = []

    # some other handy things, for making tests faster/easier
    PASSWORD_HASHERS = ("django.contrib.auth.hashers.MD5PasswordHasher",)
    EMAIL_BACKEND = "django.core.mail.backends.locmem.EmailBackend"
    DEFAULT_FILE_STORAGE = "inmemorystorage.InMemoryStorage"

我以这种方式结束了它,所以我们不必担心它会得到错误的设置。它还有助于保持集中,因此(例如)您不会在测试模式下调用 sentry.init 即使 环境中有 sentry_url