stone2083

          django框架的幾個(gè)擴(kuò)展點(diǎn)

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

          middleware演示
           1 from django.db import connection
           2 from django.http import HttpResponseRedirect
           3 
           4 #攔截response請(qǐng)求之后,打印請(qǐng)求中的所有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請(qǐng)求之前,做權(quán)限校驗(yàn)
          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 %}
          通過約定的方式,在任意一個(gè)app下,建立一個(gè)templatetags目錄,會(huì)自動(dòng)尋找到。(不過沒有命名空間,是一個(gè)比較猥瑣的事情,容易造成不同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取到內(nèi)容賦值給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 <!-- 這份內(nèi)容可以被當(dāng)成widget復(fù)用 -->
          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 閱讀(2583) 評(píng)論(0)  編輯  收藏 所屬分類: python

          主站蜘蛛池模板: 临桂县| 大埔区| 吉安市| 肃北| 大宁县| 河间市| 宜都市| 淄博市| 德阳市| 绥滨县| 驻马店市| 河间市| 锡林浩特市| 昆明市| 杂多县| 沙河市| 阜平县| 循化| 马公市| 呼图壁县| 长海县| 昌江| 台北县| 石棉县| 梁山县| 分宜县| 乌拉特前旗| 芮城县| 措美县| 常州市| 西乡县| 南通市| 保山市| 开鲁县| 安化县| 平陆县| 海盐县| 淮滨县| 望都县| 牙克石市| 上蔡县|