jinja2简介.ppt_第1页
jinja2简介.ppt_第2页
jinja2简介.ppt_第3页
jinja2简介.ppt_第4页
jinja2简介.ppt_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、,2,正文内容,Jinja2是基于python的多功能的被广泛使用 的模板引擎 是对django模板的补充(弥补django的不足) 强大的自动HTML转换系统,可以阻止跨站 脚本攻击模板继承机制(会对一些特殊字符 自动转义),jinja2 简单说明,正文内容,基本API用法: from Jinja2 import Template template = Template(Hello name !) template.render( name = world ) Environment(模板环境) Environment是Jinja2中的一个核心类,它的实例用来保存配置、全局对象,以及从本地文

2、件系统或其它位置加载模板 Environment 一般在一个应用中只创建一个,API 介绍,正文内容,创建Environment 创建Environment实例 : from jinja2 import PackageLoader, PrefixLoader, Environment, ChoiceLoader, FileSystemLoader, FunctionLoader jj = Environment(extensions=global_exts, loader=ChoiceLoader(loader_array), undefined = undefined, autoescape

3、 = True) 加载模板: template = jj.get_template(templatefile, globals = env : ActionConext.context() text = template.render(data) 注意:加载过模板之后不能修改Enviroment实例,API 介绍,正文内容,class Environment(block_start_string=%, block_end_string=%, variable_start_string=, vari- able_end_string=, comment_start_string=#, comme

4、nt_end_string=#, line_statement_preix=None, trim_blocks=False, extensions=(), optimized=True, undefined=, finalize=None, autoescape=False, loader=None) 参数解释: (参考jinja2文档) 1、block_start_string, block_end_string, variable_start_string, variable_end_string, comment_start_string, comment_end_string:定义块,

5、变量,注释 2、extensions : Jinja的扩展对象列表, 可以是导入路径的字符串或扩展类 3、loader :加载器类型 4、undefined : jinja2.runtime.Undefined或其子类的实例, 用来描绘模板中的值为 undefined的变量 5、autoescape:XML/HTML自动转义,缺省为false,API 介绍,高级API Envirinment类,正文内容,API 介绍,高级API Template类,class Template() Template类可以被看作是一个编译过的模板文件,被用来产生目标文本 Template类的构建器参数和Envi

6、ronment类基本相同 Template类与Environment类区别: 创建Template实例需要模板文本参数(data),另外它不需要loader参数 Template实例是一个不可变对象,即不能修改Template实例的属性。 重要方法成员: render(*args, *kwargs) : *args 元组 , *kwargs字典 例: template.render(knights=that say nih) template.render(knights: that say nih) generate(*args, *kwargs) :此方法会一段一段的渲染模板,而不是一次性

7、的将整个模板渲染成目标文本。,正文内容,API 介绍,高级API Loaders加载器,加载器负责从某些位置(比如本地文件系统)中加载模板,并维护在内存中的被编译过的模块: 文件系统加载器-从本地文件系统中查找并加载模板 class FileSystemLoader(searchpath, encoding=utf-8, cache_size=50, auto_reload=True) loader = FileSystemLoader(/path/to/templates)-searchpath是查找路径 包加载器-从python包中加载模板 class PackageLoader(pack

8、age_name, package_path=templates, encoding=utf-8, cache_size=50, auto_reload=True) 字典加载器-在mapping参数中明确指定模板文件名的路径(不常用) class DictLoader(mapping, cache_size=50, auto_reload=False) 函数加载器-让指定的函数来返回模板文件的路径 class FunctionLoader(load_func, cache_size=50, auto_reload=True),正文内容,模板一般用.html或.xml表示 jinja的语法主要参

9、考Django和python 模板简单实例: My Webpage % for item in navigation% item.caption % endfor% My Webpage a_variable ,模板设计,正文内容,变量: obj 访问变量属性:obj.attr,或objattr 过滤器:管道方式 | 内建过滤器 检查器:在Jinja的if块里面检查一个变量是否符合某种条件 % if name is defined% 注释:# #,模板设计,正文内容,定义基础模板:base.html % block head% % block title% endblock% - My Web

10、page % endblock% 继承: % extends base.html % 当解析这个模板的时候, 首先会本地化它的父模板. extends标签如果有则必须是子模板中的第一个标签,模板设计,模板继承,正文内容,同一模板中不允许有重名的block 在模板中, 可以通过self获取自身的引用来调用指定名字的block内容, 例如: % block title% endblock% self.block_name % block body% endblock% super block 如果要在子模板中重写父模板的block,如果重写了父模板的block, 又期望显示父模板的内容,可以调用s

11、uper关键字。 % block sidebar% Table Of Contents . super() % endblock%,模板设计,模板继承,正文内容,for % for user in users% user.username|e % endfor% 循环内部,可以访问特殊变量loop loop.index 当前迭代的索引,从1开始算 loop.first 相当于 loop.index = 1. loop.last 相当于 loop.index = len(seq) - 1 loop.length 序列的长度. loop.cycle可以接受两个字符串参数,如果当前循环索引是偶数,则

12、显示第一个字符串,是奇数则显示第二个字符串,一般用于不同行着色 class= loop.cycle(even, odd) ,模板设计,结构控制,正文内容,if % if users% % endif% elif, else % if kenny.sick% Kenny is sick. % elif kenny.dead% You killed Kenny! You bastard! % else% Kenny looks okay - so far % endif%,模板设计,结构控制,正文内容,宏(Macro) % macro macro_name(args, kwargs) % 作用与函

13、数类似,可将常见代码封装起来,供其他模板调用,避免重复工作 调用方法: macro_name(*args, *kwargs),返回宏定义输出 1、在公共模板中定义宏,在其他模板中import 2、在模板中定义,并直接调用 区别: 在模板中定义的宏可以访问传给模板的上下文变量 在其它模板中定义的宏则只能访问到传递给它的变量 举例 % macro input(name, value=, type=text, size=20) -% %- endmacro% input(username) input(password, type=password) ,模板设计,结构控制(Macro),正文内容,宏

14、内置属性 (可以在宏调用时访问的特殊变量) varargs : 相当于python的 *args kwargs : 相当于python的 *kwargs caller: 调用这个macro对象的call对象, 该对象是一个可调用对象, 可以使用caller()的方式获取call中的自己输出. 宏外部可调用属性(macro_name.field_name) 宏其实是个对象,有一些属性可以在模板中使用 name :宏的名称。 :string arguments :宏可以接受的参数,这个属性是一个元组 defaults :缺省值的元组 catch_kwargs :这个宏是否可以接

15、受关键字参数 catch_varargs :这个宏是否可以接受索引位置参数 caller :是否有caller变量,可以被call标签调用,模板设计,结构控制(Macro),正文内容,某些情况下,需要将一个宏对象传递到另外一个宏中使用 调用形式: % call macro_name(*args, *kwargs)% % endcall % 举例 % macro render_dialog(title, class=dialog) -% caller() %- endmacro% % call render_dialog(Hello World)% % endcall% 在render_dial

16、og中用 caller() 将 call block中的内容显示出来,模板设计,结构控制(Call),正文内容,举例 使用 caller() 时,可以传入参数 形式:% call(*args, *kwargs) macro_name(*args, *kwargs) % 例: % macro dump_users(users) -% %- for user in users% user.username|e caller(user) %- endfor% %- endmacro% % call(user) dump_users(list_of_user)% user.realname|e use

17、r.description % endcall%,模板设计,结构控制(Call),正文内容,赋值 在块(block, macro, loop)外部赋值的变量可以被从模板中导出,提供给其它模板使用 % set navigation = (index.html, Index), (about.html, About)% include 用include可以导入另外一个模板到当前模板中 语法: % include template_name%,没有结束符 import % import template_name as new_name % % from template_name import e

18、lement_name as new_name % 将一个模板导入入作为新的变量, 跟模块的导入相似 导入后可以使用.点号操作符获取其中定义的macro等元素 默认不会传递当前的context到被引入的模板,模板设计,结构控制(Call),正文内容,一般类型 字符串:“string”引号中间的就是字符串 数值:42 / 42.23: 直接用数值表示float, int 列表:1, 2, 3, 4: 元组:(1, 2, 3, 4): 字典:one: 1, two: 2 bool类型:true/false 数学计算:+, -, *, /, *, /, %等 逻辑运算符and, or, not 其他

19、操作 in 判断元素是否在集合中, 1 in 1, 2, 3 | 管道操作符, 默认使用Apply调用一个方法 字符串连接 ( ) 调用可调用对象 . 和 获取属性,模板设计,表达式,正文内容,可以在jinja2的filters.py文件中查找,模板设计,内建过滤器,正文内容,views, url, template views.py from nsfocus.web.action import * def pots_import(request): return render(vm_infos : vm_infos, vmhost_shows : vmhost_shows, pots_imp

20、ort.html ) action.py from nsfocus.web.template import jj def render(data, html = None, view_func = None): try: if html: if not view_func: base = os.path.dirname(traceback.extract_stack()-20) return render_tpl(data, html, base = base) else: return render_tpl(data, html, view_func = view_func) else: r

21、eturn render_json(data),实例介绍,正文内容,action.py from nsfocus.web.template import jj def render_tpl(data, html, view_func = None, base = None): try: dataenv = ActionConext.context() template = jj.get_template(templatefile, globals = env : ActionConext.context() text = template.render(data) if text and or

22、d(text0) = 0 xfeff: #删除bom头 text = text1: resp = HttpResponse(text) except TemplateNotFound, e: e.message = templatefile1 raise e resp.data = data return resp template.py global jj jj = Environment(extensions=global_exts, loader=ChoiceLoader(loader_array), undefined = undefined, autoescape = True),实

23、例介绍,正文内容,pots_improt.html % extends base/index.html % % block head % % endblock % % block body % % call dialog(addHostDlg, 250, _t(添加导入宿主机) % % for import_pot in vmhost_shows % % set host_ip_for_select = import_potimport_pot.find()+1:-1% import_pot % endfor % % endcall % % endblock %,实例介绍,正文内容,index

24、.html % from base/macros.html import styles, scripts, image, dialog, combobox, image_src, icon, dict_icon % % block title % % endblock % scripts(prototype, ui) %if is_debug_mod() % DEBUG = true % endif % % if errormsg is not defined -% % macro errormsg(field = None) -%-endmacro% %- endif % % block h

25、ead % % endblock % % block body % % endblock % ,实例介绍,正文内容,macros.html % macro dialog(id, width, title) -% caller() if (typeof Dialog = undefined) alert(dialog.js未导入); new Dialog.Box( id , title , width : width ); %- endmacro %,实例介绍,正文内容,Jinja2与django非常相似,许多语法相同,工作也相同 , % % jinja2没有Django模板的种种限制, 比如不能调用函数, 不能使用 Python 语句等. Jinja2的性能比django高, 渲染速度仅次于Mako(一种模板). 方法调用: Django隐式调用,jin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论