Skip to main content

No project description provided

Project description

Rails style controller dispatch method for Django class based views. Instead of dispatching incoming http request to HTTP verbs such as 'GET', 'POST', 'DELETE' etc, it dispatch to more familiar CRUD action such as create, update, delete, and delete. For browser based apps, I found the CRUD action make more sense, after all in the browser we only limited to GET and POST so not much gain to split our request handler into proper HTTP method.

Installation

pip install https://github.com/k4ml/django-viewrouter/archive/refs/heads/main.zip

Usage

Create a view class like below:-

from django.http import HttpResponse
from viewrouter.views import ActionView

class ArticleView(ActionView):
    def index(self, request):
        return HttpResponse('this is index')

    def retrieve(self, request, pk):
        return HttpResponse('this is article %s' % pk)

    def delete(self, request, pk):
        return HttpResponse('deleting %s' % pk)

    def update(self, request, pk):
        return HttpResponse('updating %s' % pk)

Then in your urls.py:-

from django.urls import include, path
from viewrouter.routers import Router

from yourproject.views import ArticleView

article_router = Router(ArticleView)
urlpatterns = patterns('',
    # Examples:
    # path('', 'myapp.views.home', name='home'),
    # path('blog/', include('blog.urls')),

    path('admin/', admin.site.urls),
    path('article/', article_router.urls)
)

The following url now accessible:-

  • /article/
  • /article/index/ (similar to above)
  • /article/update//
  • /article/retrieve//
  • /article/delete//

We can also use the following shortcuts instead:-

    path('article/', ArticleView.get_urls())

By default the following methods on your class based views will be automatically routed:-

  • index
  • retrieve
  • update
  • delete
  • create

Other methods can be routed by explicitly marking them with route decorator:-

from django.http import HttpResponse
from viewrouter.views import ActionView
from viewrouter.routers import route

class ArticleView(ActionView):
    def index(self):
        return HttpResponse('this is index')

    def retrieve(self, pk):
        return HttpResponse('this is article %s' % pk)

    @route(r'^set-password/(?<user_id>\d+)/')
    def set_password(self, user_id):
        return HttpResponse('change password for user %s' % user_id)

Unlike django built-in class based views which route based on HTTP methods, this will route all HTTP methods as long as the url pattern matched. To restrict the HTTP methods allowed, use http_methodsparameter to @route decorator:-

    @route(r'^set-password/(?<user_id>\d+)/', http_methods=['post'])
    def set_password(self, user_id):
        return HttpResponse('change password for user %s' % user_id)

Background

After start using class based views, I found our urls.py start getting cluttered with the boilerplate of wiring up the views into url patterns. And having split the views into proper http verbs, it mean we always need at least 2 separate views to handle the CRUD operation. For example:-

urlpatterns = patterns('',
        url(r'^article/$', ArticleView.as_view()),
        url(r'^article/(?P<pk>\d+)/$', ArticleEditorView.as_view()),
    )

Above, ArticleView will handle listing of articles and creating new one and ArticleEditorView will handle updating, displaying single article and deleting the article.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_viewrouter-0.1.2.tar.gz (4.9 kB view details)

Uploaded Source

Built Distribution

django_viewrouter-0.1.2-py3-none-any.whl (6.9 kB view details)

Uploaded Python 3

File details

Details for the file django_viewrouter-0.1.2.tar.gz.

File metadata

  • Download URL: django_viewrouter-0.1.2.tar.gz
  • Upload date:
  • Size: 4.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.5.1 CPython/3.10.12 Linux/6.2.0-1017-aws

File hashes

Hashes for django_viewrouter-0.1.2.tar.gz
Algorithm Hash digest
SHA256 5e0a0c392807e123cec4ad7061420aea8cd7f0eb7ef9449277a0ec0dbb741a76
MD5 8e74503be182334bc9ca13a6c5f8fb78
BLAKE2b-256 d6eccc66022ebf0bb9621d589daa993ff9b9b066dc75b09ba79bd15834109d89

See more details on using hashes here.

File details

Details for the file django_viewrouter-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: django_viewrouter-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 6.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.5.1 CPython/3.10.12 Linux/6.2.0-1017-aws

File hashes

Hashes for django_viewrouter-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 cb79dc47f4110383d6579f6cff4e66d4298bbef7fb1ec67f3ecf23a54661f368
MD5 c693e6de06c47f2f8c2a09379b4a16db
BLAKE2b-256 d9d181f0f51a5e9021d0f7c238942f087cc70fab286c546f437aaa75b68c3a20

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page