Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django REST Framework tutorial not working

I want to make an API for my project and I found Django REST Framework - http://django-rest-framework.org/

I tried their tutorial here http://django-rest-framework.org/tutorial/quickstart. The only diference is that my app is called api. My problem is that when I login with my admin user I receive the following error:

Exception Type: NoReverseMatch
Exception Value:    
Reverse for 'user-list' with arguments '()' and keyword arguments '{}' not found.

I tried to find a solution, but the result is that I am asking here if anyone has an idea :)

urls.py

from django.conf.urls import patterns, include, url
from django.conf.urls.static import static
from django.conf import settings

#not sure
from django.contrib.staticfiles.urls import staticfiles_urlpatterns

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

from dajaxice.core import dajaxice_autodiscover, dajaxice_config
dajaxice_autodiscover()

js_info_dict = {
    'packages': ('cards',),
}

urlpatterns = patterns('',
    # Examples:
    url(r'^$', include('cards.urls', namespace='cards')),
    # url(r'^giftycards/', include('giftycards.foo.urls')),
    url(r'^cards/', include('cards.urls', namespace='cards')),
    url(r'^api/', include('api.urls', namespace='api')),


    # Uncomment the admin/doc line below to enable admin documentation:
    url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    url(r'^admin/', include(admin.site.urls)),
    url(dajaxice_config.dajaxice_url, include('dajaxice.urls')),

    # REST API
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),

    # Internationalization urls
    url(r'^i18n/', include('django.conf.urls.i18n')),
    url(r'^jsi18n/$', 'django.views.i18n.javascript_catalog', js_info_dict),
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

urlpatterns += staticfiles_urlpatterns()

urlpatterns += patterns('',
    url(r'^static/(?P<path>.*)$', 'django.views.static.serve',
    {'document_root': settings.STATIC_ROOT }),

)

api/urls.py

from django.conf.urls import patterns, url, include
from rest_framework import routers
from api import views

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)

# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browseable API.
urlpatterns = patterns('',
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
)

Here is the full stack trace:

Environment:


Request Method: GET
Request URL: http://localhost:1238/api/

Django Version: 1.5.4
Python Version: 2.7.3
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'django.contrib.admindocs',
 'dajaxice',
 'rest_framework',
 'api',
 'cards')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.locale.LocaleMiddleware')


Traceback:
File "/home/valentin/Documents/Dev/giftycards/libs/django/core/handlers/base.py" in get_response
  115.                         response = callback(request, *callback_args, **callback_kwargs)
File "/home/valentin/Documents/Dev/giftycards/libs/django/views/generic/base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)
File "/home/valentin/Documents/Dev/giftycards/libs/django/views/decorators/csrf.py" in wrapped_view
  77.         return view_func(*args, **kwargs)
File "/home/valentin/Documents/Dev/giftycards/libs/rest_framework/views.py" in dispatch
  399.             response = self.handle_exception(exc)
File "/home/valentin/Documents/Dev/giftycards/libs/rest_framework/views.py" in dispatch
  396.             response = handler(request, *args, **kwargs)
File "/home/valentin/Documents/Dev/giftycards/libs/rest_framework/routers.py" in get
  254.                     ret[key] = reverse(url_name, request=request, format=format)
File "/home/valentin/Documents/Dev/giftycards/libs/rest_framework/reverse.py" in reverse
  17.     url = django_reverse(viewname, args=args, kwargs=kwargs, **extra)
File "/home/valentin/Documents/Dev/giftycards/libs/django/core/urlresolvers.py" in reverse
  496.     return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
File "/home/valentin/Documents/Dev/giftycards/libs/django/core/urlresolvers.py" in _reverse_with_prefix
  416.                 "arguments '%s' not found." % (lookup_view_s, args, kwargs))

Exception Type: NoReverseMatch at /api/
Exception Value: Reverse for 'user-list' with arguments '()' and keyword arguments '{}' not found.
like image 770
valkirilov Avatar asked Dec 07 '13 18:12

valkirilov


People also ask

How do I start Django REST Framework?

Setting up Django REST frameworkRun the command python -m venv django_env from inside your projects folder to create the virtual environment. Then, run source ./django_env/bin/activate to turn it on. Keep in mind that you'll need to reactivate your virtual environment in every new terminal session.

How long does it take to learn Django REST Framework?

The full specialization takes about 40 hours to complete. Those who have taken the Django for Everybody specialization, or have equivalent background. Yes, the specialization is designed to takes the courses in order.

Can I learn Django REST Framework without learning Django?

As someone who didn't really learn Django but use rest daily, It would certainly help but I've managed to get by without it. You'll still need to set up and manage the URLs file and views if you want to extend anything.

How does Django REST Framework work?

REST is a loosely defined protocol for listing, creating, changing, and deleting data on your server over HTTP. The Django REST framework (DRF) is a toolkit built on top of the Django web framework that reduces the amount of code you need to write to create REST interfaces.


2 Answers

This is an issue with DRF not handling namespaced urls correctly and therefore not allowing to handle your use case, please check out this thread for more details.

like image 161
mariodev Avatar answered Oct 24 '22 00:10

mariodev


I had the same problem with the tutorial, I solved it specifing a URL pattern name for the url (notice the name parameter):

url(r'^users/$', views.UserList.as_view(), name='users')

And then using that instead of the python path:

def api_root(request, format=None):
return Response({
    'users': reverse('users', request=request, format=format)
})
like image 43
Salvatore Zappalà Avatar answered Oct 24 '22 02:10

Salvatore Zappalà