Skip to content

Routing

Django API Router provides decorator based routing system build on top Django of URL dispatcher.

APIRouter class

project/urls.py

from apirouter import APIRouter

router = APIRouter()

urls = router.urls

router.urls converts APIRouter routes to Django URLPattern list.

Function-based views

Here's simple function view that returns plain text based on HTTP method.

from apirouter import APIRouter, Response, Request

router = APIRouter()


@router.route("/items")
def items(request: Request):
    if request.method == "POST":
        return Response("Create item")
    return Response("Get items")

Or simple function view that accepts only particular request methods.

from apirouter import APIRouter, Response, Request

router = APIRouter()


@router.route("/items/clear", methods=["DELETE"])
def items_create(request: Request):
    return Response("Delete items")

method argument supports GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS, TRACE HTTP methods.

Class-based views

Here is simple class-based view that accepts only particular request methods.

from django.views import View

from apirouter import APIRouter, JsonResponse, Request

router = APIRouter()


@router.view("/items")
class ItemsView(View):
    def get(self, request: Request):
        return JsonResponse([{"id": 1}, {"id": 2}])

    def post(self, request: Request):
        return JsonResponse({"id": 3})

Named routes

In order to perform URL reversing, you’ll need to use named routes.

from django.views import View

from apirouter import APIRouter, Request, Response

router = APIRouter(name="root")


@router.route("/route1", name="route1")
def route1(request: Request):
    return Response("This is route1")


@router.view("/route2", name="route2")
class Route2View(View):
    def get(self, request: Request):
        return Response("This is route2")

Now you can perform URL reversing with Django reverse function:

from django.urls import reverse

reverse("root:route1")  # returns /route1
reverse("root:route2")  # returns /route2

Sub routers

Django API Router supports sub routing by including other routers.

from apirouter import APIRouter, Request, Response

users_router = APIRouter(name="users")


@users_router.route("/", name="list")
def users_list(request: Request):
    return Response("Get users")


accounts_router = APIRouter(name="accounts")


@accounts_router.route("/", name="list")
def accounts_list(request: Request):
    return Response("Get account")


@accounts_router.route("/<int:account_id>", name="detail")
def accounts_detail(request: Request, account_id: int):
    return Response("Get account details")


root = APIRouter(name="root")
root.include_router(users_router, prefix="/users/")
root.include_router(accounts_router, prefix="/accounts/")


urlpatterns = root.urls

It is also possible to perform URL reversing from sub routes.

from django.urls import reverse

reverse("root:users:list")  # returns /users/
reverse("root:accounts:list")  # returns /accounts/
reverse("root:accounts:detail", kwargs={"account_id": "100"})  # returns /accounts/100/

Path helper

You can also add Django compatible path URL patters using router .path(route, view, kwargs=None, name=None) method.

from apirouter import APIRouter, Request, Response


def index(request: Request):
    return Response("Router view")


router = APIRouter()


urlpatterns = [router.path("", index, name="index")]