Django的基本限流应用程序
项目描述
django-throttling 尝试创建一个简单的应用程序,该程序允许应用频率限制到用户的请求。
功能
按视图维护模式
按视图超时
禁用视图
超时配置与 request.method 相关
重定向
自定义拥塞视图
视图超时支持回调
要求
django缓存
安装
使用以下方法之一下载 django-throttling
pip
pip安装django-throttling
从GitHub检查
使用以下命令之一
git clone http://github.com/night-crawler/django-throttling.git
配置
将‘django_throttling’添加到 settings.py 中的 INSTALLED_APPS
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', ... 'django_throttling', ... )
MIDDLEWARE
将 django_throttling.middleware.ThrottleMiddleware 添加到 settings.py 中的 MIDDLEWARE_CLASSES。您可能需要‘request.user’或‘request.session’等,因此请根据您的需求将其插入正确的位置。
设置
DJANGO_THROTTLING_ENABLED:启用‘django-throttling’。默认值为 False。
DJANGO_THROTTLING_CACHE_EXPIRE:我们应该保留最后访问时间多长时间。如果你为视图设置了较长的超时时间,例如24小时,请确保DJANGO_THROTTLING_CACHE_EXPIRE不小于你的超时时间。默认值为60*60。
DJANGO_THROTTLING_CACHE_PREFIX:键的缓存前缀。默认为THROTTLING。
THROTTLING_CACHE_KEY_PATTERNS:一个包含构建缓存键模式的字典。可以在应用设置中重新定义。默认值是
view_method:指定方法的视图的缓存键模式。默认模式:%(prefix)s:%(view)s:%(uid)s:%(ip)s:%(method)s
view:视图的缓存键模式。默认模式:%(prefix)s:%(view)s:%(uid)s:%(ip)s
site_method:带有方法的整个网站的缓存键模式。默认模式:%(prefix)s:%(uid)s:%(ip)s:%(method)s
site:全局模式。默认:%(prefix)s:%(uid)s:%(ip)s
DJANGO_THROTTLING_IGNORE_ADMINS:如果用户是管理员则忽略限制。默认为True。
DJANGO_THROTTLING:一个字典,具有应用程序路径键,用于配置限制。例如:{'django.contrib.admin.options.change_view': {'all': 50, 'post': 5000}}
请参阅使用说明。了解更多。
使用说明
全局回退
为当前站点的任何请求设置的回退超时
DJANGO_THROTTLING = { 'all': 1000, 'post': 10000, 'congestion': 'forum.views.congestion', }
这表示“每秒一个请求,每10秒一个POST请求”。congestion是在节流检查之后调用的视图,如果它失败。它可能是一个uri,例如/forum/congestion/。必须以‘/’开头。
最简单的拥塞视图可能看起来像
def congestion(request, congestion_bundle): user = request.user progress = int(float(congestion_bundle['delta']) / congestion_bundle['timeout'] * 100) c = Context({'user': user, 'congestion_bundle': congestion_bundle, 'progress': progress}) return render_to_response(get_theme_template(user, 'congestion.html'), c, context_instance=RequestContext(request) )
congestion_bundle是一个字典,从process_request()中填充
congestion_bundle = { 'view_func': self.view_func, 'view_args': self.view_args, 'view_kwargs': self.view_kwargs, 'timeout': timeout, 'delta': delta, }
你可以禁用你网站上所有的POST(“维护模式”)
DJANGO_THROTTLING = { 'all': 1000, 'post': False, 'congestion': 'forum.views.congestion', }
在这种情况下,你将在任何POST请求上得到HttpResponseBadRequest()
此外,你可以将你的POST用户重定向到任何页面
DJANGO_THROTTLING = { 'all': 1000, 'post': '/', 'congestion': 'forum.views.congestion', }
或者你可以为它使用自定义的维护视图
DJANGO_THROTTLING = { 'all': 1000, 'post': 'forum.views.maintenance', 'congestion': 'forum.views.congestion', }
维护视图可能看起来像
def maintenance(request, maintenance_bundle): return HttpPreResponse(maintenance_bundle)
如果你需要一个特殊的缓存键构建器,或者只是设置超时不足以满足你的需求,你可以使用一个回调,例如,为POST进行,它必须进行检查并返回一个包含缓存键和所支持的超时类型之一的元组
DJANGO_THROTTLING = { 'all': 1000, 'post': 'callable:helpers.trash.my_callback', 'congestion': 'forum.views.congestion', }
下面是一个示例回调
def my_callback(request, view_func, view_args, view_kwargs): return 'some_strange_key_123', 10000
提供了原始视图的所有完整参数。
而且别忘了,这是一个回退部分,它只在没有详细的视图节流规则时使用。
按视图节流
按视图节流几乎相同
DJANGO_THROTTLING = { 'all': 1000, 'post': 'callable:helpers.trash.my_callback', 'congestion': 'forum.views.congestion', 'django.contrib.admin.options.change_view': { 'post': False, 'all': 0, 'uri': '/admin/forum/post/23/', # 'post': 'callable:helpers.trash.my_callback', # 'all': 4000, }, }
首先,它会禁用所有对django.contrib.admin.options.change_view的限制。然后,它会禁用此视图的POST方法,仅当请求路径以/admin/forum/post/23/开头时。其他选项允许来自全局设置。