Skip to main content

A rule engine for Django apps.

Project description

A tool to manage logical rules throughout your application. Logical rules are more powerful than permission or rule tables because they are written in python. Register a rule once and work with it throughout your app, from templates to generic view mixins. Instead of cluttering your models with rule-style and permission-style methods define those rules in and then get easy access to them in your views and templates.


Use pip to install from PyPI:

pip install django-logical-rules

Add logical_rules to your file:


Additional Requirements

If you want to use the messaging features install Django messages framework.


Rules are defined in files within your apps. Here’s an example of a rule:

import logical_rules

def user_can_edit_mymodel(object, user):
                Confirms a user can edit a specific model
                ...owners only!
        return object.owner == user"user_can_edit_mymodel", user_can_edit_mymodel)

To include your models in the registry you will need to do run the autodiscover, a bit like django.contrib.admin (I generally put this in

import logical_rules


Template Tag

Once you have created a rule, it’s easy to use anywhere in your templates:

{% load logical_rules_tags %}
{% testrule user_can_edit_mymodel object request.user %}
        <p>You are the owner!</p>
{% endtestrule %}

Note: Don’t use quotes around the rule name in the template.


If you are extending Django’s class-based generic views, you might find this mixin useful. It allows you to define rules that should be applied before rendering a view. Here’s an example usage:

class MyView(RulesMixin, DetailView):

   def update_logical_rules(self):
      super(MyView, self).update_logical_rules()
         'name': 'user_can_edit_mymodel',
         'param_callbacks': [
            ('object', 'get_object'),
            ('user', 'get_request_user')

param_callbacks are our technique for getting the parameters for your rule. These are assumed to be methods on your class. get_request_user() is defined in RuleMixin since it’s so common. get_object() is a method on the DetailView class.

Rule dictionaries can have other properties, like redirect_url and response_callback. If redirect_url is defined, then the view will return an HttpResponseRedirect to that URL. If response_callback is defined, then the view will return the result of that method.

Messaging integration is possible with message and message_level options.

Finally, we’ve added two commonly used rules. As an optional substitute for login_required, we have user_is_authenticated and to test a generic expression, we have evaluate_expression.

Direct Calling

import logical_rules
if['name'], arg1, arg2):
        print "passed"
        print "failed"


Think this needs something else? To contribute to django-logical-rules create a fork on Bitbucket. Clone your fork, make some changes, and submit a pull request.

Bugs are great contributions too! Feel free to add an issue on Bitbucket:

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for django-logical-rules, version 1.0
Filename, size File type Python version Upload date Hashes
Filename, size django-logical-rules-1.0.tar.gz (9.7 kB) File type Source Python version None Upload date Hashes View

Supported by

Pingdom Pingdom Monitoring Google Google Object Storage and Download Analytics Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page