2014-11-05 22 views
5

Próbuję utworzyć wersję aplikacji REST. Oto mój adres URL examleDjango REST Framework: Jak dodać prefiks w adresie URL do wersjonowania

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

To jest struktura projektu

├── __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 

główny plik dla 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() 

Mój problem jest, kiedy za pomocą prostego URL bez prefiksu to działa

www.myapi.com/foo

i kiedy użyłem przedrostka wersji v1 lub v2, to zgłasza błąd [Strona nr t znaleziono (404)]

www.myapi.com/v1/foo

Mam ten pomysł z tego linku https://stackoverflow.com/a/21839842/1558544

Jeśli nie używam klasy middleware następnie jest to możliwe, aby uzyskać ten sam wynik?

Dziękuję

+0

co się stanie, jeśli umieścisz bardziej wyraźny wzorzec "^ v1" przed '^' –

+0

Następnie oba nie będą działać.Pamięć nie znaleziono (404) błąd –

Odpowiedz

0

Django REST Framework nie obsługuje url Przestrzenie nazw studnię, ale istnieją rozwiązania dzięki czemu działa w większości przypadków.

W przypadku serializers, należy zdefiniować wszystkie pola, które są hiperłączami z HyperlinkedRelatedField, w tym polu url który jest dodawany automatycznie, co jest HyperlinkedIdentityField. Obejmuje to ustawienie argumentu view_name we wszystkich polach na poprawną, automatycznie wygenerowaną nazwę widoku. Powinno to być coś takiego jak [namespace]:[base_name]-detail.

Ale oznacza to również nie można użyć strony DefaultRouter indeksu, który jest generowany przez DefaultRouter, ponieważ nie obsługuje nazw w ogóle. Aby go zdobyć, musisz utworzyć własny lub zastąpić automatycznie wygenerowany widok na routerze.