This commit is contained in:
Tom Christie 2013-01-15 21:49:24 +00:00
parent 71e55cc4f6
commit 4a7139e41d
2 changed files with 44 additions and 9 deletions

View File

@ -44,23 +44,25 @@ To see what's going on under the hood let's first explicitly create a set of vie
In the `urls.py` file we first need to bind our resources to concrete views. In the `urls.py` file we first need to bind our resources to concrete views.
snippet_list = SnippetResource.as_view(actions={ from snippets import resources
snippet_list = resources.SnippetResource.as_view({
'get': 'list', 'get': 'list',
'post': 'create' 'post': 'create'
}) })
snippet_detail = SnippetResource.as_view(actions={ snippet_detail = resources.SnippetResource.as_view({
'get': 'retrieve', 'get': 'retrieve',
'put': 'update', 'put': 'update',
'delete': 'destroy' 'delete': 'destroy'
}) })
snippet_highlight = SnippetResource.as_view(actions={ snippet_highlight = resources.SnippetResource.as_view({
'get': 'highlight' 'get': 'highlight'
}) })
user_list = UserResource.as_view(actions={ user_list = resources.UserResource.as_view({
'get': 'list', 'get': 'list',
'post': 'create' 'post': 'create'
}) })
user_detail = UserResource.as_view(actions={ user_detail = resources.UserResource.as_view({
'get': 'retrieve', 'get': 'retrieve',
'put': 'update', 'put': 'update',
'delete': 'destroy' 'delete': 'destroy'
@ -93,12 +95,12 @@ Replace the remainder of the `urls.py` file with the following:
Right now that hasn't really saved us a lot of code. However, now that we're using Resources rather than Views, we actually don't need to design the urlconf ourselves. The conventions for wiring up resources into views and urls can be handled automatically, using `Router` classes. All we need to do is register the appropriate resources with a router, and let it do the rest. Here's our re-wired `urls.py` file. Right now that hasn't really saved us a lot of code. However, now that we're using Resources rather than Views, we actually don't need to design the urlconf ourselves. The conventions for wiring up resources into views and urls can be handled automatically, using `Router` classes. All we need to do is register the appropriate resources with a router, and let it do the rest. Here's our re-wired `urls.py` file.
from blog import resources from snippets import resources
from rest_framework.routers import DefaultRouter from rest_framework.routers import DefaultRouter
router = DefaultRouter(include_root=True, include_format_suffixes=True) router = DefaultRouter()
router.register(resources.SnippetResource) router.register('snippets', resources.SnippetResource)
router.register(resources.UserResource) router.register('users', resources.UserResource)
urlpatterns = router.urlpatterns urlpatterns = router.urlpatterns
## Trade-offs between views vs resources. ## Trade-offs between views vs resources.

33
rest_framework/routers.py Normal file
View File

@ -0,0 +1,33 @@
# Not properly implemented yet, just the basic idea
class BaseRouter(object):
def __init__(self):
self.resources = []
def register(self, name, resource):
self.resources.append((name, resource))
@property
def urlpatterns(self):
ret = []
for name, resource in self.resources:
list_actions = {
'get': getattr(resource, 'list', None),
'post': getattr(resource, 'create', None)
}
detail_actions = {
'get': getattr(resource, 'retrieve', None),
'put': getattr(resource, 'update', None),
'delete': getattr(resource, 'destroy', None)
}
list_regex = r'^%s/$' % name
detail_regex = r'^%s/(?P<pk>[0-9]+)/$' % name
list_name = '%s-list'
detail_name = '%s-detail'
ret += url(list_regex, resource.as_view(list_actions), list_name)
ret += url(detail_regex, resource.as_view(detail_actions), detail_name)
return ret