django心得:url可以做的更多

辛辛苦苦,完善了一个url_decorate的django app,支持include,支持多个decorate的复合

代码在http://groups.google.com/group/python-cn/browse_thread/thread/6980d49316499e96

可以方便的在url中使用decorate,这里我演示了一个内建的登录,一个自定义的页面访问量的统计
如自定义的页面访问量的统计代码很简单,如下
models.py
from django.db import models
class PageAnalytic(models.Model):
    url = models.URLField(max_length=2048,primary_key=True)
    visit = models.IntegerField(default=0)

    class Admin:
        list_display= ('url','visit')

    class Meta:
        ordering = ['url']

views.py:

from models import PageAnalytic
from url_decorate import make_decorate

@make_decorate
def page_analytic(request):
    page,is_create=PageAnalytic.objects.get_or_create(url=request.path)
    page.visit+=1
    page.save()

shortcuts.py:

from url_decorate import url_decorate,patterns_decorate

from views import page_analytic

page_analytic_url=url_decorate(page_analytic)
page_analytic_patterns=patterns_decorate(page_analytic)

使用示例:

.................
from utils.url_decorate.shortcuts import
page_analytic_patterns,page_analytic_url

urlpatterns = patterns('',
    #统计页面访问量
    page_analytic_url(r'^admin/', include('django.contrib.admin.urls')),
    (r'^media/(?P .*)', 'django.views.static.serve',
{'document_root' : settings.MEDIA_ROOT, 'show_indexes':True}),
)

#更方便的形式
urlpatterns+=page_analytic_patterns('',
    (r'^$',direct_to_template, {'template': 'mytube.html'}),
)



Url decorator

Some time we want to account the number of visitor by url or some url
only the logined in user can visit .

Yes , we can use url decorator do this thing .

I write a reuseable app for simplify those job . It can make decorator
more easy , can work with "include(xxx.urls)",
support multi-decorator .

Ok , we give a simplest example:

from django.conf.urls.defaults import *
from django.contrib.admin.views.decorators import staff_member_required
from django.views.generic.simple import direct_to_template

from url_decorate.url_decorate import url_decorate

staff_member_url=url_decorate(staff_member_required)

urlpatterns = patterns('',
    staff_member_required(r'^$',direct_to_template, {'template': 'xxx.html'}),
)

Ok,You will find the / of this website require login in .
But , sometime we have a lot of url should be logined in ,
patterns_decorate will help you to do this more easy .
Just use as below:
staff_member_patterns=patterns_decorate(staff_member_required)
urlpatterns = staff_member_patterns('',
    (r'xxx',direct_to_template, {'template': 'xxx.html'}),
    (r'xxx',direct_to_template, {'template': 'xxx.html'}),
    (r'xxx',direct_to_template, {'template': 'xxx.html'}),
)

For lazy people as me , I write staff_member_patterns,staff_member_url
and login_url,login_patterns in shortcuts.py , just import it to use
:)

Then , let's write a decorator by ourself .This decorator can account
the number of visitor for each pages .

First , write a model

models.py:
#--------------------------------------------------------------------------<wbr></wbr>--
from django.db import models
class PageAnalytic(models.Model):
   url = models.URLField(max_length=2048,primary_key=True)
   visit = models.IntegerField(default=0)

   class Admin:
       list_display= ('url','visit')

   class Meta:
       ordering = ['url']
#--------------------------------------------------------------------------<wbr></wbr>--

Second , write the view . You just need to write a function can
process the request .
The other thing "make_decorate" can take it over .

views.py:
#--------------------------------------------------------------------------<wbr></wbr>--
from models import PageAnalytic
from url_decorate import make_decorate

@make_decorate
def page_analytic(request):
   page,is_create=PageAnalytic.objects.get_or_create(url=request.path)
   page.visit+=1
   page.save()
#--------------------------------------------------------------------------<wbr></wbr>--

At last , write two shortcuts

shortcuts.py:
#--------------------------------------------------------------------------<wbr></wbr>--
from url_decorate import url_decorate,patterns_decorate
from views import page_analytic

page_analytic_url=url_decorate(page_analytic)
page_analytic_patterns=patterns_decorate(page_analytic)
#--------------------------------------------------------------------------<wbr></wbr>--

Now , It's time to use this , we just accout the admin .

#--------------------------------------------------------------------------<wbr></wbr>--
from url_decorate.shortcuts import page_analytic_url

urlpatterns = patterns('',
   page_analytic_url(r'^admin/', include('django.contrib.admin.urls')),
)

你可能感兴趣的:(thread,html,django,python,Google)