Я уже посягал на суверинитет джанги. Но это было давно и не правда. Более того, меня тогда убедили, что делаю я глупости, и я даже убедился сам, в последствии, что на самом деле делаю глупости. Но мысть о том, что urls.py не нужен – не перестает меня беспакоить. Поэтому очередно фин, аморальный бред – называйте как хотите, но мне безумно нравится.
Идея проста. Вьюха и урла всегда вместе – а значит одно должно быть декоратаром для другого.
Итак главный urls.py имеет обычный вид
-
from django.conf.urls.defaults import *
-
-
urlpatterns = patterns('',
-
(r'^someurl/',include('someapp.url_view')),
-
)
/someapp/url_view.py – тут у нас сбстно и хранятся вьюхи с урлами. Как видите, декоратор tourl нам земенил запись в urls.py
-
from django.http import HttpResponse
-
from tourl import tourl
-
-
@tourl(r'^and/$')
-
def and_(request):
-
return HttpResponse('and')
-
-
@tourl(r'^gg/$')
-
def index(request):
-
return HttpResponse('OK')
/someapp/tourl.py – ну и код самого декоратора
-
from django.conf.urls.defaults import *
-
import sys
-
import functools
-
def tourl(url_patern,*args,**kwargs):
-
def paramed_decorator(func):
-
@functools.wraps(func)
-
def decorated(self):
-
return func(self)
-
module =sys.modules[func.__module__]
-
-
if not hasattr(module, 'urlpatterns'):
-
module.urlpatterns = patterns('',)
-
-
module.urlpatterns += patterns('',
-
url(url_patern,decorated,*args,**kwargs),
-
)
-
return decorated
-
return paramed_decorator
Помоему и симпотично и по производительности не бьет. Вобщем конфетка! Что скажите?
PS: Добавил снипет.
PSS: В снипетсах посоветовали добавить functools.wraps
PSS: А еще можно использовать и так
-
from django.http import HttpResponse
-
from tourl import tourl, patterns,url
-
-
-
-
@tourl(r'^and/$')
-
def and_(request):
-
return HttpResponse('and')
-
-
-
def index(request):
-
return HttpResponse('OK')
-
-
tourl(r'^gg/$')(index)
-
-
-
def ordinary(request):
-
return HttpResponse('Ordinary')
-
-
urlpatterns += patterns('',
-
url(r'^ord/$',ordinary)
-
)

Recent Comments