2017-12-20 19 views
0

私はDjango 1.11とPython 2.7を使用しています。スロットサービスを私のwebserviceに含めるようにしました。これはDjangoがあなたのためにすべての仕事をするので、最初はかなり簡単でした。 は、しかし、今、私はだけスロットルの私の見解の一つと認証されたユーザーを区別し、「バースト」率を設定として aswellログインユーザー(例えば毎分5つのリクエスト)と「持続的な」レートに望んでいました(1日あたり100リクエスト)。djangoの1つのビューで2つのスロットルレートを設定する

これを達成するには、私は4スロットル・クラスを構築しました:

class SustainedAnon(AnonRateThrottle): 
    rate = '100/day' 

class BurstAnon(AnonRateThrottle): 
    rate = '6/minute' 

class SustainedUser(UserRateThrottle): 
    rate = '1000/day' 


class BurstUser(UserRateThrottle): 
    rate = '20/min' 

それはドキュメント(Django Throtte Docs)に応じて必要とされていないように私には全くsettings.pyを変更しませんでした。 私が編集したファイルだけが、私は私の統計クラスに次の行を追加した私のviews.pyた

class Statistics(APIView): 
    throttle_classes = (SustainedAnon, BurstAnon, SustainedUser, BurstUser) 

それはほとんど行うことになっているものを行います。 Statisticsクラスを抑制し、ログインしているユーザーと匿名ユーザーを別々に調整するだけです()。レートを正しく調整しません。 ログインしていないときは、3つのリクエストのうち6つのリクエストの後で、20の代わりに10のリクエストの後でログインすると、アプリケーションがスロットルを開始します。
すべてのスロットルクラスにcache-request-valueを設定するので、 (ログインしていないときは、SustainedAnonとBurstAnonと呼ばれる)。
しかし、なぜそれが起こっているのですか?そして、djangoに「スロットルを一度」と言うことができますか?

答えて

0

documentation状態:

APIは、同時に複数の場所でUserRateThrottlesを有することができます。 これを行うには、UserRateThrottleをオーバーライドし、 クラスごとに一意の「スコープ」を設定します。

これは、使用しているUserRateThrottleのそれぞれに異なるスコープを設定する必要があることを意味します。

これはAnonRateThrottleでも有効です。

+0

私はすでにそれを試してみましたが、うまく動作しますが、ONE Viewに2つのスコープを追加することはできないようです。 –

+0

もちろん可能です。 http://www.django-rest-framework.org/api-guide/throttling/#setting-the-throttling-policyでは、1つのビューに特定のスロットルを設定する方法を説明しています。 – Linovia

+0

ありがとうございました。 –

関連する問題