最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python下如何讓web元素的生成更簡單的分析

 更新時間:2008年07月17日 08:49:52   作者:  
做web不簡單,特別是當(dāng)你需要使用一些web效果的時候, 比如顯示個圓角矩形,提示框之類的,也許你認(rèn)為很簡單,好讓我們分析一下:
1. 引用css。這可能是最常見的做法了,對一些特定的元素定義特定的樣式。那么使用它,你需要在HTML
頁面中加入<link>標(biāo)簽。
2. 引入js。許多特效也可以通過javascript來進(jìn)行處理,比如動態(tài)顯示效果,或?qū)υ剡M(jìn)行封裝。使用
它你需要在HTML頁面加入<script>標(biāo)簽,必要時還要加一些javascript代碼。
3. HTML元素。需要設(shè)定一些特殊的屬性,比如class=某個屬性。這塊還相對簡單。

因此從上面的分析可以看出,在通常情況下,加入一個好看的web元素可能到許多地方的修改。因此我一
直在思考如何讓這個過程可以更簡化,麻煩的地方就是如何處理這些資源,如何讓這些資源可以與原始的
HTML很好的結(jié)合呢?最終我想出的辦法就是:代碼組裝。

對于css, javascript鏈接和代碼,它們可以按調(diào)用的順序依次拼成一段文本,然后插入到</head>元素前
面。然后對于html代碼,在模板中直接輸出。對于css, javascript的鏈接可以檢查是否重復(fù)。

那么如何定義web元素類和如何在模板中對其進(jìn)行處理?

一個web元素類定義如下:

class Snippet(object):
    css = ''
    csslink = ''
    jslink = ''
    html = ''
    js = ''

    def render(self):
        return ''

    def __str__(self):
        return self.render()

定義為類屬性的將輸出到HTML的頭部,而render()的結(jié)果將顯示在模板中調(diào)用類的地方。先看一下在模板
中調(diào)用的示例:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>HTML Helper</title>
<script type="text/javascript" src="/static/js/jquery.js"></script>
</head>
<body>
{{
htmlbuf << htmlwidgets.Message('This is a test')
}}
</body>
</html>

這里你可以看到htmlbuf,它是什么,它就是用來采集每個Snippet類的類屬性的。這里使用<<來將一個
Snippet對象加到htmlbuf中去。同時它還會將Snippet的HTML代碼在調(diào)用位置輸出。

如何輸出?首先uliweb的模板將轉(zhuǎn)為python代碼,它有一個內(nèi)置的out對象,可以調(diào)用它的方法來輸出
HTML代碼。那么htmlbuf對象將在調(diào)用模板前被創(chuàng)建,在調(diào)用模板后被處理,在創(chuàng)建時將傳入out的write
屬性。這一切都是在SImpleFrame.py中通過plugin方法來實現(xiàn)的,但是這只是定義了一個調(diào)用點,如:

fname, code = template.render_file(filename, vars, env, dirs)
out = template.Out()
template._prepare_run(vars, env, out)
callplugin(self, 'before_render_template', env, out)

if isinstance(code, (str, unicode)):
    code = compile(code, fname, 'exec')
exec code in env, vars
text = out.getvalue()
output = execplugin(self, 'after_render_template', text, vars, env)

before_render_template 會在調(diào)用模板前被調(diào)用。after_render_template 會在調(diào)用模板后被調(diào)用。因
此你可以通過plugin機制來加入額外的處理。這是在settings.py中定義的,如:

@plugin('before_render_template')
def before_render_template(sender, env, out):
    from uliweb.core import js
    from uliweb.core.SimpleFrame import url_for
    from uliweb.helpers import htmlwidgets

    htmlbuf = js.HtmlBuf(write=out.noescape, static_suffix=url_for('Portal.views.static', 
filename=''))
    env['htmlbuf'] = htmlbuf
    env['htmlwidgets'] = htmlwidgets

這里注入htmlbuf和htmlwidgets到模板的env環(huán)境中,所以可以在模板中直接使用。在htmlwidgets中已經(jīng)
定義了一些Snippet。htmlbuf在創(chuàng)建時,會使用out.noescape方法,它將不會對Snippet中的代碼進(jìn)行轉(zhuǎn)
義。static_suffix表示靜態(tài)文件的前綴,缺省為/static/,這里由于使用了靜態(tài)服務(wù),所以通過url_for
來得到靜態(tài)URL前綴。

@plugin('after_render_template')
def after_render_template(sender, text, vars, env):
    import re
    r_links = re.compile('<link\s.*?\shref\s*=\s*"?(.*?)["\s>]|<script\s.*?\ssrc\s*=\s*"?
(.*?)["\s>]', re.I)
    if 'htmlbuf' in env:
        htmlbuf = env['htmlbuf']
        if htmlbuf.modified:
            b = re.search('(?i)</head>', text)
            if b:
                pos = b.start()
                #find links
                links = [x or y for x, y in r_links.findall(text[:pos])]
                htmlbuf.remove_links(links)
                t = htmlbuf.render()
                if t:
                    return ''.join([text[:pos], t, text[pos:]])
            else:
                return t+text
    return text

這里將在模板處理完畢后查找生成的HTML文本中的</head>標(biāo)簽,然后將相應(yīng)的信息插入到它的前面。同
時這里增加了對原HTML中已經(jīng)存在的鏈接進(jìn)行了判斷,如果存在則刪除之,這是通過remove_links來處理
的。

經(jīng)過這些的處理,你只要定義一個Snippet,Uliweb將自動為你處理css, js的鏈接包括代碼,和HTML代碼
的生成。因此你就可以簡單的:

{{
htmlbuf << htmlwidgets.Message('This is a test')
}}

來生成一個消息的提示信息。

我會慢慢擴展這個htmlwidgets庫。

再簡單描述一下如何配置:

1. 在settings.py中

INSTALLED_APPS = ['Documents', 'Examples', 'Portal', 'Post', 
    'uliweb.builtins.auth', 'uliweb.helpers.htmlwidgets']

這里要加入'uliweb.helpers.htmlwidgets',讓static目錄生效

2. 加入:

@plugin('before_render_template')
def before_render_template(sender, env, out):



@plugin('after_render_template')
def after_render_template(sender, text, vars, env):

3. 可以使用了。 

相關(guān)文章

  • plt.title()中文無法顯示的問題解決

    plt.title()中文無法顯示的問題解決

    本文主要介紹了plt.title()中文無法顯示的問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 利用Python和C語言分別實現(xiàn)哈夫曼編碼

    利用Python和C語言分別實現(xiàn)哈夫曼編碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Python和C語言分別實現(xiàn)哈夫曼編碼,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-07-07
  • pytorch自定義loss損失函數(shù)

    pytorch自定義loss損失函數(shù)

    這篇文章主要介紹了pytorch自定義loss損失函數(shù),自定義loss的方法有很多,本文要介紹的是把loss作為一個pytorch的模塊,下面詳細(xì)資料需要的小伙伴可以參考一下
    2022-02-02
  • 解讀pandas.DataFrame.corrwith

    解讀pandas.DataFrame.corrwith

    這篇文章主要介紹了解讀pandas.DataFrame.corrwith,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • django模板結(jié)構(gòu)優(yōu)化的方法

    django模板結(jié)構(gòu)優(yōu)化的方法

    這篇文章主要介紹了django模板結(jié)構(gòu)優(yōu)化的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • Python中使用defaultdict和Counter的方法

    Python中使用defaultdict和Counter的方法

    本文深入探討了Python中的兩個強大工具——defaultdict和Counter,并詳細(xì)介紹了它們的工作原理、應(yīng)用場景以及在實際編程中的高效使用方法,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • 詳解pandas安裝若干異常及解決方案總結(jié)

    詳解pandas安裝若干異常及解決方案總結(jié)

    這篇文章主要介紹了詳解pandas安裝若干異常及解決方案總結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • python實現(xiàn)將英文單詞表示的數(shù)字轉(zhuǎn)換成阿拉伯?dāng)?shù)字的方法

    python實現(xiàn)將英文單詞表示的數(shù)字轉(zhuǎn)換成阿拉伯?dāng)?shù)字的方法

    這篇文章主要介紹了python實現(xiàn)將英文單詞表示的數(shù)字轉(zhuǎn)換成阿拉伯?dāng)?shù)字的方法,涉及Python字符串轉(zhuǎn)換操作的相關(guān)技巧,需要的朋友可以參考下
    2015-07-07
  • SVM算法的理解及其Python實現(xiàn)多分類和二分類問題

    SVM算法的理解及其Python實現(xiàn)多分類和二分類問題

    這篇文章主要介紹了SVM算法的理解及其Python實現(xiàn)多分類和二分類問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Python堆排序原理與實現(xiàn)方法詳解

    Python堆排序原理與實現(xiàn)方法詳解

    這篇文章主要介紹了Python堆排序原理與實現(xiàn)方法,結(jié)合實例形式詳細(xì)分析了Python堆排序的概念、原理、實現(xiàn)方法及相關(guān)操作注意事項,需要的朋友可以參考下
    2018-05-05

最新評論

洮南市| 邵阳市| 宝清县| 长汀县| 土默特右旗| 宣武区| 延吉市| 周口市| 盐池县| 乌兰察布市| 五河县| 万年县| 偏关县| 大埔县| 娄底市| 会宁县| 盐边县| 阳谷县| 杭州市| 临江市| 辽中县| 二连浩特市| 理塘县| 陆河县| 玉山县| 手游| 信阳市| 金堂县| 贡山| 房产| 香格里拉县| 浪卡子县| 措美县| 娄烦县| 盖州市| 合肥市| 西宁市| 邻水| 准格尔旗| 鄂州市| 新余市|