<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    stone2083

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

    前段時(shí)間替朋友做了一個(gè)物業(yè)管理系統(tǒng),使用了python+django技術(shù),對(duì)django有了一些了解。
    作為一個(gè)一直來(lái)使用java的人來(lái)說(shuō),初次使用django,真正體會(huì)到了簡(jiǎn)單美學(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
    模板中的管道語(yǔ)法,通過(guò)自定義行為,添加用于顯示的一些邏輯。
    TEMPLATE TAG
    模板tag,添加一組行為。有些類似Velocity中的ToolSet功能。
    模板tag+指定模板,充當(dāng)頁(yè)面組件(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 %}
    通過(guò)約定的方式,在任意一個(gè)app下,建立一個(gè)templatetags目錄,會(huì)自動(dòng)尋找到。(不過(guò)沒(méi)有命名空間,是一個(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 %}<!-- 通過(guò)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 閱讀(2573) 評(píng)論(0)  編輯  收藏 所屬分類: python

    主站蜘蛛池模板: 日韩亚洲国产综合久久久| 久久亚洲色WWW成人欧美| 亚洲国产精品国产自在在线 | 免费无码又爽又刺激高潮| 美女在线视频观看影院免费天天看| 亚洲色无码国产精品网站可下载| 亚洲成人在线网站| 国产日韩成人亚洲丁香婷婷| 热99re久久免费视精品频软件| 91精品国产免费| 免费毛片在线看不用播放器 | 在线观看永久免费视频网站| xx视频在线永久免费观看| 黄网站免费在线观看| 国产精品免费一区二区三区| 麻豆安全免费网址入口| 亚洲成a∧人片在线观看无码| 亚洲国产模特在线播放| 亚洲色图.com| 久久亚洲国产精品成人AV秋霞| 亚洲欧洲国产精品香蕉网| 亚洲高清国产拍精品青青草原| 成在线人永久免费视频播放| 免费无码AV片在线观看软件| 99re视频精品全部免费| 国产精品免费看久久久| 免费国产99久久久香蕉| 最近免费mv在线观看动漫 | 亚洲熟女一区二区三区| 亚洲日韩在线观看免费视频| 免费人成在线观看视频播放 | 一道本不卡免费视频| 亚洲天堂免费在线视频| 一级特黄特色的免费大片视频| 日韩久久无码免费毛片软件| 深夜福利在线视频免费| 一级毛片不卡免费看老司机| 国产99久久久久久免费看| 男女一边摸一边做爽的免费视频| 韩国免费A级毛片久久| 国产一级淫片a免费播放口|