{"library":"pycasbin","title":"PyCasbin","description":"PyCasbin is a powerful and efficient open-source authorization library for Python projects (currently v2.8.0). It supports enforcing access control based on various models like ACL, RBAC, and ABAC. The library is actively maintained with frequent updates and aims for feature parity across its different language implementations.","language":"python","status":"active","last_verified":"Fri May 15","install":{"commands":["pip install pycasbin"],"cli":{"name":"casbin","version":"sh: 1: casbin: not found"}},"imports":["import casbin\nenforcer = casbin.Enforcer(...)","from casbin import SyncedEnforcer","from casbin.enforcer import Enforcer as AsyncEnforcer\n# or\nfrom casbin.enforcer import AsyncEnforcer # if using direct import and not renaming"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import casbin\nimport os\n\n# Create dummy model and policy files for the example\nwith open('model.conf', 'w') as f:\n    f.write('''\n[request_definition]\nr = sub, obj, act\n\n[policy_definition]\np = sub, obj, act\n\n[policy_effect]\ne = some(where (p.eft == allow))\n\n[matchers]\nm = r.sub == p.sub && r.obj == p.obj && r.act == p.act\n''')\n\nwith open('policy.csv', 'w') as f:\n    f.write('''\np, alice, data1, read\np, bob, data2, write\np, data2_admin, data2, *\n''')\n\nasync def run_enforcer():\n    # Initialize an enforcer with a model file and a policy file\n    # For real applications, use an adapter (e.g., casbin_sqlalchemy_adapter)\n    e = casbin.Enforcer('model.conf', 'policy.csv')\n\n    # Test if 'alice' can 'read' 'data1'\n    if await e.enforce('alice', 'data1', 'read'):\n        print(\"Alice CAN read data1\")\n    else:\n        print(\"Alice CANNOT read data1\")\n\n    # Test if 'bob' can 'read' 'data2'\n    if await e.enforce('bob', 'data2', 'read'):\n        print(\"Bob CAN read data2\")\n    else:\n        print(\"Bob CANNOT read data2\")\n\n    # Test if 'bob' can 'write' 'data2'\n    if await e.enforce('bob', 'data2', 'write'):\n        print(\"Bob CAN write data2\")\n    else:\n        print(\"Bob CANNOT write data2\")\n\n    # Add a policy dynamically\n    await e.add_policy('cathy', 'data3', 'read')\n    if await e.enforce('cathy', 'data3', 'read'):\n        print(\"Cathy CAN read data3 (after adding policy)\")\n\n    # Remove temporary files\n    os.remove('model.conf')\n    os.remove('policy.csv')\n\nif __name__ == '__main__':\n    import asyncio\n    asyncio.run(run_enforcer())","lang":"python","description":"This quickstart demonstrates how to initialize `casbin.Enforcer` with a model (`.conf`) and policy (`.csv`) file, and then use the `enforce()` method to check permissions. It also shows a dynamic policy addition. Note the use of `asyncio.run` as the `enforce` method is asynchronous.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-15","installed_version":"2.8.0","pypi_latest":"2.8.0","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":1.9,"avg_import_s":0.18,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pycasbin","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.14,"mem_mb":4.2,"disk_size":"21.8M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pycasbin","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.8,"import_time_s":0.1,"mem_mb":4.2,"disk_size":"22M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pycasbin","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.25,"mem_mb":4.9,"disk_size":"24.5M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pycasbin","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2,"import_time_s":0.21,"mem_mb":4.9,"disk_size":"25M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pycasbin","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.21,"mem_mb":4.8,"disk_size":"16.1M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pycasbin","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.8,"import_time_s":0.2,"mem_mb":4.8,"disk_size":"17M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pycasbin","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.19,"mem_mb":5.2,"disk_size":"15.9M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pycasbin","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.8,"import_time_s":0.19,"mem_mb":5.2,"disk_size":"16M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pycasbin","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.14,"mem_mb":4.2,"disk_size":"21.3M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pycasbin","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.2,"import_time_s":0.14,"mem_mb":4.2,"disk_size":"22M"}]}}