stone2083

          django框架的幾個擴展點

          前段時間替朋友做了一個物業管理系統,使用了python+django技術,對django有了一些了解。
          作為一個一直來使用java的人來說,初次使用django,真正體會到了簡單美學。(一共13個功能,不到500行代碼)
          此文,主要總結下django框架的一些擴展點:
          MIDDLEWARE_CLASSES
          在request請求之前,或者response請求之后,做攔截,允許自定義邏輯。有些類似J2EE Servlet中的Filter概念。
          TEMPLATE_CONTEXT_PROCESSORS
          進入模板渲染之前,允許放入一組用于模板渲染的Key-Value屬性。
          TEMPLATE FILTER
          模板中的管道語法,通過自定義行為,添加用于顯示的一些邏輯。
          TEMPLATE TAG
          模板tag,添加一組行為。有些類似Velocity中的ToolSet功能。
          模板tag+指定模板,充當頁面組件(widgets)功能

          middleware演示
           1 from django.db import connection
           2 from django.http import HttpResponseRedirect
           3 
           4 #攔截response請求之后,打印請求中的所有sql
           5 class SqlLogMiddleware(object):
           6     def process_response(self, req, res):
           7         for sql in connection.queries:
           8             print sql
           9         return res
          10 
          11 #攔截request請求之前,做權限校驗
          12 class Auth(object):
          13     def process_request(self, req):
          14         if req.path == '/admin/':
          15             return
          16         if not req.user.is_authenticated():
          17             return HttpResponseRedirect('/admin/')
          18 
          1 MIDDLEWARE_CLASSES = (
          2     'django.middleware.common.CommonMiddleware',
          3     'django.contrib.sessions.middleware.SessionMiddleware',
          4     'django.contrib.auth.middleware.AuthenticationMiddleware',
          5     'finance.middleware.SqlLogMiddleware',
          6     'finance.middleware.Auth',
          7 )


          template context processor演示
          1 def version(request):
          2     return {'name':'Stone.J',
          3             'version':'1.0-beata',
          4             'date':'2011-03-20'}
          1 TEMPLATE_CONTEXT_PROCESSORS = (
          2     'django.core.context_processors.request',
          3     'django.core.context_processors.auth',
          4     'django.core.context_processors.debug',
          5     'django.core.context_processors.i18n',
          6     'django.core.context_processors.media',
          7     'finance.example.context_processors.version',
          8 )

          template filter演示
           1 def row(value):
           2     if not value:
           3         return 'row1'
           4     if value % 2 == 1:
           5         return 'row1'
           6     else:
           7         return 'row2'
           8     
           9 def math_mul(value, num):
          10     return value * num
          11 
          12 def math_add(value, num):
          13     return value + num
          14 
          15 register = template.Library()    
          16 register.filter('row', row)
          17 register.filter('math_add', math_add)
          18 register.filter('math_mul', math_mul)
          1 {% load my_filter %}
          2 {% for c in page.object_list %}
          3 <tr class="{{ forloop.counter|row }}">
          4 <td>{{ c.amount | math_add:c.amount2}}</td>
          5 <td>{{ c.amount | math_mul:12}}</td>
          6 </tr>
          7 {% endfor %}
          通過約定的方式,在任意一個app下,建立一個templatetags目錄,會自動尋找到。(不過沒有命名空間,是一個比較猥瑣的事情,容易造成不同app下的沖突)

          template tag演示
           1 register = template.Library()
           2 
           3 class AccountNode(template.Node):
           4     def __init__(self, name):
           5         self.name = name
           6         
           7     def render(self, context):
           8         context[self.name] = Account.objects.get()
           9         return ''
          10     
          11 def get_account(parser, token):
          12     try:
          13         tag_name, name = token.split_contents()
          14     except ValueError:        
          15         raise template.TemplateSyntaxError, "%s tag requires argument" % tag_name
          16     return AccountNode(name)
          17 
          18 register.tag('get_account', get_account)

          1 {% load my_tag %}
          2 {% get_account account %}<!-- 通過tag取到內容賦值給account變量 -->
          3 {{ account.amount }}

          template tag + template file演示
          1 from django import template
          2 register = template.Library()
          3 
          4 def version(context):
          5     return {'name':'Stone.J',
          6             'version':'1.0-beata',
          7             'date':'2011-03-20'}
          8 
          9 register.inclusion_tag('example/version.html', takes_context=True)(version)
          1 <!-- 這份內容可以被當成widget復用 -->
          2 <table>
          3     <tr>
          4         <td>{{ name }}</td>
          5         <td>{{ version }}</td>
          6         <td>{{ data }}</td>
          7     </tr>
          8 </table>
          9 
          tag尋找模式等同于filter。

          posted on 2011-04-20 22:54 stone2083 閱讀(2578) 評論(0)  編輯  收藏 所屬分類: python

          主站蜘蛛池模板: 北流市| 丽水市| 毕节市| 邢台县| 林甸县| 宿迁市| 广南县| 桓台县| 江津市| 昌平区| 静乐县| 通山县| 苗栗县| 翁牛特旗| 百色市| 内江市| 民乐县| 温宿县| 固安县| 乌兰察布市| 灵璧县| 利津县| 公主岭市| 都安| 鲁甸县| 临沭县| 隆回县| 满洲里市| 镇雄县| 肥城市| 土默特左旗| 奎屯市| 太康县| 松桃| 延寿县| 永顺县| 隆子县| 五常市| 奉贤区| 宝清县| 抚州市|