自定义模板语言整合

  这篇文章主要对比一下两大框架Tornado和Django自定义模块语言,以及对Tornado的自定义模块语言进行一个分离整合

  首先我们先看一下在Tornado里,我怎么实现的自定义模板语言

  • 第一步,创建UIMethods.py文件,写入自定义方法(第一参数一定为self),创建UIModules.py文件,定义类(必须继承Tornado一个导入类UIModule,通过重写render方法实现)
  • 第二步,注册到settings里
  • 第三步,在模板语言里调用  {{ 函数方法 }}  {% module 类名(参数) %}

def tab(self):
    return ‘UIMethod‘

UIMethods

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from tornado.web import UIModule
from tornado import escape

class custom(UIModule):

    def render(self, *args, **kwargs):
        return escape.xhtml_escape(‘<h1>wupeiqi</h1>‘)
        #return escape.xhtml_escape(‘<h1>wupeiqi</h1>‘)

UIModules

#! /usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "laoliu"

import tornado.ioloop
import tornado.web
from UIMethods import Method1 as mt1
from UIMethods import UIMethod2 as mt2

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("hello.html")

settings = {
    ‘template_path‘: ‘views‘,        # html文件
    ‘static_path‘: ‘statics‘,        # 静态文件(css,js,img)
    ‘static_url_prefix‘: ‘/statics/‘,# 静态文件前缀
    ‘ui_methods‘: [mt1,mt2],              # 自定义UIMethod函数
    # ‘ui_modules‘: md,              # 自定义UIModule类
}

application = tornado.web.Application([
    (r"/index", MainHandler),  #localhost:9999/index
],**settings)

if __name__ == "__main__":
    application.listen(9999)
    tornado.ioloop.IOLoop.instance().start()

<body>
    <h1>hello</h1>
    {% module custom(123) %}
    {{ tab() }}
</body>

前端

  上述过程已经实现了在Tornado中的自定义模板语言,但是上述配置都还写在启动文件里,没有做到有效的分离,而且上面就光注册到settings里这一步,就要操作两次,一个导入模块,一个就是在settings里写入模块名,能更简洁一点呢?答案是有的

  我们是不是可以在配置文件里为UIMethods和UIModules定义两个组,组元素为要导入的文件路径,然后在启动程序文件里只需要循环这两个组,__import__导入就可以了

  • 在公共组件创建两个文件夹,分别存放UIMethod模块和UIModule模块

  • 在配置文件中,定义两个元组,分别存放要导入的模块
ui_method = (
    ‘Infrastructure.UIMethods.Null‘,
)

ui_module = (
    ‘Infrastructure.UIModules.Null‘,
)

settings = {
    ‘template_path‘: ‘Views‘,
    ‘static_path‘: ‘Statics‘,
    ‘static_url_prefix‘: ‘/Statics/‘,
}
  • 在程序启动文件,写入加载自定义方法
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import tornado.ioloop
import tornado.web
import Config

def load_ui_module(settings):
    module_list = []
    for path in Config.ui_method:
        m = __import__(path, fromlist=True)
        module_list.append(m)
    settings[‘ui_modules‘] = module_list

def load_ui_method(settings):
    method_list = []
    for path in Config.ui_method:
        m = __import__(path, fromlist=True)
        method_list.append(m)
    settings[‘ui_methods‘] = method_list

def load_routes(app):
    for route in Config.routes:
        host_pattern = route[‘host_pattern‘]
        route_path = route[‘route_path‘]
        route_name = route[‘route_name‘]

        m = __import__(route_path, fromlist=True)
        pattern_list = getattr(m, route_name)

        app.add_handlers(host_pattern, pattern_list)

# def load_hook():
#     pass

def start():

    settings = {}

    load_ui_method(settings)
    load_ui_module(settings)

    settings.update(Config.settings)

    application = tornado.web.Application([
        #(r"/index", home.IndexHandler),
    ], **settings)

    load_routes(application)

    # load_hook()
    # print(‘http://127.0.0.1:8888‘)

    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    start()

  上面就达到我刚才说的那两个目的了,只要写好自定义方法,在配置文件里配置一下路径即可

  说了Tornado,那我们看下Django,对于这个大而全的框架,自定义模板语言在操作上限定非常死,必须按照它们的规则取创建使用

  注:操作前,必须确保你注册了app

  • 第一步,在app中创建templatetags文件夹,并创建xx.py文件放在templatetags文件夹下,在xx.py文件定义HTML调用的方法
#xx.pyfrom django import template
from django.utils.safestring import mark_safe
from django.template.base import resolve_variable,Node,TemplateSyntaxError

register = template.Library()

@register.simple_tag
def my_simple_time(v1,v2,v3):
    return v1+v2+v3

@register.simple_tag
def my_input(id,arg):
    result = "<input type=‘text‘ id=‘%s‘ class=‘%s‘/>"%(id,arg,)
    return mark_safe(result)
  •  在需要进行渲染模板里调用,首选要在模板文件头部加载自定义方法文件{% load xx %},然后再调用函数 {% 函数名 参数 %}
{% load xx %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .hide{
            display:none;
        }
    </style>
</head>
<body>
    <h1>simple_tag</h1>
    {% my_input 123 ‘hide‘ %}
    <input type="button" onclick="show();"/>
    {% my_simple_time 1 2 3 %}
<script>
    function show(){
        var inp = document.getElementById(‘123‘);
        inp.classList.remove(‘hide‘);
    }
</script>
</body>
</html>

  除了自定义simple_tag之外,还可以自定义filter

#xx.py
from django import template
from django.utils.safestring import mark_safe
from django.template.base import resolve_variable,Node,TemplateSyntaxError

register = template.Library()

@register.filter
def detail(value,arg):
    allcount,remainder = arg.split(‘,‘)
    allcount = int(allcount)
    remainder = int(remainder)
    if value % allcount == remainder:
        return True
    return False

@register.filter
def func(val1,val2):
    if val1 + val2 == 2:
        return True
    return False
{% load xx %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>filter</h1>
    <div>
{#        {% if 1|func:1 %}#}
{#            <h1>bingo</h1>#}
{#        {% endif %}#}

        {% for item in detail_list %}
            {% if forloop.counter|detail:"4,0" %}
                <div>
                    <p>{{ item.name }}</p>
                </div>
            {% endif %}
        {% endfor %}
    </div>
<script>

</script>
</body>
</html>

  我们发现他们在定义时,装饰器是不同的,另外还有以下几点不同:

两种自定义方式对比

  • 参数:sample_tag---任意参数,filter---只能两个
  • 执行方式:sample_tag---{% 函数名:参数1 参数2 ... %},filter---{{ 参数一|函数名:参数二 }}
  • 支持条件if:sample_tag---不支持,filter---支持
时间: 2024-10-13 05:06:32

自定义模板语言整合的相关文章

自定义模板语言之simple_tag和自定义过滤器

扩展你的模板系统 一般是扩展模板的tag和filter两个功能.可以用来创建你自己的tag和filter功能库. 创建模板库 分为两步: 1. 首先决定由模板库在哪一个注册的app下放置,你可以放在一个已有的app目录下,也可以新建一个专门管理模板库的app,比如python manage.py startapp myTemplateLibrary.推荐后者,因为可以方便将来的重用. 2. 在app目录下创建templatetags子目录,并在里面创建两个文件,__init__.py,用来声明这

Python学习(三十七)—— 模板语言之自定义filter和中间件

一.模板语言之自定义filter 自定义filter文件存放位置 模板中自定义函数 - 在已注册的app中创建一个名字叫 templatetags 文件夹 - 任意创建一个py文件 - 创建名字交 register 的Library类的对象 - 定义函数 from django.template import Library register = Library() # 调用示例:{{ "a1"|meikai:"n1,n2"}} # 参数最多2 # 可以做if的条件

模板语言 自定义函数simple_tag

模板语言自带的一些处理函数:通过管道符来处理 帮助方法:{{ item.event_start|date:"Y-m-d H:i:s"}}  转换成日期时间型{{ bio|truncatewords:"30" }} 只取前30个字符{{ my_list|first|upper }} 将第一个字母大写{{ name|lower }} 全转换小写 有时我们须要自定义函数: a.在app中创建templatetags模块 b.创建任意 .py 文件,如:xx.py 1 2

Django(模板语言-自定义filter和simple_tag)

filter过滤器的主要形式:变量|函数,意思是将变量交给函数处理,而自定义filter就是自己定义函数,因为用到已有的很少. 1.在当前app中创建templatetags模块(包:带__init__.py)(必须的) 2.在templatetags中创建.py文件,如my_tags.py from django import template #因为要应用到前端模板语言,必须导入template from django.utils.safestring import mark_safe re

flask之web网关、三件套、配置、路由(参数、转化器及自定义转化器)、cbv、模板语言、session

1.wsgiref.py from wsgiref.simple_server import make_server def mya(environ, start_response): print(environ) print(start_response) start_response('200 OK', [('Content-Type', 'text/html')]) if environ.get('PATH_INFO') == '/index': with open(r'index.htm

Django学习之 - 基础模板语言

模板语言循环 1:如果模板语言遇到列表,直接进行循环取值即可. 2:如果模板语言遇到字典进行循环有以下3种: - for item in dict.keys 只循环获取字典key - for item in dict.value 只循环获取字典value - for k,v in dict.items 循环获取字典的key,value全部.实例url:fordict # 字典for循环的取值方法 1 userlist = { 2 '1': {'name': 'jack', 'age': 36},

Django 自定义模板标签和过滤器

1.创建一个模板库 使用模板过滤器的时候,直接把过滤器写在app里,例如:在app里新建一个templatetags的文件夹,这个目录应当和 models.py . views.py 等处于同一层次.例如: books/     __init__.py     models.py     templatetags/     views.py 在 templatetags 中创建两个空文件:一个 __init__.py (告诉Python这是一个包含了Python代码的包)和一个用来存放你自定义的

《开源框架那点事儿23》:Tiny模板语言(VelocityPlus)初步入门

2 Tiny模板语言概述 3 Tiny模板语言能为您做什么? 4 Tiny模板语言简介 5 Hello Tiny! 6 注释 7 引用(References) 7.1 变量(variables) 7.2 属性(properties) 7.3 方法(methods) 8 表达式(Expression) 8.1 取值表达式 8.2 Map常量 8.3 数组常量 8.4 其他表达式 9 索引表示法 10 渲染 11 与Java无缝对接 12 模板布局 13 指令集 13.1 #set指令 13.2 条

前端学PHP之自定义模板引擎

什么是网站模板?准确地说,是指网站页面模板,即每个页面仅是一个板式,包括结构.样式和页面布局,是创建网页内容的样板,也可以理解为已有的网页框架.可以将模板中原有的内容替换成从服务器端数据库中动态内容,目的是可以保持页面风格一致 PHP是一种HTML内嵌式的在服务器端执行的脚本语言,所以大部分PHP开发出来的Web应用,初始的开发模板就是混合层的数据编程.虽然通过MVC设计模式可以把程序应用逻辑与网页呈现逻辑强制性分离,但也只是将应用程序的输入.处理和输出分开,网页呈现逻辑(视图)还会有HTML代