'How can I make a trailing slash optional on a Django Rest Framework SimpleRouter
The docs say you can set trailing_slash=False but how can you allow both endpoints to work, with or without a trailing slash?
Solution 1:[1]
You can also override this setting by passing a trailing_slash argument to the SimpleRouter constructor as follows:
from rest_framework import routers
router = routers.SimpleRouter(trailing_slash=False)
Solution 2:[2]
If you're using DRF's routers and viewsets, you can include /? in your prefix.
from rest_framework import routers
from .views import ClientViewSet
router = routers.SimpleRouter(trailing_slash=False)
router.register(r"clients/?", ClientViewSet)
Solution 3:[3]
I found the easiest way to do this is just to set up your URLs individually to handle the optional trailing slash, e.g.
from django.urls import re_path
urlpatterns = [
re_path('api/end-point/?$', api.endPointView),
...
Not a DRY solution, but then it's only an extra two characters for each URL. And it doesn't involve overriding the router.
Solution 4:[4]
For anyone using rest_framework_extensions with ExtendedSimpleRouter, the accepted solution needs a small modification. The self.trailling_slash has to be after the super() like this.
from rest_framework_extensions.routers import ExtendedSimpleRouter
class OptionalSlashRouter(ExtendedSimpleRouter):
def __init__(self):
super(ExtendedSimpleRouter, self).__init__()
self.trailing_slash = "/?"
Solution 5:[5]
For the DefaultRouter class, it's the same as Ryan Allen's answer:
from rest_framework.routers import DefaultRouter
class OptionalSlashRouter(DefaultRouter):
"""Make all trailing slashes optional in the URLs used by the viewsets
"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.trailing_slash = '/?'
router = OptionalSlashRouter()
...
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | dill |
| Solution 2 | Noel Llevares |
| Solution 3 | gornvix |
| Solution 4 | Cedric Holz |
| Solution 5 | Brian Sidebotham |
