From 0a8b09a11a7d9ce437e52a5d24a755fce3033d52 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 23 Mar 2020 13:58:45 -0400 Subject: [PATCH] Add docs for plugin API endpoints --- .../plugins/plugin_rest_api_endpoint.png | Bin 0 -> 30034 bytes docs/plugins/development.md | 47 ++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 docs/media/plugins/plugin_rest_api_endpoint.png diff --git a/docs/media/plugins/plugin_rest_api_endpoint.png b/docs/media/plugins/plugin_rest_api_endpoint.png new file mode 100644 index 0000000000000000000000000000000000000000..7cdf34cc85b20184e3276dbbdb458138c6c225f2 GIT binary patch literal 30034 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 literal 0 HcmV?d00001 diff --git a/docs/plugins/development.md b/docs/plugins/development.md index 584e00cae..0f82f0dff 100644 --- a/docs/plugins/development.md +++ b/docs/plugins/development.md @@ -194,3 +194,50 @@ urlpatterns = [ ``` This makes our view accessible at the URL `/plugins/animal-sounds/random-sound/`. (Remember, our `AnimalSoundsConfig` class sets our plugin's base URL to `animal-sounds`.) Viewing this URL should show the base NetBox template with our custom content inside it. + +## REST API Endpoints + +Plugins can declare custom endpoints on NetBox's REST API. These behave very similarly to views, except that instead of rendering arbitrary content using a template, data is returned in JSON format using a serializer. NetBox uses the [Django REST Framework](https://www.django-rest-framework.org/), which makes writing API serializers and views very simple. + +First, we'll create a serializer for our `Animal` model, in `api/serializers.py`: + +```python +from rest_framework.serializers import ModelSerializer +from netbox_animal_sounds.models import Animal + +class AnimalSerializer(ModelSerializer): + + class Meta: + model = Animal + fields = ('id', 'name', 'sound') +``` + +Next, we'll create a generic API viewset that allows basic CRUD (create, read, update, and delete) operations for Animal instances. This is defined in `api/views.py`: + +```python +from rest_framework.viewsets import ModelViewSet +from netbox_animal_sounds.models import Animal +from .serializers import AnimalSerializer + +class AnimalViewSet(ModelViewSet): + queryset = Animal.objects.all() + serializer_class = AnimalSerializer +``` + +Finally, we'll register a URL for our endpoint in `api/urls.py`. This file **must** define a variable named `urlpatterns`. + +```python +from rest_framework import routers +from .views import AnimalViewSet + +router = routers.DefaultRouter() +router.register('animals', AnimalViewSet) +urlpatterns = router.urls +``` + +With these three components in place, we can request `/api/plugins/animal-sounds/animals/` to retrieve a list of all Animal objects defined. + +![NetBox REST API plugin endpoint](../media/plugins/plugin_rest_api_endpoint.png) + +!!! note + This example is provided as a minimal reference implementation only. It does not address authentication, performance, or myriad other concerns that plugin authors should have.