2014-11-05 11 views
5

Sto provando a creare la versione per l'applicazione REST. Ecco il mio URL examleDjango REST Framework: come aggiungere il prefisso nell'URL per il controllo delle versioni

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

Questa è la struttura del progetto

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

file principale per 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() 

Il mio problema è, quando ho utilizzando semplici url senza alcun prefisso, allora si sta lavorando

www.myapi.com/foo

e quando ho usato il prefisso di versione v1 o v2, quindi genera errore [Pagina no t ha trovato (404)]

www.myapi.com/v1/foo

Ho avuto questa idea da questo link https://stackoverflow.com/a/21839842/1558544

Se io non uso classe middleware poi è questo è possibile ottenere lo stesso risultato?

Grazie

+0

cosa succede se si posiziona il più esplicito pattern "^ v1" di "^" –

+0

Quindi entrambi non funzioneranno. Errore di ricerca non trovata (404) –

risposta

0

Django RESTO Framework non supporta URL spazi dei nomi ben, ma ci sono soluzioni per farli lavorare per la maggior parte dei casi.

Nel caso di serializzatori, è necessario definire tutti i campi come collegamento ipertestuale con un HyperlinkedRelatedField, tra cui il url campo che viene automaticamente aggiunta, che è un HyperlinkedIdentityField. Ciò include l'impostazione dell'argomento view_name in tutti i campi con il nome di visualizzazione corretto generato automaticamente. Questo dovrebbe essere qualcosa come [namespace]:[base_name]-detail.

Ma questo significa anche non è possibile utilizzare la pagina di indice DefaultRouter che viene generato dal DefaultRouter, in quanto non gestisce gli spazi dei nomi a tutti. Per ottenerne uno, sarà necessario crearne di propri o ignorare la visualizzazione generata automaticamente nel router.