{"id":23639,"library":"dry-rest-permissions","title":"Dry Rest Permissions","description":"Rules-based permissions for Django REST Framework, enabling complex permission logic through a declarative, rule-based approach. Current version 0.1.10, released Jun 15, 2020. Low release cadence, maintained as of latest commit Aug 2022.","status":"maintenance","version":"0.1.10","language":"python","source_language":"en","source_url":"https://github.com/Helioscene/dry-rest-permissions","tags":["django","django-rest-framework","permissions","authorization"],"install":[{"cmd":"pip install dry-rest-permissions","lang":"bash","label":"Install via pip"}],"dependencies":[{"reason":"Framework dependency","package":"django","optional":false},{"reason":"Required for DRF integration","package":"djangorestframework","optional":false}],"imports":[{"note":"Import path must include 'generics' submodule","wrong":"from dry_rest_permissions import DRYPermissions","symbol":"DRYPermissions","correct":"from dry_rest_permissions.generics import DRYPermissions"},{"note":"Pagination mixin is in paginators module","wrong":"","symbol":"DRYPager","correct":"from dry_rest_permissions.paginators import DRYPager"},{"note":"For global permission checks","wrong":"","symbol":"DRYGlobalPermissions","correct":"from dry_rest_permissions.generics import DRYGlobalPermissions"}],"quickstart":{"code":"from rest_framework import viewsets\nfrom myapp.models import MyModel\nfrom myapp.serializers import MyModelSerializer\nfrom dry_rest_permissions.generics import DRYPermissions\n\nclass MyModelViewSet(viewsets.ModelViewSet):\n    queryset = MyModel.objects.all()\n    serializer_class = MyModelSerializer\n    permission_classes = (DRYPermissions,)\n","lang":"python","description":"Apply DRYPermissions to a viewset. Define permissions via 'read_permissions' and 'write_permissions' on model's DRYMeta class."},"warnings":[{"fix":"Define a DRYMeta inner class on your model with read_permissions and write_permissions callable.","message":"DRYPermissions requires explicit permissions defined on model class; if no DRYMeta with permissions is defined, all requests are denied.","severity":"breaking","affected_versions":"all"},{"fix":"Use signature: def permission_function(user, obj=None): ... and DRYPermissions will pass request.user.","message":"The 'request.user' is not automatically available in permissions callables; you must pass it explicitly via the kwargs.","severity":"gotcha","affected_versions":"0.1.0+"},{"fix":"Use DRYPermissions and implement global check in write_permissions/read_permissions with obj=None.","message":"The 'dry_rest_permissions.generics.DRYGlobalPermissions' class behavior may change in future releases; prefer using DRYPermissions with global permission logic.","severity":"deprecated","affected_versions":"<=0.1.10"}],"env_vars":null,"last_verified":"2026-05-01T00:00:00.000Z","next_check":"2026-07-30T00:00:00.000Z","problems":[{"fix":"Use: from dry_rest_permissions.generics import DRYPermissions","cause":"Incorrect import path; DRYPermissions is in the 'generics' submodule.","error":"ImportError: cannot import name 'DRYPermissions' from 'dry_rest_permissions'"},{"fix":"Add a DRYMeta class to your model with read_permissions and write_permissions methods.","cause":"Model lacks DRYMeta inner class required for permissions.","error":"AttributeError: 'MyModel' object has no attribute 'DRYMeta'"}],"ecosystem":"pypi","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}