2014-11-05 15 views
5

Ich versuche, Version für REST-Anwendung zu erstellen. Hier ist meine URL examleDjango REST Framework: So fügen Sie Präfix in URL für Versionierung hinzu

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

Dies ist die Projektstruktur

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

Hauptdatei für 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() 

Mein Problem ist, wenn ich ohne Präfix einfache URL dann funktioniert es

www.myapi.com/foo

und wenn ich Version Prefix v1 oder v2 verwendet dann wirft es Fehler [Seite Nr t gefunden (404)]

www.myapi.com/v1/foo

ich von diesem Link, um diese Idee https://stackoverflow.com/a/21839842/1558544

Wenn ich Middleware-Klasse nicht dann verwenden ist Dies ist möglich, um das gleiche Ergebnis zu erhalten?

Danke

+0

was passiert, wenn Sie das explizite '^ v1' Muster vor '^' –

+0

platzieren Dann werden beide nicht arbeiten.Page nicht gefunden (404) -Fehler –

Antwort

0

Django REST-Framework nicht url Namespaces gut, aber es gibt Lösungen, so dass sie für den meisten Fällen funktionieren nicht unterstützt.

Im Falle Serializer, müssen Sie alle Felder definieren, die mit einem HyperlinkedRelatedField, einschließlich der url Feld mittels Hyperlink verwiesen wird, die automatisch hinzugefügt wird, die ein HyperlinkedIdentityField ist. Dazu gehört das Setzen des Arguments view_name für alle Felder auf den korrekten, automatisch generierten Ansichtsnamen. Dies sollte etwas wie [namespace]:[base_name]-detail sein.

Das bedeutet aber auch Sie die DefaultRouter Indexseite verwenden können, die durch die DefaultRouter erzeugt wird, wie es überhaupt nicht Namespaces behandeln. Um einen zu erhalten, müssen Sie entweder Ihren eigenen erstellen oder die automatisch generierte Ansicht im Router überschreiben.