2015-01-20 13 views
6

Sto provando a fare l'autenticazione usando Django Rest Framework ma non riesco ad accedere tramite il pannello DRF. Quando cerco di arrivare alla pagina di login specificandou'rest_framework 'non è uno spazio dei nomi registrato

/api/api-auth/login/

NoReverseMatch at /api/api-auth/login/ 
u'rest_framework' is not a registered namespace 
Request Method: GET 
Request URL: http://127.0.0.1:8000/api/api-auth/login/ 
Django Version: 1.7.1 
Exception Type: NoReverseMatch 
Exception Value:  
u'rest_framework' is not a registered namespace 
Exception Location: /home/shivani/aubergine_cubii/test_rest_api2/forked_rest_api/venv/local/lib/python2.7/site-packages/django/core/urlresolvers.py in reverse, line 547 
Python Executable: /home/shivani/aubergine_cubii/test_rest_api2/forked_rest_api/venv/bin/python 
Python Version: 2.7.8 
Python Path:  
['/home/shivani/aubergine_cubii/test_rest_api2/forked_rest_api', 
'/home/shivani/aubergine_cubii/test_rest_api2/forked_rest_api/venv/lib/python2.7', 
'/home/shivani/aubergine_cubii/test_rest_api2/forked_rest_api/venv/lib/python2.7/plat-x86_64-linux-gnu', 
'/home/shivani/aubergine_cubii/test_rest_api2/forked_rest_api/venv/lib/python2.7/lib-tk', 
'/home/shivani/aubergine_cubii/test_rest_api2/forked_rest_api/venv/lib/python2.7/lib-old', 
'/home/shivani/aubergine_cubii/test_rest_api2/forked_rest_api/venv/lib/python2.7/lib-dynload', 
'/usr/lib/python2.7', 
'/usr/lib/python2.7/plat-x86_64-linux-gnu', 
'/usr/lib/python2.7/lib-tk', 
'/home/shivani/aubergine_cubii/test_rest_api2/forked_rest_api/venv/local/lib/python2.7/site-packages', 
'/home/shivani/aubergine_cubii/test_rest_api2/forked_rest_api/venv/lib/python2.7/site-packages'] 
Server time: Tue, 20 Jan 2015 10:52:13 +0000 

urls.py

urlpatterns = patterns(
    '', 
    url(r'^api/', include('api.urls', namespace='api')), 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^oauth2/', include('oauth2_provider.urls', 
          namespace='oauth2_provider')) 
) 

API/URL. py:

urlpatterns += [ 
url(r'^api-auth/', include('rest_framework.urls', 
          namespace='rest_framework')), 
] 

Cosa devo fare?

+0

Ci potrebbe essere un problema nel tuo 'urls.py' ... Puoi mostrare come viene costruito' urlpatterns'? –

+0

Aggiunto urls.py e api/urls.py in questione! @BernhardVallant –

risposta

4

Prova ad aggiungere la linea url(r'^api-auth/', include('rest_framework.urls',namespace='rest_framework')), al vostro principale urls.py o modificare la namespace di api/ a rest_framework invece (e rimuoverlo dall'altro url) ...

+1

Funziona ma voglio l'autenticazione a livello di API. –

+0

Quindi prova a usare lo spazio dei nomi 'rest_framework' su'/api' ... –

+1

nome spazio rest_framework è già specificato su /api/urls.py –

7

Il problema è con i tuoi spazi dei nomi. Nello specifico, stai usando uno spazio dei nomi annidato e il framework Django REST non si aspettava che fosse così.

Il tutorial per logging into the browsable API raccomanda il seguente frammento di codice per i tuoi URL API

# The API URLs are now determined automatically by the router. 
# Additionally, we include the login URLs for the browsable API. 
urlpatterns = [ 
    url(r'^', include(router.urls)), 
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')) 
] 

Così gli URL d'accesso saranno situati a /api-auth/ e hanno uno spazio dei nomi di rest_framework, in modo che il non interferiscono con URL esistente modelli. Questo tutorial presume che tu sia nella root urlconf quando inserisci i pattern, o almeno che non stai usando spazi dei nomi extra. Questo perché l'url rest_framework:login viene utilizzato per generare la pagina di accesso per l'API navigabile, in modo che lo spazio dei nomi sia rest_framework.

Nel tuo caso, stai registrando gli URL sotto api, quindi il nome della vista è in realtà api:rest_framework:login. L'errore che hai trovato

u'rest_framework' non è uno spazio dei nomi registrati

è perché lo spazio dei nomi rest_framework non è uno spazio dei nomi radice. Puoi risolvere questo problema spostando l'urlpattern al di fuori di api/urls.py o overriding the browsable API templates.

+1

Non riesco a spostare urls.py fuori dall'api perché voglio che autenticazione a livello di applicazione e a livello di applicazione non riesco a trovare un modo per accedere. Come posso registrare lo spazio dei nomi 'rest_framework'? oppure puoi fornire dettagli sull'override del modello di API navigabile? –

Problemi correlati