django 禁用某些用户的DRF限制

mxg2im7a  于 2023-05-19  发布在  Go
关注(0)|答案(1)|浏览(136)

我有几个测试用户用于对我的Django + DRF应用程序运行集成测试。如何仅对这些用户禁用限制?
看起来我可以覆盖DRF的allow_request()方法(参见https://github.com/encode/django-rest-framework/blob/99 e8 b4033 efa 44930 ace 40 fb 48 a4 d 7 bcd 224 f9 fb/rest_framework/throttling.py#L109):

from rest_framework.throttling import SimpleRateThrottle

class CustomSimpleRateThrottle(SimpleRateThrottle):
    def allow_request(self, request, view):
        if request.user in {<user1>, <user2>}:
            return True
        return super().allow_request(request, view)

但是我不想选择这种方法,因为它要求我在所有的节流类中使用这个基本方法(例如:UserRateThrottleAnonRateThrottle等)。
有没有其他方法可以做到这一点?

gr8qqesn

gr8qqesn1#

考虑到节流是作为检查缓存的请求时间戳列表来实现的,该列表根据每个用户和每个作用域的唯一字符串进行键控,我认为您可以使用一个自定义中间件来清除与这些用户匹配该高速缓存键的值。在传入请求上运行此函数的东西(假设allowed_users{<user_1>, <user_2>}的可迭代对象):

from django.cache import cache as default_cache

def clear_throttling_for_allowed_users(request):
    user = request.user
    if user.is_authenticated and user in allowed_users:
        # Based on the implementation of UserRateThrottle.get_cache_key()
        cache_key = f'throttle_user_{user.pk}'
        default_cache.delete(cache_key)

或者如果你知道你已经在默认的“user”作用域之上定义了更多的作用域,这些作用域为经过身份验证的用户处理节流:

USER_THROTTLE_SCOPES = ['user', 'another_scope', 'one_more']

def clear_throttling_for_allowed_users(request):
    user = request.user
    if user.is_authenticated and user in allowed_users:
        for scope in THROTTLE_SCOPES:
            cache_key = f'throttle_{user}_{user.pk}'
            default_cache.delete(cache_key)

相关问题