专栏首页Crossin的编程教室Python 实战(3):更多的页面

Python 实战(3):更多的页面

现在我们网站已经有了一个简单的页面、一段简单的请求处理代码和一个简单的数据库。上次最后我剧透了下,之后将会通过豆瓣电影的 API 获取更多的电影数据。不过在此之前,我要先把网站的结构再稍微扩展一下。暂时仍使用手工添加的几条测试数据来演示。

本篇的目标就是,让这个电影网站更像一个“网站”:有一个首页,首页上有影片的列表,点击列表中的某一部影片可以进入其详细页面。也不是很复杂,哦?

所以,如果我们把之前的 index.html 作为首页的话,还需要一个额外的新页面,用来展示一步影片的详细信息。同之前创建页面类似,首先在 urls 里增加一条跳转:

urls = (
    '/', 'index',
    '/movie/(\d+)', 'movie',
)

d+ 是正则表达式,表示一个数字,之前的基础课程中有提到过(微信中回复 55 可查看)。加上了括号,是为了让这个匹配到的数字可以被程序获取,成为后面所指向的 movie 中对应方法的参数。

这里,为了更好地定位数据库中的影片信息,我稍稍改动了之前的表结构,新增了一项属性 id:

create table movie (
 id,
 title,
 year,
 country,
 abstract
);

相应的,每条影片数据的 insert 语句也增加了一个唯一的数字作为 id。你需要重新生成并导入一遍数据库。

(当然,你也可以不加 id,而使用影片的 title 作为查找影片的依据。那样的话,urls 里就不要使用 \d+,而改用 .*。但这样,同名影片会有问题。)

新增处理请求的类 movie:

class movie:
    def GET(self, movie_id):
  movie_id = int(movie_id)
        movie = db.select('movie', where='id=$movie_id', vars=locals())[0]
        return render.movie(movie)

(手机上一行代码过长会被换行,请自行注意。建议横屏或在电脑上查看。)

当在浏览器中访问诸如 /movie/123 的地址时,请求被转到 movie 中的 GET 方法,而 123 就成为参数 movie_id。

select 是 web.py 提供的数据库查找方法,第一个参数是查询的表,参数 where 是查询条件,指定条件为'id=$movie_id',vars表示参数的查询来源。

这里略有些复杂。首先,方法里拿到的 movie_id 是字符串,所以需要转成 int。where 条件是一个将被拿到数据库中执行的查询条件,需要是一个字符串。同模板中一样,这里 $movie_id 是取变量 movie_id 的值,而 vars=locals() 则表示 $ 符号所取变量的范围为所有本地变量。select 拿到的是一组查询结果,后面加上 [0] 才能拿到具体的一个数据对象。

其实,对于现在这种简单查询,你也可以自己拼好查询字符串,看上去更简洁一些:

condition = 'id=' + movie_id
movie = db.select('movie', where=condition)[0]

接下来,要新增此页面的模板 movie.html:

$def with (movie)
<h1>$movie.title</h1>
<p>$movie.year</p>
<p>$movie.country</p>
<p>$movie.abstract</p>

这里拿到的不再是一个 list,而是单独一个对象,把其中的属性输出来即可。

再次 run 起你的网站程序 code.py。现在访问 127.0.0.1:8080/movie/1 就可以看到你添在数据库中,id 为 1 的影片的详细信息。

最后,为了让 index 和 movie 页面可以连为一体,我们来增加一些“超链接”,html 的语法为:

<a href="链接跳转的地址">链接显示的文字</a>

顺便再加上一些可有可无的修饰性文字:

[index.html]
$def with (movies)
<h4>欢迎来到</h4>
<h1>Crossin's Movie Site</h1>
<hr>
<p>影片列表:</p>
$for movie in movies:
 <li>
 <a href="movie/$movie['id']">$movie['title']</a>
 </li>

在这个 <a> 标签中,movie 的 title 作为链接文字,id 拼接成跳转的地址。

[movie.html]
$def with (movie)
<h4><a href="/">返回首页</a></h4>
<h1>$movie.title</h1>
<hr> 
<p>年代:$movie.year</p>
<p>国家:$movie.country</p>
<p>$movie.abstract</p>

OK。现在这个网站看起来已经有那么点意思了。

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

本文分享自微信公众号 - Crossin的编程教室(crossincode)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-04-19

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python 实战(5):拿来主义

    有了列表,有了详细信息,有了搜索,这个电影网站已经有了基本的结构。现在要做的是:获取更多的内容。 我们没有必要也不可能自己去生产数量庞大的电影信息,互联网上的资...

    Crossin先生
  • Python 实战(2):简单的数据库

    上一次,我们已经在网页上显示出了我们要的影片信息。只是,这些信息是我直接在代码中用 dict 变量来定义的。试想以后网站要包含成千上万条影片信息,需要时常更新,...

    Crossin先生
  • Python 实战(7):连连看

    上次课在详细页面上加了海报。除此之外,数据库里还有其他很多信息我们没有用上,比如演员和导演。这些信息还有个重要的作用,就是把不同的影片关联起来。比如你看了一部电...

    Crossin先生
  • 你知道豆瓣电影是怎么评分的吗?

    “假设,是针对我们的分析结果而言。你希望最后输出一个什么结果,或者你需要证明什么结果,都可以当做假设!”

    小一不二三
  • 爬虫实战-手把手教你爬豆瓣电影

    如果上面三小节还有问题,可以点回去再复习一下。作为基础内容并不是要求大家一定都掌握,特别是第三小节,网页解析用法特别多,一般人很难都记住。 我在写这篇的时候也...

    小一不二三
  • 爬虫实践--豆瓣电影当前上映电影信息爬取

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    村雨遥
  • Python 实战(5):拿来主义

    有了列表,有了详细信息,有了搜索,这个电影网站已经有了基本的结构。现在要做的是:获取更多的内容。 我们没有必要也不可能自己去生产数量庞大的电影信息,互联网上的资...

    Crossin先生
  • 电影知识图谱问答(二)|生成298万条RDF三元组数据

    本篇文章接《电影知识图谱问答(一)|爬取豆瓣电影与书籍详细信息》,学习如何利用爬取的数据,构建知识图谱所需的三元组。主要内容包括如何从Json类型的数据,转换成...

    小一
  • 【报告】2016-2020年Edtech创业趋势预测(80页完整版)

    【新智元导读】教育科技(EdTech)行业投资火热,2015年,中国教育投资总额已经超过美国居世界第一,近四年复合增长率达32%。人工智能等前沿科技对严重依赖技...

    新智元
  • (五)Hive的UDF、UDAF和UDTF自定义函数

    order by(全局排序):不经常用 sort by+distrbutre by :经常用

    wolf

扫码关注云+社区

领取腾讯云代金券