更多课程 选择中心

Python培训
美国上市教育机构

400-111-8989

Python培训

Python实战【第八节】连连看

  • 发布:Python培训
  • 来源:Crossin的编程教室
  • 时间:2019-03-25 15:26

欢迎大家来到Python自学教程实战篇,我们上次课在详细页面上加了海报,但是我们数据库里边的一些重要信息似乎还没有用上,比如演员和导演,如何将影片与导演、演员关联起来呢?怎么样才能实现我一下搜索出我喜欢的演员的所有影片呢?这一讲我们就一起来探讨一下:

Python实战【第八节】连连看

仔细看过之前抓取豆瓣影片信息的代码就会发现,豆瓣 API 中是以列表形式提供演员和导演信息。而我在抓取时,将其简化,只是选取了其中的姓名,用逗号(,)拼接起来,作为一个字符串存储在数据库中。因此,如果只是想显示出这些信息,可以简单地实现:

<p>主演:$movie.casts</p>

不过现在我们不仅仅要显示主演的名字,还希望能通过主演关联到其他影片。所以这里需要把这些名字分开,并分别加上超链接。

之前课程中说过,web.py 模板可以让你在 HTML 里写 Python。我们现在就需要在模板里对主演名称的字符串做一些处理:

$ casts = movie.casts.split(',')

<p>主演:

$for cast in casts:

<a href="">$cast</a>

</p>

$ 符号开头的代码将会以 Python 的语法执行。需要特别注意的是,$ casts 之间有一个不可缺少的空格,这个空格说明这里是定义了一个新的变量 casts,而不是获取变量 casts 的值。

通过 split 方法将主演名字拆分成一个字符串列表,再通过 for 循环,将其中每一项拿出,加上 a 标签,做成一个超链接。超链接的地址暂时为空,我们还没有能够处理点击演员名的合适页面。

此时刷新页面,可以看到详细页面上已有了演员信息,并且每个名字下面有一个下划线。只是点击之后并不会有特别的反应。

我们是通过在页面模板中处理演员信息,当然你也可以选择另一种方法,即在后台的响应函数,也就是 class movie 的 GET 方法中,将演员信息处理好,作为额外一项参数传递给模板。

那么接下来的问题,点击了演员名称之后要如何处理。我的想法是进行一次搜索,搜索所有影片演员信息中包含此演员名的电影。因为我们的演员信息是一个字符串存储的,所以可以采用之前搜影片名称类似的方法进行。这样会比较省事,但不足之处是,无法区分名字相同或部分相同的情况。而搜索结果的显示,则可以直接复用 index 模板。

首先在 url 里添加跳转规则:

urls = (

'/', 'index',

'/movie/(.*)', 'movie',

'/cast/(.*)', 'cast',

)

然后是处理的方法:

class cast:

def GET(self, cast_name):

condition = r'casts like "%' + cast_name + r'%"'

movies = db.select('movie', where=condition)

return render.index(movies)

此处的 GET 方法和 index 里的 POST 方法差不多,唯一不同只是把搜索条件从 title 改为 casts。

最后,再把新增的跳转地址加入到刚刚空着的 a 标签里:

<a href="/cast/$cast">$cast</a>

这里几个名称都用了“cast”,别搞混了。为了区分对于,你也可以分别改为其他名字 cast_name、url_cast、cast_value 等。

这样就已完成演员名的搜索。现在再点击演员名,就可以跳转到搜索结果的页面。

然而,这时候你很可能发现,点击搜索出的结果,并不能再跳转到其他电影的页面(至少我这里是这样)。看了一下,页面被跳转去了

http://127.0.0.1:8080/cast/movie/123456

而不是预想的

http://127.0.0.1:8080/movie/123456

查了代码,原来 问题出在 a 标签的 href 属性上:

"movie/$movie['id']"

前面没有加 /,是表示当前页面下的 movie/xxx 地址,而加了 / 才表示主域名下的 movie/xxx 地址。之前都是从主域名下进行搜索,跳转不会有问题了,而现在一旦使用在 /casts 页面下,跳转就不对了。只要多加上 /,改为

<a href="/movie/$movie['id']">$movie['title']</a>

就没有问题了。

以同样的方式,可以再把导演信息加入搜索功能,这里就不再赘述,各位自行完成。

试着搜了下,发现豆瓣的 top250 里还是比较偏重华语片和老片的。比如张国荣的有 8 部,而克里斯蒂安·贝尔只有 2 部。

恭喜您在Python自学的道路上又坚持了一天,我们目前学习的知识比之前的要复杂一些,但是也比之前的有趣多了,所以希望大家跟上我们的步伐,继续加油!

免责声明:内容和图片源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:Python实战【第七节】放开那只海豹
下一篇:Python实战【第九节】心中有数

【Git第八节】移除文件

【Python实战】四行Python代码就能知道你那的天气,你敢信?

Python实战【用Python写游戏第十三节】exe打包

Python实战【用Python写游戏第十二节】屡败屡战

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省