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:-
indexretrieveupdatedeletecreate
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.
Metadata
Release files for django-viewrouter 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| django_viewrouter-0.1.3.tar.gz | 4.9 kB | Without provenance | Details for django_viewrouter-0.1.3.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| django_viewrouter-0.1.3-py3-none-any.whl | Python 3 | none | any | Details for django_viewrouter-0.1.3-py3-none-any.whl |
Total release size: 11.8 kB
Release files / django_viewrouter-0.1.3.tar.gz
| Download URL | django_viewrouter-0.1.3.tar.gz |
|---|---|
| Size | 4.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
af04f07ad392a135fc8e06fcc9758c501cffd623edefedc86470a9844337c0b7
|
|
BLAKE2b-256 checksum How to use checksums |
706b50d834c00e211fba5e8ac1aa677d4480ea6b0b94b93f1b6ebf7377754fcb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.5.1 CPython/3.10.12 Linux/6.2.0-1017-aws
|
Release files / django_viewrouter-0.1.3-py3-none-any.whl
| Download URL | django_viewrouter-0.1.3-py3-none-any.whl |
|---|---|
| Size | 6.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
87fa94f5a84d681f2ce7a49abc24ffd7558fc0c24739b07e13ec31725db58185
|
|
BLAKE2b-256 checksum How to use checksums |
b0def4fd9407e8ff69acff033724dd2a61862a06fbb3fc7d194c72c0fc7f2eec
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.5.1 CPython/3.10.12 Linux/6.2.0-1017-aws
|
Security for django-viewrouter 0.1.3
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.