Giter VIP home page Giter VIP logo

drf-problems's Introduction

DRF Problems PyPI version Codacy Badge Downloads HitCount

TL;DR

This library implements RFC 7807 in our favorite Django REST Framework! Or, in layman terms, it introduces "Problem Details" in the HTTP APIs.

Table of Contents

Features

  • Handles exception to return response with Problem Details model.
  • Added permission mixins and base class to store exception to raise by the view on failure of permission.
  • Added view mixin which throws exception of failed permission.
  • These permissions are compatible with composable permissions introduced in DRF 3.9.0!
  • Has problem description endpoint to understand about the problem with the given code.
  • Has sample permissions which checks for minimum API version.

Pre-Requisites

  • Django >= 2.0 (Tested with 2.2)
  • djangorestframework >= 3.0.0 (Tested with 3.9.0)

Installation

Install the library as you would for any django library.

  • Install using pip. pip install drf-problems
  • Add 'drf_problems' to your INSTALLED_APPS setting.
INSTALLED_APPS = (
    ...
    'drf_problems',
)
  • DRF's default exception handler needs to be replaced. In your settings.py, update:
REST_FRAMEWORK = {
    ...
    'EXCEPTION_HANDLER': 'drf_problems.exceptions.exception_handler',
  • To use the problem description url, you need to update your urls.py:
urlpatterns = [
    ...
    path('', include('drf_problems.urls'))
]

Usage

With exceptions

In your exception class, define default_code with the error code string which is used in the type URI. To set custom title, define title with the human-readable summary of the problem type. To set description, define description with a long paragraph describing the problem.

Finally, make sure to register your exception with drf_problems.utils.register_exception function or drf_problems.utils.register decorator. Here's a sample exception class:

from drf_problems.utils import register_exception, register

@register # Either use this decorator
class InvalidVersionRequestedException(exceptions.NotAcceptable):
    default_code = 'invalid_version'
    title = 'Invalid API version'
    default_detail = 'Provided API version is invalid.')
    description = 'Malformed or unsupported version string is provided with the request.'

register_exception(InvalidVersionRequestedException) # Or this method directly.

With permissions

Use either drf_problems.permissions.ProblemPermissionMixin mixin class with your existing permissions, or extend directly from drf_problems.permissions.BaseProblemPermission. Define exception_class in the permissions to the desired exception class. For flexibility, you can even set exception instance by setting exception attribute on the permission object.

Here's a sample permissions class:

from drf_problems.permissions import BaseProblemPermission

class MinimumVersionRequiredPermission(BaseProblemPermission):
    exception_class = InvalidVersionRequestedException

With Views

Note: The permissions wouldn't throw the desired exception from the view, until the view is extended from the drf_problems.mixins.AllowPermissionWithExceptionViewMixin mixin. So, remember to update your views too, for which permissions are updated!

Resources

Roadmap

  • Add tests with some sample views using exceptions and permissions.
  • Document the code better.

Contributing

Contributions are very welcome, of any kind - whether finding new issues or any ideas for enhancements or a pull request.

drf-problems's People

Contributors

shivanshs9 avatar goatwu1993 avatar matmoxam avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.