ジャンゴスロットリング

かつて、他の誰かのdjango-appを使用しなければなりませんでした。このdjango-appには、多くのフォーム、メソッド、その他すべてがありました。 そして、言うまでもなく、作者は迷惑メールを送信しないか、スパマーやF5をヘビーフォームにプッシュする愛好家から保護することはありません。 書き直したりフォークしたりする欲求がなかったので、悪い人のために酸素をカットするミドルウェアを書くことにしました。



機能的




構成の例を示す方が簡単です:

DJANGO_THROTTLING = { 'all': 1000, 'post': 'callable:helpers.trash.my_callback', 'congestion': 'forum.views.congestion', 'django.contrib.admin.options.change_view': { 'post': False, 'all': None, 'uri': '/admin/forum/post/23/', }, }
      
      





カットの下に説明がある他の例。



設置



 git clone http://github.com/night-crawler/django-throttling.git cd django-throttling python setup.py install
      
      







グローバル調整


構成はセクションで構成され、一番上のセクションはフォールバックで、詳細なルールが存在しない場合にサイト全体に使用されます。



 DJANGO_THROTTLING = { 'all': 1000, 'post': 10000, 'congestion': 'forum.views.congestion', }
      
      





この例では、すべてのタイプのリクエストに対して、制限は1秒あたり1リクエストに設定され、10秒ごとにリクエストが送信されます。

輻輳は、uri、またはviewです。 この場合、近隣にあるビューは次のように呼び出されます。



 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) )
      
      







これは、ユーザーにいたずらであり、たとえばN秒待つ必要があることをユーザーに通知します。 ビューには、プログレスバーを備えたスクリプトが提供され、フォームが自動的にオーバーロードされます。 元のビューとその引数のセット全体が輻輳_bundleに渡されるため 、ユーザーにより詳細な情報を伝えることができます。



サイト全体でPOSTを無効にできます。 次に、ユーザーにはHttpResponseBadRequestが表示されます。



 DJANGO_THROTTLING = { 'all': 1000, 'post': False, 'congestion': 'forum.views.congestion', }
      
      







そして、このようにPOSTを無効にすると、ユーザーはルートに送信されます:



 DJANGO_THROTTLING = { 'all': 1000, 'post': '/', 'congestion': 'forum.views.congestion', }
      
      







単純なリダイレクトでは不十分な場合は、メンテナンスモード用の独自のハンドラーを作成できます。

 DJANGO_THROTTLING = { 'all': 1000, 'post': 'forum.views.maintenance', 'congestion': 'forum.views.congestion', } # forum.views.maintenance def maintenance(request, maintenance_bundle): return HttpPreResponse(maintenance_bundle)
      
      







特定の場合にのみビューをブロックする必要がある場合があります。たとえば、フォーラム内の1つのトピックをブロックする場合、またはその他の特別な場合です。 次に、ルールのカスタムハンドラを作成できます。



 DJANGO_THROTTLING = { 'all': 1000, 'post': 'callable:helpers.trash.my_callback', #    callable: 'congestion': 'forum.views.congestion', } # helpers.trash.my_callback' def my_callback(request, view_func, view_args, view_kwargs): return 'some_strange_key_123', 10000
      
      







キーの名前とタイムアウトからタプルを返す必要があります。 タイムアウトは、再びint()、False、view、またはuriにすることができます。



ローカル調整


基本的に同様の構文があります。 オプションキー 'uri'の存在のみが異なります。これにより、スロットルチェックのみを設定できます。



 DJANGO_THROTTLING = { 'all': 1000, 'post': 'callable:helpers.trash.my_callback', 'congestion': 'forum.views.congestion', 'django.contrib.admin.options.change_view': { 'post': False, 'all': None, 'uri': '/admin/forum/post/23/', # 'post': 'callable:helpers.trash.my_callback', # 'all': 4000, }, }
      
      







途中でいくつかの設定があります:



  1. DJANGO_THROTTLING_ENABLED :スロットルをオンにし、デフォルトでオフにします。
  2. DJANGO_THROTTLING_CACHE_EXPIRE :キャッシュに保存されるキーの数を決定します。 デフォルトは60 * 60です。
  3. DJANGO_THROTTLING_CACHE_PREFIX :キャッシュプレフィックス、デフォルトは「THROTTLING」
  4. THROTTLING_CACHE_KEY_PATTERNS :キーを生成するためのパターンはここに保存されます。 合計で4つの種類があります:view_method、view、site_method、site。 上書きできます。
  5. DJANGO_THROTTLING_IGNORE_ADMIN :ユーザーが管理者である場合、スロットルを無効にします。 したがって、接続された認証が必要です




githubには英語の説明があります。



All Articles