czehik / django-ab

A simple AB Testing app for Django!

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool


Create simple A/B tests in Django by dynamically switching templates. Records unique hits and conversions to tests.


  1. Update your

    # Add `ab` to `INSTALLED_APPS`
    # Add `ab.middleware.ABMiddleware` to `MIDDLEWARE_CLASSES`
    # Add `ab.loaders.load_template_source` as your _FIRST_ `TEMPLATE_LOADERS`.
  2. Run python sync_db to create the testing tables.

  3. Create some tests in the Django admin (or like this from the command line)!

    from ab.models import Experiment, Test
    # Create an Experiment who's Goal is to get to the signup page!
    exp = Experiment.objects.create(name="Homepage Test", template_name="index.html", goal="/signup/")
    # Create three variations of the homepage.
    # One Test for the original template
    # Two variations
    Test.objects.create(template_name="index_1.html", experiment=exp)
    Test.objects.create(template_name="index_2.html", experiment=exp)
  4. Profit.


  1. Manually run an A/B test on a view:

    def view(request, template_name="original.html"):

           ab_template_name =
       except TemplateDoesNotExist:
           ab_template_name = template_name
       return render_to_response(template_name)


Decide ahead of time what you are A/B testing - introductions of new designs are a great time to run your first test. Plan ahead of time and duplicate your templates / css / js / images so you don't have to hunt through version control to find the right ones later.


  1. The current implementation uses a thread locals to stash the request object for use in places it isn't normally available.

  2. The current implementation is not compatible with Django's built in caching.

  3. The current implementation requires you to use Django Sessions.


  1. Add A/B aware CacheMiddleware
  2. Rethink ab.abs.AB interface.
  3. De-couple AB from request/session object? Would be interesting to run it on e-mails etc.
  4. Add a way to force the display of specific templates (for designers etc.)
  5. What if a browser has disabled cookies? What's the fallback?
  6. Add some way to ignore hits and conversions (eg. internal/logged in etc.)
  7. Expanded conversion maybe to a regex? or something else that account for variations of pages
ezoic increase your site revenue


A simple AB Testing app for Django!


Language:Python 99.5%Language:HTML 0.5%