UNKNOWN
Project description
Comments/feedback is very welcome, use issues or twitter: https://twitter.com/oinopion
Django has nice routing, but it’s too low level. Regexps are powerful, but have cryptic syntax. This library strives to make writing DRY urls a breeze.
Consider a standard urls.py:
urlpatterns = patterns('blog.entries.views', url(r'^$', 'recent_entries', name='entries_recent_entries'), url(r'^new/$', 'new_entry', name='entries_new_entry'), url(r'^(?P<entry_slug>[\w-]+)/$', 'show_entry', name='entries_show_entry'), url(r'^(?P<entry_slug>[\w-]+)/edit/$', 'edit_entry', name='entries_edit_entry'), url(r'^(?P<entry_slug>[\w-]+)/delete/$', 'delete_entry', name='entries_delete_entry'), url(r'^(?P<entry_slug>[\w-]+)/comments/$', 'comments_list', name='entries_comments_list'), url(r'^(?P<entry_slug>[\w-]+)/comments/(\d+)/$', 'comment_details', name='entries_comment_detail'), )
It has many issues:
you need to remember about the ‘^’ and the ‘$’
you repeat the entry_slug url
you need to remember arcane named group syntax
you repeat the [\w-]+ group
you associate name with urls conf
Better way of writing urls would be:
urlpatterns = hurl.patterns('blog.entries.views', [ ('', 'recent_entries'), ('new', 'new_entry'), ('<entry_slug>', [ ('', 'show_entry'), ('edit', 'edit_entry'), ('delete', 'delete_entry'), ('comments', 'comments_list'), ('comments/<:int>', 'comment_detail'), ]), ])
It conveys url structure more clearly, is much more readable and avoids repetition. If your views don’t rely on order, you can also use dictionary like this:
urlpatterns = hurl.patterns('blog.entries.views', { 'show': 'show_entry', 'edit': 'edit_entry', 'delete': 'delete_entry', })
How to use it
patterns (prefix, url_conf)
prefix is same as in django.conf.url.patterns
- url_conf is either a dictionary or a list of 2-tuples
The key (in dict) or first element (tuple) is a url fragment, value/second element can be one of: another url_conf, a string, an instance of ViewSpec:
{ 'show': 'blog.views.show_entry', }is equivalent to:
[ ('show', 'blog.views.show_entry'), ]URL conf creates a tree of url fragments and generates a list by joining each fragment with the “/”:
{ 'entries': { 'edit': 'edit_entry', 'delete': 'delete_entry', } }This will generate these urls:
(r'^entries/edit/$', 'edit_entry', name='edit_entry') (r'^entries/delete/$', 'delete_entry', name='edit_entry')Url fragment may include multiple parameters in format:
'<parameter_name:parameter_type>'parameter_name can be any python identifier parameter_type must be one of default or defined matchers
If you have parameter_type same as parameter_name, you can skip duplication and use shorter form:
'<int:int>' -> '<int>'If you want to use default matcher also use shortcut:
'<blog_slug:slug>' -> '<blog_slug>'If you don’t want to define parameter name, leave it empty:
'<:int>' # will generate r'(\d+)'
Default Matchers
- slug:
r’[w-]+’ This is the default matcher.
- int:
r’d+’
- str:
r’[^/]+’
Custom Matchers
You can define your own matchers. Just instantiate Hurl and set:
import hurl h = hurl.Hurl() h.matchers['year'] = r'\d{4}' urlpatterns = h.patterns('', {'<year>': 'year_archive'})
Names generation
Hurl will automatically generate view names for you. When provided with view as string (‘blog.views.show_entry’) it will take last part after the dot. When provided with function it will take the func_name of it:
def some_view(req): pass urlpatterns = hurl.patterns('', { 'show': 'blog.views.show_entry', # generates 'show_entry' name 'some': some_view, # generates 'some_view' name })
You can also want to change the name use the ‘v’ function:
import hurl urlpatterns = hurl.patterns('', { 'show': hurl.v('show_view', name='show'), })
Includes
If you want to include some other urlpatterns, use the include method:
import hurl urlpatterns = hurl.patterns('', { 'shop': hurl.include('shop.urls'), 'blog': hurl.include('blog.urls'), })
Mixing with pure Django urls
Hurl doesn’t do anything special, it just generates plain old Django urls. You can easily mix two APIs:
from django.conf.urls import url, include, patterns import hurl urlpatterns = patterns('', # plain Django url(r'^hello/$ )
More examples
Django tutorial:
# original: urlpatterns = patterns('', (r'^articles/2003/$', 'news.views.special_case_2003', {}, 'news_special_case_2003'), (r'^articles/(?P<year>\d{4})/$', 'news.views.year_archive', {}, 'news_year_archive'), (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', 'news.views.month_archive', {}, 'news_month_archive'), (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/$', 'news.views.article_detail', {}, 'news_article_detail'), ) # hurled: hurl = Hurl(name_prefix='news') hurl.matchers['year'] = r'\d{4}' hurl.matchers['month'] = r'\d{2}' hurl.matchers['day'] = r'\d{2}' urlpatterns = hurl.patterns('news.views', { 'articles': { '2003': 'special_case_2003', '<year>': 'year_archive', '<year>/<month>': 'month_archive', '<year>/<month>/<day>': 'article_detail', } })
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file hurl-2.1.tar.gz
.
File metadata
- Download URL: hurl-2.1.tar.gz
- Upload date:
- Size: 5.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b57adb4adbb1803316af0db7154c0d5ea2957ada32bd6699ba418076e2e6c32d |
|
MD5 | 0106a14a9e2700d10be00fd83bf21894 |
|
BLAKE2b-256 | 7104bbb728edbe3bee5252d59577ffe0a39a4183835d9ff82991685bd946aa63 |