web.py——简单而且功能强大的Python web 框架(3):模板

时间:2024-03-27 11:52:54

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, 输出结果如下:
web.py——简单而且功能强大的Python web 框架(3):模板