Python 实战(1):在网页上显示信息

上次简单介绍了 web.py。今天先来粗略解释下那个 hello world 页面的代码:

import web

导入 web.py 模块。

urls = ( '/', 'index' )

这是指定网站 url 的匹配规则,左边是正则表达式,右边是对应处理函数的名称。

class index: def GET(self): return "Hello, world!"

这便是处理请求的函数 index。GET 和 POST 是 HTTP 的两种请求方式,一般来说,GET 用于请求网页,而 POST 多用于提交表单。举个不严谨的栗子:当你在浏览器地址栏中输入一个地址并按下回车,就是发送了一个 GET 请求;而当你在打开的页面中输入用户名和密码,点击登录按钮,则是发送了一个 POST 请求。这里的 GET 函数描述了对于一个 GET 请求的处理方式:直接返回一个字符串。

if __name__ == "__main__": app = web.application(urls, globals()) app.run()

最后,当这个代码文件被执行时,我们将创建一个 application,它会按照我们定义的 url 规则进行对应的处理,并在后台一直运行,独自等待请求的到来。

插一句:由于这个系列的文章侧重于“实战”,所以我只会搬开挡在道路正前方的石头,对于涉及的诸多细节无法面面俱到。即使这段简单的 hello world 代码中,关于 url 的正则匹配、GET / POST 的区别等,都可说上很多。但现在我只能略过。如有疑问,欢迎在QQ群和论坛上讨论。

仅仅在页面上显示 hello world 显然不能满足我的需求。我是想要一个关于电影的网站,那最起码得在页面上显示一些电影的信息吧。

一种显而易见的方法是,把要显示的信息拼成字符串,然后返回。

在代码里定义一组数据,一个由 dict 组成的 list:

movies = [
 {
 'title': 'Forrest Gump',
 'year': 1994,
 },
 {
 'title': 'Titanic',
 'year': 1997,
 },
]

然后把 GET 方法改为:

def GET(self): page = '' for m in movies: page += '%s (%d)\n' % (m['title'], m['year']) return page

movies 是一个包含了影片标题和年代信息的 list。在 GET 方法中,把 movies 里每一条内容取出来,拼接成一整个字符串,作为结果返回。

如果你之前已经运行了 code.py,刷新页面将会看到新的内容:

Forrest Gump (1994) Titanic (1997)

是不是有点类似在命令行输出结果或者在文本文件中存储内容?但作为一个网页,如果以后要添加更多的显示效果和交互功能,这样写肯定是要跪。好在 web.py 给我们提供了一种更方便的页面展示方式 -- 模板。

刚才我们用的方法类似于在 Python 里写 HTML,这是比较痛苦的。而 web.py 的模板是让你能在 HTML 里写 Python。

首先我们需要在代码里指定模板:

render = web.template.render('templates/')

在 GET 方法里调用模板:

def GET(self): return render.index()

模板的返回值就是一个处理好的页面,所以直接 return 就可以了。

然后在项目文件夹,也就是 code.py 所在的目录下新建一个叫做 templates 的目录,里面新建一个 index.html 文件作为模板。注意这里的 templates、index 命名都需要与你代码里的设定一致。如果你是吧一个 muban 文件夹下的 shouye.html 作为模板,那相应代码就应改为:

render = web.template.render('muban/') render.shouye()

在模板 index.html 里写下:

<h1>Crossin's Movie Site</h1>

h1 是 HTML 中表示标题的标签。保存 code.py 和 index.html 后刷新页面,你将会看到一行很大的标题:

Crossin's Movie Site

这表示模板已经生效了。但 movies 的信息仍然没有显示。如果需要在模板中显示信息,需要将信息传递给模板:

def GET(self): return render.index(movies)

然后在模板里,接收并使用传递进来的参数:

$def with (movies) <h1>Crossin's Movie Site</h1> $movies

web.py 模板中的 $def with 表示这个模板中将要使用的变量。注意务必把它放在模板的第一行。如果有多个参数,需要全部依次列在括号中。

$movies 则表示获取 movies 变量的值。

保存刷新,页面上已经可以看到我们在代码中定义的 movies 信息了,但还是 list 直接转换字符串的效果。

更近一步地,我们可以在模板中对数据进行操作,让它们看起来更顺眼一点:

$for movie in movies: <li> $movie['title'], $movie['year'] </li>

模板中的语法和 Python 类似,只是前面需要增加 $ 符号。缩进依然需要按照 Python 中的规范。li 是 HTML 中列表的标签。

这时候,页面上已经就能以列表的形式显示电影信息了(封面图所示)。尽管依然简陋,但一切才刚刚开始,我们的征途是星辰大海。

(相关代码文件已上传在论坛的帖子里)

原文发布于微信公众号 - Crossin的编程教室(crossincode)

原文发表时间:2015-04-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xingoo, 一个梦想做发明家的程序员

Volatile的作用

众所周知,volatile关键字可以让线程的修改立刻通知其他的线程,从而达到数据一致的作用。那么它具体涉及到哪些内容呢? 关于缓存 计算机最大的存储空间就...

2228
来自专栏企鹅号快讯

使用postman快速建立MOCK使用篇

首先介绍一下Mock,借用一下百度百科解释:mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法, 其...

9805
来自专栏前端杂货铺

node模块加载层级优化

模块加载痛点 大家也或多或少的了解node模块的加载机制,最为粗浅的表述就是依次从当前目录向上级查询node_modules目录,若发现依赖则加载。但是随着应用...

3748
来自专栏北京马哥教育

Linux 初步知识详解

1. 描述计算机的组成及其功能 一个完整的计算机系统由硬件系统和软件系统两大部分组成 冯诺依曼体系下的计算机五大部件 CPU:运算器、控制器、寄存器、缓存(一二...

3927
来自专栏沈唁志

ThinkPHP-PHP开发中的主流框架

8554
来自专栏我就是马云飞

JJEvent 一个可靠的Android端数据埋点SDK

注:代码已经经过线上项目验证, 横向Google统计对比,统计数据无丢失,性能稳定.

4324
来自专栏信安之路

绕过内容安全策略总结

今年的 0CTF 预选赛 6 道 web 题,其中三道都涉及 CSP 的知识点,简直可怕。。。这次趁着空闲时间就稍稍总结一下 CSP 绕过方面的知识,无论是对以...

2390
来自专栏Java成神之路

Java微信开发_Exception_03_errcode:48001 errmsg:api unauthorized hint

异常信息:errcode:48001 errmsg:api unauthorized hint

1384
来自专栏Android开发实战

HTTP1.0、HTTP1.1和HTTP2.0的区别

早在HTTP建立之初,主要就是为了将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。也是说对于前端来说,我们所写的HTML页面将要放在我们的w...

2143
来自专栏极客猴

pustil - 获取系统信息库

运维工程师经常使用 Python 编写脚本程序来做监控系统运行的状态。如果自己手动使用 Python 的标准库执行系统命令来获取信息,会显得非常麻烦。既要兼容不...

1471

扫码关注云+社区

领取腾讯云代金券