关于最好的模板语言 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Livid
61.5D
444.89D
V2EX    Python

关于最好的模板语言

  •  
  •   Livid
    PRO
    2010-07-20 03:47:51 +08:00 22393 次点击
    这是一个创建于 5561 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前用过 Django 和 Tornado 的,总是感觉在一些小细节上不太满意。

    大家有更好的推荐么?
    73 条回复    1970-01-01 08:00:00 +08:00
    daqing
        1
    daqing  
       2010-07-20 09:14:32 +08:00
    我比较喜欢HAML,不知有没有python语言的实现。
    kuber
        2
    kuber  
       2010-07-20 09:32:16 +08:00
    我现在在用Ninja2, 还不错, 比Django 模板限制少
    shawiz
        3
    shawiz  
       2010-07-20 15:37:05 +08:00
    我觉得jinja2好!比 mako 简洁,比 genshi 快多了。
    flytwokites
        4
    flytwokites  
       2010-07-25 16:03:52 +08:00
    自已写一个,不会超过500行,哪里不满意就自已改。
    iwinux
        5
    iwinux  
       2010-07-27 14:50:53 +08:00
    Uliweb 这个框架带有一个模板 http://code.google.com/p/uliweb/source/browse/trunk/uliweb/core/template.py,是 web2py 里的模板的改进版,优点是在模板里可以直接写Python代码,缺点是可能会有性能问题……
    yuest
        6
    yuest  
       2010-09-02 15:10:29 +08:00
    @daqing 有 SHPAML,不是模板,仅仅是一个预处理器,但是真的很好很强大。
    huacnlee
        7
    huacnlee  
       2010-09-02 15:16:35 +08:00
    @daqing 我还是喜欢 Rails 的 erb
    darcy
        8
    darcy  
       2010-09-02 18:31:03 +08:00
    只用过django 和velocity ,感觉还是 django 好些。
    个人觉得没有所谓的最好,只是对你工作的度来说是否合适。a的缺点往往就是b的优点,而又没有谁那么容易的能够兼顾全面。
    flytwokites
        9
    flytwokites  
       2010-09-02 18:45:51 +08:00
    模板里可以直接用python是必须的。django那种模板用着真是痛苦,写tag也很不方便。
    est
        10
    est  
       2010-09-02 18:46:55 +08:00
    @shawiz 同推荐jinja2。@kuber 说的ninja2其实指的就是jinja2吧?
    minghua
        11
    minghua  
       2010-09-02 18:47:47 +08:00
    过渡简洁的模版会让设计师MM晕掉的,好不容易学会个Html,容易吗我?

    比如HAML,本来她能帮你集成类Html页面的,好了,这次只能你自己动手玩。
    leondu
        12
    leondu  
       2010-09-02 19:01:14 +08:00
    @minghua

    确实,haml对设计师的要求高一些,基本上要定位为前端开发,而不是简单的美工了。
    不过如果你团队中有这么一位靠谱的前端的话,那么使用者就非常的舒服了。
    minghua
        13
    minghua  
       2010-09-03 07:08:24 +08:00
    @leondu 所言极是。
    iugo
        14
    iugo  
       2010-09-03 10:53:40 +08:00
    vicalloy
        15
    vicalloy  
       2010-09-03 13:25:26 +08:00
    Django的模板通常情况下是好用的,tag和filter在大多情况下也还比较容易写。
    但由于限制比较多,某些情况下还是很让人抓狂。
    Jinja2长得和Django的模板比较像,而且限制少些,性能也不错。
    值得一试
    ZoomQuiet
        16
    ZoomQuiet  
       2010-09-10 09:15:26 +08:00
    认同这种追寻:
    寻找更好的模板系统记 - Kenneth's Blog - 歪酷博客 Ycool Blog
    http://kenneth.ycool.com/post.2812445.html

    可恨的是作者就是没有给出最后的模板...
    TerranC
        17
    TerranC  
       2010-12-26 00:49:42 +08:00
    jinja2 不错,很方便。
    gonghao
        18
    gonghao  
       2010-12-26 01:49:02 +08:00   1
    @ZoomQuiet 不晓得最后提到的是不是这个~
    http://ejohn.org/blog/Javascript-micro-templating/

    两篇文章的发布日期真是出奇的一致啊~
    Livid
        19
    Livid  
    MOD
    OP
    PRO
       2010-12-31 22:30:52 +08:00
    最后为新项目选定了 Jinja2,感谢大家的推荐。
    muxi
        20
    muxi  
       2010-12-31 23:01:29 +08:00
    慢了一步,本来推荐Jinja2的
    goophy
        21
    goophy  
       2011-01-01 21:30:57 +08:00
    我是来看结果的:)
    fanzeyi
        22
    fanzeyi  
       2011-01-01 21:42:02 +08:00
    nice~
    我正好在写一个需要模板统的工程
    iwinux
        23
    iwinux  
       2011-01-01 22:30:17 +08:00
    我直接转向RoR了 = =...
    Los
        24
    Los  
       2011-01-01 22:38:02 +08:00
    @iwinux ^_^你做了个正确的选择
    Jet
        25
    Jet  
       2011-01-01 22:41:29 +08:00
    jinja2 + 1 , 真的很棒而且性能不错。
    ZoomQuiet
        26
    ZoomQuiet  
       2011-03-23 20:48:58 +08:00
    @gonghao 的确是这个哪 jQuery 创始人的小作品!
    chuangbo
        27
    chuangbo  
       2011-03-24 00:04:47 +08:00
    @ZoomQuiet 这个08年的小作品具有强大的潜在威力,也许一直让 John Resig 耿耿于怀,导致 jQuery templates plugin 被收进 jQuery 官方。
    不过目前还是 beta ,最终应该会并入 jQuery。
    http://api.jquery.com/category/plugins/templates/

    js templates 给我带来了良好的实践体验,后端只需要准备好数据,模版什么的,ajax 什么的统统让 js 搞定啦,再也不用写两套渲染方法了~
    dreampuf
        28
    dreampuf  
       2011-03-24 13:18:33 +08:00
    tenjin1.0.1

    此前使用jinjia挺强大的,一些模块化工作做的不错.但是多个文件的类库有些庞大.
    后来换成tenjin,比jinjia灵活,不过模块化不如jinjia,每个模块必须为一个模板文件.此前版本的缩进问题很麻烦,不过1.0.1后可以无视这个问题了.

    二者的文档碎片缓存都很强大.tenjin无论在速度还是在体积都优于jinjia不过他更像是封装了字符串拼接的python模块.而jinjia更传统,功能更丰富.
    mywaiting
        29
    mywaiting  
       2011-03-24 14:27:20 +08:00
    @Livid 敢问Torando有哪些不满意的地方呢?能够说说吗?
    adow
        30
    adow  
       2011-03-24 14:55:59 +08:00
    最近要想要一个js的模板,问题是不知道到底哪个比较好,后来一怒之下自己造了个轮子,200多行js,好像用着还行
    ZoomQuiet
        31
    ZoomQuiet  
       2011-03-31 13:19:27 +08:00
    @adow 这么爽?! 开源卟?! 分享给大家体验哪,靠谱的话,推荐给 jQuery 流芳百世哪
    ZoomQuiet
        32
    ZoomQuiet  
       2011-03-31 13:20:58 +08:00
    @mywaiting http://www.tornadoweb.org/ 被长城认证了!这就是最大的问题!
    ekayxu
        33
    ekayxu  
       2011-03-31 13:23:21 +08:00
    推荐cheetah,性能非常好,并且看着舒服
    mywaiting
        34
    mywaiting  
       2011-04-01 18:47:31 +08:00
    @ZoomQuiet 作为互联网从业人员,连翻:墙都不会的话,那基本可以忽略。
    chuangbo
        35
    chuangbo  
       2011-04-01 19:18:01 +08:00
    @mywaiting 楼上的同学,@ZoomQuiet 是 CPyUG 的大妈呢
    stranbird
        36
    stranbird  
       2011-04-01 19:38:02 +08:00
    Rails的erb真的很赞~
    mywaiting
        37
    mywaiting  
       2011-04-01 23:18:50 +08:00
    @chuangbo 不管是不是大妈大叔,翻:墙的必备工作啊。这年头,不看英文真的什么都学不到啊。

    PS:我知道 @ZoomQuiet 是CPyUg的大妈啊。偶当年还是想进去CpyUG来着,RP不够啊,一直被拒绝,现在。。。唉,算了,懒得进去瞎掺和了,还是洗洗睡吧,。。。哪里都可以学习啊。。。不过还是很感谢 ZoomQuiet的付出,非常非常感谢。
    ZoomQuiet
        38
    ZoomQuiet  
       2011-04-28 14:42:22 +08:00
    @mywaiting 嗯嗯嗯,开始偏题了,不过, PS: 当初没有进来,不是RP 问题,只是耐心问题而已, 订阅的规则一直有说 http://code.google.com/p/cpyug/wiki/PythonCn#%E8%AE%A2%E9%98%85%E9%97%AE%E9%A2%98 但是,没有耐心看一眼的话,以后不论学习什么,也是难以深入的哈,这是个基本可用的小测试 ;-)
    iiduce
        39
    iiduce  
       2011-04-28 15:27:48 +08:00
    新的django项目中用了jinja2,速度还没有看出来,语法和django模板真的很想,但是语法要多了不少,灵活一些。 但是jinja2和django的集成导致django的不少组件没法直接用了。
    yuest
        40
    yuest  
       2011-04-28 16:07:48 +08:00
    最近做的东西用 tornado 原生 + mustache 片段,前后端共用。
    remus
        41
    remus  
       2011-06-07 22:34:30 +08:00
    zhangkaixuan
        42
    zhangkaixuan  
       2011-06-21 01:20:16 +08:00
    正在往php+drupal攀爬
    island205
        43
    island205  
       2011-08-09 12:40:57 +08:00
    mustache
    lenmore
        44
    lenmore  
       2011-08-09 14:59:40 +08:00
    jinja2 +1
    wong2
        45
    wong2  
       2011-11-10 17:20:44 +08:00
    iwege
        46
    iwege  
       2011-11-10 18:54:22 +08:00
    underscore 自带的template ,js的,很灵活很小巧,很适合前端...
    iwege
        47
    iwege  
       2011-11-10 18:56:58 +08:00
    // By default, Underscore uses ERB-style template delimiters, change the
    // following template settings to use alternative delimiters.
    _.templateSettings = {
    evaluate : /<%([\s\S]+?)%>/g,
    interpolate : /<%=([\s\S]+?)%>/g,
    escape : /<%-([\s\S]+?)%>/g
    };

    // Javascript micro-templating, similar to John Resig's implementation.
    // Underscore templating handles arbitrary delimiters, preserves whitespace,
    // and correctly escapes quotes within interpolated code.
    _.template = function(str, data) {
    var c = _.templateSettings;
    var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +
    'with(obj||{}){__p.push(\'' +
    str.replace(/\\/g, '\\\\')
    .replace(/'/g, "\\'")
    .replace(c.escape, function(match, code) {
    return "',_.escape(" + code.replace(/\\'/g, "'") + "),'";
    })
    .replace(c.interpolate, function(match, code) {
    return "'," + code.replace(/\\'/g, "'") + ",'";
    })
    .replace(c.evaluate || null, function(match, code) {
    return "');" + code.replace(/\\'/g, "'")
    .replace(/[\r\n\t]/g, ' ') + "__p.push('";
    })
    .replace(/\r/g, '\\r')
    .replace(/\n/g, '\\n')
    .replace(/\t/g, '\\t')
    + "');}return __p.join('');";
    var func = new Function('obj', tmpl);
    return data ? func(data) : func;
    };
    就这么点,完了~ hoho~
    lijia18
        48
    lijia18  
       2011-11-10 19:11:21 +08:00
    jinja2 +1
    jckwei
        49
    jckwei  
       2011-11-13 16:17:55 +08:00
    我是来投 tenjin 的
    clino
        50
    clino  
       2011-11-15 17:22:40 +08:00
    我也推荐 uliweb ,是能在 html 里面内嵌 python 代码的
    lerry
        51
    lerry  
       2012-02-14 13:30:12 +08:00
    jinja2
    shawiz
        52
    shawiz  
       2012-02-14 14:16:36 +08:00
    @yuest 怎样的前后端共用?是不是 js + python?
    yuest
        53
    yuest  
       2012-02-15 16:27:10 +08:00
    @shawiz 恩,当时就用两个版本的 mustache。
    不过对于 js 来说,mustache 是个性能很差的模板引擎
    jo32
        54
    jo32  
       2012-02-15 19:38:38 +08:00 via Android
    选择真多,我觉得选社区资源多的就好了。。。
    cloudream
        55
    cloudream  
       2012-02-15 20:41:48 +08:00
    @chuangbo jQuery template plugin是这么回事儿:

    微软VS团队引入jQuery时写了这个东西(当时jQuery项目一个新闻是MS和NOKIA开发工具原生支持jQuery)。

    现在发布的jQuery template plugin是:John Resig看了一遍微软写的,当着微软员工的面,cmd+A,delete,然后现场重写了一遍
    onlytiancai
        56
    onlytiancai  
       2012-02-15 20:52:08 +08:00 via Android
    哈哈,楼上说的是真事吗
    whtsky
        57
    whtsky  
       2012-02-15 21:16:27 +08:00 via Android
    tenjin+1…
    kojp
        58
    kojp  
       2012-02-15 23:00:00 +08:00
    看完所有回复 ,好迷茫 ..
    不是以前一直听 livid说 tornado很不错的吗 ?
    我还是先把 django学好再说吧 ..
    shawiz
        59
    shawiz  
       2012-02-16 03:24:25 +08:00
    andy
        60
    andy  
       2012-02-16 09:17:34 +08:00
    @cloudream 这太伤人了,M$员工都有强烈的优越感。
    felinx
        61
    felinx  
       2012-02-16 10:04:27 +08:00
    @mywaiting Tornado模板的UIModule有点绕,不如mako的方便。mako和jinja2一个级别,差别主要在个人喜好,mako的语法根常见的模板语言不太一样。
    jckwei
        62
    jckwei  
       2012-02-16 10:08:01 +08:00
    个人喜好+习惯
    wptree
        63
    wptree  
       2012-02-16 10:26:11 +08:00
    前端的话,jtemplate还不错的
    superisaac
        64
    superisaac  
       2012-02-16 11:05:44 +08:00
    前端的话,Mustache不错
    jakepg
        65
    jakepg  
       2012-02-16 11:23:24 +08:00
    @wptree jtemplate 怎么不转义输出啊?
    yuest
        66
    yuest  
       2012-02-16 12:07:40 +08:00
    @shawiz 没用过,这里有一个性能比较 http://jsperf.com/hogan-performance/2
    这里有好多模板引擎的比较 http://jsperf.com/dom-vs-innerhtml-based-templating/346
    mywaiting
        67
    mywaiting  
       2012-02-16 12:26:20 +08:00
    @felinx 绕,有一点吧,不过能把模板里面通用的抽出来,UIModule的实现也是很不错的.....

    忽然想到我上次把UIModule里面的render方法写成self.render(""),结果Python提示我堆栈超出最大限制了.....自己把自己调用了..........
    88250
        68
    88250  
       2012-02-16 12:37:43 +08:00
    FreeMarker,总感觉功能过于累赘。
    有时候还是简单的模版引擎比较好,比如没有逻辑表达式,没有复杂类型。
    felinx
        69
    felinx  
       2012-02-16 12:38:37 +08:00
    @mywaiting 你去看看mako的 http://docs.makotemplates.org/en/latest/defs.html# 就会知道为什么我会说UIModule有点绕
    mywaiting
        70
    mywaiting  
       2012-02-16 12:50:46 +08:00
    @felinx 看得有点晕....
    cloudream
        71
    cloudream  
       2012-03-04 20:26:11 +08:00
    微软澳洲11年remix上speaker自己说的 XD
    yxlwfds
        72
    yxlwfds  
       2013-03-02 13:17:08 +08:00
    Tenjin +1
    darkread
        73
    darkread  
       2014-02-05 21:22:18 +08:00
    @zhangkaixuan

    刚刚从php+drupal坑里面爬出来。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3109 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 40ms UTC 11:00 PVG 19:00 LAX 04:00 JFK 07:00
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86