Dry Rest Permissions
raw JSON → 0.1.10 verified Fri May 01 auth: no python maintenance
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.
pip install dry-rest-permissions Common errors
error ImportError: cannot import name 'DRYPermissions' from 'dry_rest_permissions' ↓
cause Incorrect import path; DRYPermissions is in the 'generics' submodule.
fix
Use: from dry_rest_permissions.generics import DRYPermissions
error AttributeError: 'MyModel' object has no attribute 'DRYMeta' ↓
cause Model lacks DRYMeta inner class required for permissions.
fix
Add a DRYMeta class to your model with read_permissions and write_permissions methods.
Warnings
breaking DRYPermissions requires explicit permissions defined on model class; if no DRYMeta with permissions is defined, all requests are denied. ↓
fix Define a DRYMeta inner class on your model with read_permissions and write_permissions callable.
gotcha The 'request.user' is not automatically available in permissions callables; you must pass it explicitly via the kwargs. ↓
fix Use signature: def permission_function(user, obj=None): ... and DRYPermissions will pass request.user.
deprecated The 'dry_rest_permissions.generics.DRYGlobalPermissions' class behavior may change in future releases; prefer using DRYPermissions with global permission logic. ↓
fix Use DRYPermissions and implement global check in write_permissions/read_permissions with obj=None.
Imports
- DRYPermissions wrong
from dry_rest_permissions import DRYPermissionscorrectfrom dry_rest_permissions.generics import DRYPermissions - DRYPager
from dry_rest_permissions.paginators import DRYPager - DRYGlobalPermissions
from dry_rest_permissions.generics import DRYGlobalPermissions
Quickstart
from rest_framework import viewsets
from myapp.models import MyModel
from myapp.serializers import MyModelSerializer
from dry_rest_permissions.generics import DRYPermissions
class MyModelViewSet(viewsets.ModelViewSet):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
permission_classes = (DRYPermissions,)