Overview

Django Timelimit

Django-timelimit allows you to wrap sections of Django templates with a timeout to enforce an upper bound on render time. When the templates exceeds this time, an alternative fragment is rendered instead:

{% load timelimit %}

{% timelimit 0.05 %}
  {# perform a potentially very slow operation #}
  <p>No timeout occurred</p>
  {% sleep 0.5 %}
{% else %}
  <p>Sorry, couldn't render the fragment in time.</p>
{% endtimelimit %}

Installation

$ pip install django-timelimit

Reentrant

Django-timelimit is fully reentrant, which means that you can have nested timeouts:

{% load timelimit %}

{% timelimit 0.10 %}
  {# perform a potentially very slow operation #}

    {% timelimit 0.05 %}
      {# perform another potentially slow operation #}
    {% else %}
      <p>Sorry, couldn't render the nested fragment in time.</p>
    {% endtimelimit %}

  <p>No timeout occurred</p>
{% else %}
  <p>Sorry, couldn't render the fragment in time.</p>
{% endtimelimit %}

Nested timeouts allow a large outer timeout to contain smaller timeouts. If the inner timeout is larger than the outer timeout, it is treated as a no-op.

Quotas

Interruptingcow quotas (introduced in interruptingcow 0.7) are supported too, allowing you to share a single allocation of time between different timelimit tags:

{% load timelimit %}

{% for foo in bar %}
  {% timelimit quota_var %}
    ...
  {% else %}
    ...
  {% endtimelimit %}
{% endif %}

This is useful in loops where you do not want the total render time to go up with the number of iterations of the loop.

Caveats

Django-timelimit is based on interruptingcow and so it shares its limitations. Interruptingcow uses signal(SIGALRM) to let the operating system interrupt program execution, meaning:

  1. Python signal handlers only apply to the main thread, so you cannot use this from other threads (this also means you cannot use this in a multithreaded webserver, or even ones that use a background thread for request handling (Gunicorn works great).
  2. You must not use this in a program that uses SIGALRM itself (this includes certain profilers)
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.