我们先从最简单的自动代码生成场景开始,先用不怎么智能的方法来实现这些基本功能。我们在这一节中,将使用Java中的JDBC技术,实现对数据库内容的增删改查操作,同时使用PHP中的Mysqli技术,实现同样的功能,通过这个具体的实例,让大家感觉一下,实际中的代码生成,究竟可以实现什么功能。
我们在具体讲数据库获取代码生成之前,我们先来熟悉一下Jinja2的语法知识。我们以Jinja2应用的典型场景为例,来看一下,Jinja2怎样动态通过模板文件,生成标准的HTML文件,从而实现Web应用中的模板技术。
我们为了控制项目中用到的库文件,不与系统中的库文件冲突,我们先建立项目自己的虚拟环境。在anaconda下面,建立虚拟环境最方便的方法是使用conda命令,假设我们要建立的虚拟环境名称为cgai(Code Generation by Artificial Intelligence),则命令为:
conda create -n cgai
接下来,我们激活这个虚拟环境:activate cgai,如果我们要关闭这个虚拟环境,只需运行:deactivate cgai即可。激活了虚拟环境之后,在命令提示符前会有(cgai)提示。
我们先在根目录下建立exp目录,专门用于存放我们的实验性代码,截至目前为止,程序的目录结构应该为类似如下所示的结构:
我们先来写一个最简单的Jinja2测试程序exp/t001.py,如下所示:
import sys sys.path.append('./libs/jinja') from jinja2 import Template template = Template('Hello {{ name }}') rst = template.render(name='Yt') print(rst)
然后我们来编写程序入口主文件app_main.py:
import exp.t001
运行程序:python app_main.py
则系统应该可以打印出昨天我们的例子中打印的内容。这就说明我们新的目录结构是正确的。
下面我们来看一个实际一点儿的例子,在这个例子中,我们要显示用户王三购物车中的内容,假设购物车中有一个产品列表,每个产品包括产品名称、数量和价格,我们想要在HTML页面上显示这个产品的列表。
如果使用Jinja2的话,我们第一步就是生成一个模板文件,如下所示:
<!doctype html> <html lang="cn"> <head> <meta charset="UTF-8" /> <title>{{ title }}</title> <meta name="description" content="{{ description }}" /> </head> <body> <div id="content"> <p>欢迎{{ userName }}!您的购物车:</p> <ul> {% for item in items -%} <li>{{ item.name }}---{{ item.quantity }}---{{ item.price }}---{{ item.quantity * item.price }}</li> {% endfor -%} </ul> </div> </body> </html>
下面我们在exp/t001.py中利用jinja2解析模板文件,生成正确的HTML文件,如下所示:
import sys sys.path.append('./libs/jinja') import codecs from jinja2 import Template import jinja2 as jinja2 #template = Template('Hello {{ name }}') #rst = template.render(name='Yt') #print(rst) templateLoader = jinja2.FileSystemLoader( searchpath="d:/" ) templateEnv = jinja2.Environment( loader=templateLoader ) TEMPLATE_FILE = "d:/abiz/cgai/exp/p001.jt" template = templateEnv.get_template( TEMPLATE_FILE ) items = [ {"name": "笔记本电脑", "quantity": 1, "price": 5900.00}, {"name": "iPhone7 plus", "quantity": 1, "price": 7900.00}, {"name": "编程入门", "quantity": 3, "price": 59.00} ] templateVars = { "title" : "我的购物车", "description" : "中国最大电子商务平台,京东商城、天猫商城的终结者", "userName" : "王三", "items": items } outputText = template.render( templateVars ) print(outputText) outFile = codecs.open('d:/abiz/cgai/exp/p001.html', 'w', 'utf-8') outFile.write(outputText) outFile.close()
这段代码的结构还是比简单的,程序首先初始化Jinja2的环境,获取到模板文件。然后我们定义购物车内容为items,最后定义页面所用到的变量templateVars,最后调用jinja2来解析模板文件,对变量表达式、逻辑控制、循环结构等进行替换,生成正确的HTML文件。这里需要注意的一点是,我们在Windows下,文件的缺省编码为Ascii,所以我们在写文件时,需要显示的指定文件编码为utf-8。
运行程序:python app_main.py后,会得到p001.html文件,内容如下所示:
<!doctype html> <html lang="cn"> <head> <meta charset="UTF-8" /> <title>我的购物车</title> <meta name="description" content="中国最大电子商务平台,京东商城、天猫商城的终结者" /> </head> <body> <div id="content"> <p>欢迎王三1!您的购物车:</p> <ul> <li>笔记本电脑---1---5900.0---5900.0</li> <li>iPhone7 plus---1---7900.0---7900.0</li> <li>编程入门---3---59.0---177.0</li> </ul> </div> </body> </html>
通过这个简单的例子,我们可以看到,Jinja2代码生成的能力还是很强的,在下一节中,我们将带领大家利用这一技术,利用模板技术,自动生成数据库访问代码。
Similar Posts:
- 如何高效地使用XCodeFactory自动生成的数据层代码(一)
自从将XCodeFactory开放给大家以后,有不少朋友email来问如何使用或如何更好的使用自动生成的数据层代码的问题.在此分两期给出一个详细的答复,但愿XCodeFactory能很好地协助大家. 大家可以看到,所有自动生成的数据访问类,都继承自IDBAccesser接口,IDBAccesser接口规范了所有的数据访问操作.IDBAccesser定义于EnterpiseServerBase类库中,其外形如下: // IDBAccesser 即数据库访问基础接口,IDBAccesser提供了对A
- 某政府网站被加入的自动下载病毒文件的代码变了花样(第3版)
endurer 原创 *2006.02.11 第3版 江民KV2006将xxxxx.pif报为Backdoor/Huigezi.arz *2006.02.09 第2版 瑞星2006将xxxxx.pif报为Backdoor.Gpigeon.adg(18.09.21版本加入) *2006.01.05 第1版 今天在浏览前几天刚发现的那个被加了被加入自动下载病毒文件的代码的政府网站时( 详见: 某政府网站被加入自动下载病毒文件的代码(第2版) ),发现其中自动下载病毒文件的代码变了,转了一次弯. 首先
- c#连接sqlserver数据库、插入数据、从数据库获取时间示例
c#连接sqlserver.插入数据.从数据库获取时间 代码如下: using System; using System.Data.SqlClient; namespace Test { //连接数据库 public class Connection { private static string connectionString = "Server = 192.168.1.222;" + "Database = Test;" + "User ID = T
- 7、连接sql数据库获取坐标绘制Graphics
连接sql数据库获取坐标绘制Graphics 1. 建立数据库,存储点位信息如下: 数据库名称:SDB; 表名称:SDB_Node NodeID X Y 1 33 33 2 100 100 3 44 100 2. 连接数据库,读取信息! 本例采用将后台读取的坐标信息按照一定格式拼接成字符串的形式传回js,然后再在js中将字符串中的坐标信息截成单个的坐标,然后绘制Graphic 注意,因为js是前台代码,所以要在后台建一个公共的字符串存储坐标信息. public string XY = "&quo
- Elasticsearch安装及自动同步mysql数据库数据
Elasticsearch安装及自动同步mysql数据库数据 1 环境: CentOS 6.4 x64 JDK1.8.0_45 2 Elasticsearch的安装 1 下载elasticsearch安装包: https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.5.2.tar.gz 2 将下载完成的安装包上传到服务器的/usr
- Asp.net mvc 2 in action 笔记- 4 自动代码生成、校验Validation
自动代码生成 T4 (Text Template Transformation Toolkit) is a little-known feature of Visual Studio. It’s a code-generation toolkit, and its templates allow us to customize how files are generated using a familiar syntax. T4MVC Out of the box, ASP.NET MVC co
- 自动备份Oracle数据库
自动备份Oracle数据库 正在看的ORACLE教程是:自动备份Oracle数据库. 相信为数不少的系统管理员每天都在做着同一样的工作--对数据进行备份.一旦哪一天疏忽了,而这一天系统又恰恰发生了故障,需要进行数据恢复,那么此时就无能为力了.假如每天设定一个固定的时间,系统自动进行备份,那该多好啊!下面笔者结合实践经验,谈一谈UNIX环境下Oracle数据库的自动备份,以起到抛砖引玉的作用. 我们计划让数据库在晚上23点做export导出备份,在凌晨2点将备份文件拷贝到磁带上,在凌晨4点将备份文
- 在非本数据库获取表的标识列名称
在非本数据库获取表的标识列名称 --2000 SELECT name from pubs..syscolumns WHERE id = object_id('pubs..test') and autoval is not null --2005 SELECT name from pubs..syscolumns WHERE id = object_id('pubs..test') and colstat =1
- Arduino第四次实验—自动垃圾清除车-中断代码调式
作者 :alajl 日期: 2011-4-18 标题: Arduino第四次实验 -自动垃圾清除车 -中断代码调式 原文链接: http://blog.csdn.net/alajl 关于 attachInterrupt(),我想说点什么: 这个是一个中断函数,由于许多数字传感器的状态只有 0, 1,两种状态,所以用这个方法来触发一个事件,是相当好不过了,例如: 1.寻线传感器,从线内到了线外, 0到 1的改变,或者是 1到 0的改变,这个改变取决于你线的颜色,一般黑色是 0,白色是 1 2.红外
- MYSQL用批处理命令自动删除重建数据库实现压缩ibdata1文件容量
MYSQL用批处理命令自动删除重建数据库实现压缩ibdata1文件容量 一.友情提醒,以下操作会删除数据库,请事先自行备份数据库文件 欢迎转载:http://blog.csdn.net/aminfo/article/details/19507491 二.需要3个文件,以下为3个文件的文件名及内容: 文件1:Mysql_Drop_DataBase.txt,内容如下: drop database yourdatabase; 文件2:Mysql_Create_DataBase.txt,内容如下: cr