{"library":"rules","title":"Django Rules for Authorization","description":"Rules provides an awesome, simple, and powerful authorization solution for Django applications, without relying on database configuration. It allows defining permissions as Python callables (predicates) and integrating them seamlessly into views, templates, and Django REST Framework. The current version is 3.5, and it maintains a steady release cadence, typically aligning with new Django versions.","language":"python","status":"active","last_verified":"Sat May 16","install":{"commands":["pip install rules"],"cli":null},"imports":["from rules import rule","from rules import Predicate","from rules.permissions import is_authenticated","from rules.contrib.views import PermissionsRequiredMixin","from rules.contrib.rest_framework import AutoPermissionViewSetMixin"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import rules\nfrom rules import Predicate\nfrom django.conf import settings\nfrom django.apps import apps\nfrom django.http import HttpResponse\nfrom django.views.generic import View\n\nsettings.configure(\n    INSTALLED_APPS=['django.contrib.auth', 'django.contrib.contenttypes', 'rules'],\n    SECRET_KEY='a-very-secret-key',\n    TEMPLATES=[{'BACKEND': 'django.template.backends.django.DjangoTemplates', 'OPTIONS': {'string_if_invalid': 'INVALID'}}],\n    DEBUG=True\n)\napps.populate(settings.INSTALLED_APPS)\n\n# 1. Define a simple predicate\nis_staff = Predicate(lambda u: u.is_staff)\n\n# 2. Add the rule with a name\nrules.add_rule('can_access_staff_area', is_staff)\n\n# 3. Use it in a Django View\nfrom rules.contrib.views import PermissionsRequiredMixin\nfrom django.contrib.auth.models import User\n\nclass StaffAreaView(PermissionsRequiredMixin, View):\n    permission_required = 'can_access_staff_area'\n\n    def get(self, request):\n        return HttpResponse(\"Welcome, staff member!\")\n\n# Example of creating a mock user and checking permission (for demonstration)\nmock_user_staff = User(username='staffuser', is_staff=True)\nmock_user_non_staff = User(username='regularuser', is_staff=False)\n\n# This would typically happen inside a request context\ncan_access_staff_true = rules.test_rule('can_access_staff_area', mock_user_staff)\ncan_access_staff_false = rules.test_rule('can_access_staff_area', mock_user_non_staff)\n\nassert can_access_staff_true is True\nassert can_access_staff_false is False\n\nprint(f\"Staff user can access staff area: {can_access_staff_true}\")\nprint(f\"Regular user can access staff area: {can_access_staff_false}\")\n","lang":"python","description":"This quickstart demonstrates defining a simple permission predicate, adding it as a named rule, and using the `PermissionsRequiredMixin` in a Django class-based view. It also shows how to manually test a rule.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-16","installed_version":"3.5","pypi_latest":"3.5","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":1.6,"avg_import_s":null,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"rules","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"17.9M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"rules","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":1.5,"import_time_s":null,"mem_mb":null,"disk_size":"18M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"rules","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"19.8M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"rules","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":1.6,"import_time_s":null,"mem_mb":null,"disk_size":"20M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"rules","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"11.7M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"rules","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":1.5,"import_time_s":null,"mem_mb":null,"disk_size":"12M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"rules","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"11.4M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"rules","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":1.5,"import_time_s":null,"mem_mb":null,"disk_size":"12M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"rules","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"17.4M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"rules","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":1.8,"import_time_s":null,"mem_mb":null,"disk_size":"18M"}]}}