Assume decorators, then, more or less:
def tagged(*tags):
def decorate(view):
@functools.wraps(view)
def decorated(*args, **kw):
view(*args, **kw)
decorated.tags = tags
return decorated
return decorate
(taking care to define a new function in the decorator so that you can use the
same view with differnet tags in different URLs)
That doesn't seem too heavyweight to me. Am I missing something?
Assuming not, the decorator defined above can be used already with current
production versions of Django for single URLs, and after the URL rework also
on includes.
Your examples become
# Already today
api_v1_patterns = [
url(r'^list/books/$', views.list_books, name='list-books'),
url(r'^list/articles/$', tagged('public')(views.list_articles),
name='list-articles'),
...
]
# After URL rework
urlpatterns = [
url(r'^$', views.home, name='home'),
url(r'^private/$', include(private_patterns),
decorators=[tagged('private')]),
url(r'^api/1/', include(api_v1_patterns), decorators=[
tagged('api', 'private', 'jsonp'),
]),
url(r'^api/2/', include(api_v1_patterns), decorators=[
tagged('api', 'cors', 'private'),
]),
]
taking Marc's doubts (which I agree with) into account, and seeing as 1.9 is
already feature-frozen, I think that the proper way forward for this feature
is to live out of core.
If I am missing something, and it is hard to implement it out of core, please
explain.
HTH,
Shai.