当慢慢了解做一些重复性的工作时候,我们都会思考,有没有什么办法简化工作,人因为懒洗衣服,所以有洗衣机,因为懒打扫,所以洗尘器,洗碗机,程序员们的懒,更多的是简化工作和抽象上,比如某个动作能不能封装成函数,进而封装成类,或者包,这样的懒才会有进步,才能将更多的时间放在一些值得关注的事上,精力应该放在思考上,而不是重复的没有意义的劳动上。

好了,不废话了,今天就简单的说一python下的模板引擎的另一种用法-代码生成器

先上主角的doc地址和介绍:

Jianja2 :==>点击跳转<==

Jianja2 是flask的模板引擎一般都会拿来和django的模板引擎做对比,有人会问,咦,我拿一个web的模板引擎做什么,要知道,我们经过一个http请求的时候,其实本质上都是请求到服务器加工好的数据,这个加工过程,模板的就是做为主力军,相应的,这个模板我们单独拿出来做为我们的代码生成器来使用。

我们先建立这样的文件夹:

SpiderTemplate

-templates

–index.html

-template.py

index.html就是我们要使用的模板。

里面的内容为:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>Proba</title>
</head>
<body>
<center>
    <h1>Proba</h1>
    <p>{{ urls|length }} links</p>
</center>
<ol align="left">
{% set counter = 0 -%}
{% for url in urls -%}
<li>[{{ url }}]({{ url }})</li>
{% set counter = counter + 1 -%}
{% endfor -%}
</ol>
</body>
</html>

其实{% %}都是模板化的引擎语言

我们在template.py添加代码

from jinja2 import Environment,FileSystemLoader
import os
import codecs

PATH = os.path.dirname(os.path.abspath(__file__))
TEMPLATE_ENVIRONMENT = Environment(
    autoescape=False,
    loader=FileSystemLoader(os.path.join(PATH, 'templates')),
    trim_blocks=False)


def render_template(template_filename, context):
    return TEMPLATE_ENVIRONMENT.get_template(template_filename).render(context)

def create_index_html():
    fname = "my.html"
    urls = ['http://example.com/1', 'http://example.com/2', 'http://example.com/3']
    context = {
        'urls': urls
    }
    #
    with open(fname, 'w') as f:
        html = render_template('index.html', context)
        f.write(html)

def main():
    create_index_html()
    

########################################

if __name__ == "__main__":
    main()

我们运行一下template.py,就可以生成my.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>Proba</title>
</head>
<body>
<center>
    <h1>Proba</h1>
    <p>3 links</p>
</center>
<ol align="left">
<li>[http://example.com/1](http://example.com/1)</li>
<li>[http://example.com/2](http://example.com/2)</li>
<li>[http://example.com/3](http://example.com/3)</li>
</ol>
</body>
</html>

是不是很简单?

我们反过来思考方法,我们用urls变量传递给了模板,然后在模板中使用模板语言的语法就可以轻松生成自己想要的特征和代码了。有人问了,你这只是针对html的,那对于其它的呢,其实大家都是文本文件 ,不用在意的去区别是html 的文件还是python的文件,只要自己使用的逻辑对了,代码生成器还是很容易实现的。好了,我说了一个大致的方法,你可以根据自己的爱好去拓展自己想要的代码生成器了。