8

I am trying to create version for REST application. Here is my URL Examle

www.myapi.com/foo [default version]
www.myapi.com/v1/foo [version one]

This is the project structure

├── __init__.py
├── settings.py
├── urls.py
├── default_app
│ ├── __init__.py
│ ├── serializer.py
│ ├── models.py
│ ├── views.py
│ ├── urls.py
│ 
└── v1_app
├── __init__.py
├── serializer.py
├── models.py
├── views.py
├── urls.py

default_app urls.py

from django.conf.urls import *
from default_app import views as df_views
from rest_framework import routers

router = routers.DefaultRouter()
router.register(r'foo', df_views.viewname, "foo")
urlpatterns = router.urls

v1_app urls.py

from django.conf.urls import *
from v1_app import views as ver_views
from rest_framework import routers

router = routers.DefaultRouter()
router.register(r'foo', ver_views.viewname, "foo")
urlpatterns = router.urls

main file for urls.py

from django.conf.urls import patterns, include, url
from defualt_app import urls as default_urls
from v1_app import urls as v1_urls
from django.contrib.staticfiles.urls import staticfiles_urlpatterns



urlpatterns += patterns('',
    url(r'^', include(default_urls, namespace="default")),
    url(r'^v1/', include(v1_urls, namespace="v1"))
)

urlpatterns += staticfiles_urlpatterns()

My issue is, when i using simple url without any prefix then it is working

www.myapi.com/foo

and when i used version prefix v1 or v2 then it throws error [Page not found (404)]

www.myapi.com/v1/foo

I got this idea from this link https://stackoverflow.com/a/21839842/1558544

If I don't use middleware class then is this possible to get same result?

Thank you

2
  • what happends if you place the more explicit '^v1' pattern infront of '^' Commented Nov 5, 2014 at 13:20
  • Then both are not going to work.Page not found (404) error Commented Nov 5, 2014 at 13:34

2 Answers 2

1

Django REST Framework does not support url namespaces well, but there are solutions to making them work for most cases.

In the case of serializers, you must define all fields that are hyperlinked with a HyperlinkedRelatedField, including the url field that is automatically added, which is a HyperlinkedIdentityField. This includes setting the view_name argument on all of the fields to the correct, automatically generated view name. This should be something like [namespace]:[base_name]-detail.

But this also means you cannot use the DefaultRouter index page that is generated by the DefaultRouter, as it does not handle namespaces at all. In order to get one, you are going to need to either create your own, or override the automatically generated view in the router.

Sign up to request clarification or add additional context in comments.

Comments

0

It can be done with include()

urlpatterns = [
    path('forgot-password/', ForgotPasswordFormView.as_view()),
    path('api/', include((router.urls, 'app_name'))),
]

https://www.django-rest-framework.org/api-guide/routers/#using-include-with-routers

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.