Django Tempus provides url tokens that triggers custom actions
Switch branches/tags
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.

Django Tempus

Build Status Pypi Package Downloads


Django Tempus provides url tokens that triggers custom actions.

The flow is:

  1. The user requests an url with a token.
  2. A middleware decrypt that token and triggers an action.
  3. Profit.


Install using pip, including any optional packages you want...

$ pip install django-tempus

...or clone the project from github.

$ git clone git@juanriaza/django-tempus.git
$ cd django-tempus
$ pip install -r requirements.txt

How to use it?

It provides a base middleware, and a template tag. With your own middleware you define the action that is triggered and with the templatetag you create the tokenized urls. The token data is available at request.tempus.

from tempus.middleware import BaseTempusMiddleware

class YourMiddleware(BaseTempusMiddleware):
    param_name = 'tempus'  # you can override the param name
    max_age = None  # you can provide an expiry date (in seconds)

    def success_func(self, request):
        # perform any action before reaching the view

    def expired_func(self, request):
        # maybe redirect to another url

Create tokenized urls with the template tag:

{% url 'for_something' %}{% tempus {'my_data': 'my_value'} param_name='custom_param' %}


We own the Awesome Shop where you can find the finest rockets…


Rockets are pricey… and every single cool pony out there wants one.

We want to boost our sales and we offer a one day discount and mail it to those cute ponies.

Let's go!

from tempus.middleware import BaseTempusMiddleware

class RocketDiscountMiddleware(BaseTempusMiddleware):
    param_name = 'rocket_promo'
    max_age = 86400  # 24h

We need to add the RocketDiscountMiddleware to MIDDLEWARE_CLASSES at


And get the discount:

def rocket_view(request, rocket_model):
	rocket_price = Rocket.objects.get(model=rocket_model).price
	discount = request.tempus.get('discount', 0)
	rocket_price -= discount
	return render('awesome/template.html', {'price': rocket_price})

We're done.

Now we can send special tokenized urls with the discount to our beloved ponies

{% load tempus_tag %}

Hi {{ pony_name }},

Just because you rock we offer you a discount on our ultimate X-ROCKET 3K.

{% url 'rocket_url' %}{% tempus {'discount': 500} param_name='rocket_promo' %}


Contrib Packages

Automatic Login

Add the tempus.contrib.auto_login.middleware.AutoLoginMiddleware to MIDDLEWARE_CLASSES at


Now we can send emails with urls that logs the user in.

{% load tempus_tag %}

Hi {{ pony_name }},

Check your direct messages from {{ another_pony }}.

{% url 'direct_messages' %}{% tempus %}

Running the tests

To run the tests against the current environment:

$ test tempus --settings=tempus.tests.settings



20th May 2014

  • Return any type of HttpResponse value from a handler.


18th May 2014

  • Added a unsuccess_func handler.


18th Dec 2013

  • Check if success_func/expired_func returns a HttpResponseRedirect value.


7th Dec 2013

  • Add support for multiple chained middlewares.
  • Fix template tag import error.


1st Dec 2013

  • Add request.tempus.
  • Automatic Login now just takes the user pk.


27th Apr 2013

  • Add compression by default.


17th Feb 2013

  • First release.