aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/tutorial/6-resource-orientated-projects.md20
-rw-r--r--rest_framework/routers.py33
2 files changed, 44 insertions, 9 deletions
diff --git a/docs/tutorial/6-resource-orientated-projects.md b/docs/tutorial/6-resource-orientated-projects.md
index 97fb5d69..019371d7 100644
--- a/docs/tutorial/6-resource-orientated-projects.md
+++ b/docs/tutorial/6-resource-orientated-projects.md
@@ -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.
- snippet_list = SnippetResource.as_view(actions={
+ from snippets import resources
+
+ snippet_list = resources.SnippetResource.as_view({
'get': 'list',
'post': 'create'
})
- snippet_detail = SnippetResource.as_view(actions={
+ snippet_detail = resources.SnippetResource.as_view({
'get': 'retrieve',
'put': 'update',
'delete': 'destroy'
})
- snippet_highlight = SnippetResource.as_view(actions={
+ snippet_highlight = resources.SnippetResource.as_view({
'get': 'highlight'
})
- user_list = UserResource.as_view(actions={
+ user_list = resources.UserResource.as_view({
'get': 'list',
'post': 'create'
})
- user_detail = UserResource.as_view(actions={
+ user_detail = resources.UserResource.as_view({
'get': 'retrieve',
'put': 'update',
'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.
- from blog import resources
+ from snippets import resources
from rest_framework.routers import DefaultRouter
- router = DefaultRouter(include_root=True, include_format_suffixes=True)
- router.register(resources.SnippetResource)
- router.register(resources.UserResource)
+ router = DefaultRouter()
+ router.register('snippets', resources.SnippetResource)
+ router.register('users', resources.UserResource)
urlpatterns = router.urlpatterns
## Trade-offs between views vs resources.
diff --git a/rest_framework/routers.py b/rest_framework/routers.py
new file mode 100644
index 00000000..a5aef5b7
--- /dev/null
+++ b/rest_framework/routers.py
@@ -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