WEB服务器在生成HTML网页时,有两个选择,
一个是从HTML代码里嵌入执行代码来生成HTML页面返回
一个是从代码里嵌入HTML来生成HTML页面返回
这两种方式,其实都有使用,比如在嵌入式系统里,往往就是使用C或C++来生成HTML页面,这些是嵌入在C++代码里面的。但是这种方式是有它的缺点的,比如一个淘宝上页面,其实很多图片资源和网页的样式是固定的,只要少部分数据需要从数据库里找出来,再填充生成的,这时变动的数据非常小,就可以把固定的数据变成一个模块。
但是当需要修改图片资源时,就不方便了
总之,在 Python 中写 HTML 不是聪明的选择,相反在 HTML 中写 Python 则有趣的多。幸运的是,web.py可以让这件事情做得简单而又漂亮。
给模板新建一个目录(命名为 templates),在该目录下新建一个以 .html 结尾的文件,内容如下:
<em>Hello</em>, world!
或者也可以在模板中使用 web.py 模板支持代码:
$def with (name)
$if name:
I just wanted to say <em>hello</em> to $name.
$else:
<em>Hello</em>, world!
如上,该模板看起来就像 python 文件一样,除了顶部的 def with (表示从模板将从这后面取值)和总是位于代码段之前的$。当前,template.py 首先请求模板文件的首行 $def 。当然,你要注意 web. py 将会转义任何任何用到的变量,所以当你将 name 的值设为是一段 HTML 时,它会被转义显示成纯文本。如果要关闭该选项,可以写成 $:name来代替 $name。
回看再看 test . py。在第一行之下添加:
render = web.template.render('templates/')
这会告诉web.py到你的模板目录中去查找模板。然后把 index.get改成告诉 web.py 在你的模板目录下查找模板文件。
修改类方法 index.get ,如下:
def GET(self):
name = 'Bob'
return render.index1(name) #‘index1’是模板的名字,’name’ 是传入模板的一个参数
访问站点就将显示 hello Bob。
但是如果我们想让用户自行输入他的名字,该怎么办?就需要修改index.get如下:
i = web.input(name=None)
return render.index1(i.name)
访问 / 将显示 hello world,访问 /?name=Joe 将显示 hello Joe。
显然URL 的后面的 ? 看起来不好看,把?修改下 URL 映射:
‘/(.*)’, ‘index’
然后修改下 index.get:
def get(self, name):
return render.index1(name)
现在访问 /Joe 看看,它会显示 hello Joe。
import web
urls = (
'/(.*)', 'index'
)
app = web.application(urls, globals())
render = web.template.render('templates/')
class index:
def GET(self, name):
i = web.input(name=None)
return render.index(i.name)
if __name__ == "__main__":
app.run()
需要模板的目录里创建一个文件templates\index.html,它内容如下:
$def with (name)
$if name:
I just wanted to say <em>hello</em> to $name.
$else:
<em>Hello</em>, world!
然后运行程序之后,就可以在浏览器里输入连接地址:http://127.0.0.1:8080/?name=caimouse, 输出结果如下: