在 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
。
问题:
我想找到一种方法来在 运行 我使用 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
。