Да как - создаете
middleware. В нем берете из заголовка запроса ip-адрес (для этого предварительно настраиваете ваш веб-сервер чтобы он добавлял нужный заголовок).
Далее выполняете примерно такой код:
count = cache.get_or_set(f'ip:{ip_address}', 0, <нужное количество секунд>)
count += 1
if count > <допустимое количество попыток>:
raise Exception('Давай, - до свидания')
else:
cache.set(f'ip:{ip_address}', count, <нужное количество секунд>)
Ну а правильнее всего - реализовать эту логику на стороне веб-сервера. Он такое, как правило - умеет сам делать. И не нагружать дополнительной нагрузкой вашу миддлварь...