Recipes

Custom Rate limit domains

By default, all rate limits are applied on a per remote address basis. However, you can easily customize your rate limits to be based on any other characteristic of the incoming request. On a django settings level this can be achieved by settings the RATELIMIT_KEY_FUNCTION to either point to a callable or a fully qualified path to a callable. This callable should:

Using Django Class Views

If you are using a class based approach to defining view functions, the regular method of decorating a view function to apply a per route rate limit will not work. You can add rate limits to your views by using the following approach (also described in Decorating the class).

class MyView(django.views.generic):
    def get(self):
        return HttpResponse("get")

    def put(self):
        return HttpResponse("put")
urlpatterns = patterns('',
    (r'^myview/', limit("2/second")(MyView.as_view())),
)

Note

This approach is limited to either sharing the same rate limit for all http methods of a given django.views.generic.View or applying the declared rate limit independently for each http method (to accomplish this, pass in True to the per_method keyword argument to limit()).

Logging

djlimiter uses standard python logging. To enable logging, configure the djlimiter logger in your settings.py.:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'stream': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'djlimiter': {
            'handlers': ['stream'],
            'level': 'INFO',
            'propagate': True,
        },
    },
}

For more details about configuring django logging refer to Configuring logging