设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 44067|回复: 24
打印 上一主题 下一主题

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

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
楼主
发表于 2015-4-19 22:56:23 |显示全部楼层 |倒序浏览
someweb-03.png
现在我们网站已经有了一个简单的页面、一段简单的请求处理代码和一个简单的数据库。上次最后我剧透了下,之后将会通过豆瓣电影的 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。现在这个网站看起来已经有那么点意思了。


someweb-3-code.py (516 Bytes, 下载次数: 427)
someweb-3-movie.html (165 Bytes, 下载次数: 347)
someweb-3-tables.sql (3.63 KB, 下载次数: 327)
someweb-3-index.html (185 Bytes, 下载次数: 334)


#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2015-8-3 13:59:44 |显示全部楼层
pilipala2357 发表于 2015-8-2 21:15
先生你好!我运行完第一个页面可以打开,第二个页面not found...我的代码跟附件里的一样 ,直接复制的,数 ...

很多可能,url的匹配规则不对,数据库的id不对,查询语句有问题
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

板凳
发表于 2016-10-21 13:26:30 |显示全部楼层
紫色de红薯 发表于 2016-10-21 09:45
请问先生, at /movie/1
                 unrecognized token: "$"
哪里出错了?

sqlite执行的时候错了,应该是你执行的sql语句不对吧。

你可改一下,先把执行语句拼出来,确认没问题,再传给 sqlite 执行。
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

地板
发表于 2016-11-1 16:59:25 |显示全部楼层
winmount 发表于 2016-10-31 21:55
解决了先生,我把movie_id=int(movie_id)前的int去掉就能显示了。。。请问先生这是为什么呢。。。 ...

这个不太清楚,之前也有人遇到,感觉是不是新版本sqlite或者webpy做了调整,之前这里用不用int应该都可以
现在有时候用了反而不对,有的是说语法问题
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

5#
发表于 2016-11-30 14:51:52 |显示全部楼层
cxh19920318 发表于 2016-11-30 12:26
先生,一直出现附件里的问题。请问是怎么回事?第一个页面打开正常,代码也是直接复制的。

movie = db.select('movie', where='id=$movie_id', vars=locals())[0]

这里改成文章中说的另一种方法:

condition = 'id=' + movie_id
movie = db.select('movie', where=condition)[0]
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

6#
发表于 2017-1-12 17:49:44 |显示全部楼层
royliu 发表于 2017-1-12 17:20
这个问题,看下SQL文件里的ID是数字类型还是字符串类型,两种类型我都测试了下,如果sql文件中ID是整形, ...

是的,版本直接会有差异
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

7#
发表于 2017-2-2 10:36:46 |显示全部楼层
shmxz1989 发表于 2017-2-1 17:42
求助:首页能打开,详细页打开就不行了。看提示是编码问题?可我把movie.html文件里的内容在英文输入法状态 ...

我现在也看不出是哪里问题,你得进一步调试。

把 movie.html 的内容简化,去掉中文,去掉数据库获取的数据,看看还报不报错。
如果还报错,就还是你html文件的问题

然后逐步测试是中文的问题,还是数据库数据的问题

#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

8#
发表于 2017-2-2 16:04:13 |显示全部楼层
shmxz1989 发表于 2017-2-2 14:11
按照C大你说的方法都试过了,还是不行,按说应该就是movie.html文件的问题了,可index.html为什么又是正常 ...

一步一步来,别把问题混到一起。
你现在什么都不加还报错,那就是movie.html这个文件的问题,那你先别往里加内容啊。最简单的输出一行hello world还出错,那你先把这个文件的问题解决掉再说
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

9#
发表于 2017-2-3 14:07:19 |显示全部楼层
shmxz1989 发表于 2017-2-3 13:08
嗯,现在情况是这样:
换成“hello world”重新建的movie.html也试过,依然是万年不变的出错提醒。。。
后 ...

不好说,看不到你的具体报错位置(截图上没截到)
删了还出错,那可能是数据库里的编码问题。但如果真是这样,列表页也应该出错。

怀疑是不是有其他地方弄乱了,你自己也没发现。建议你先全部用英文数据重新做一遍。
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

10#
发表于 2017-2-5 00:14:15 |显示全部楼层
shmxz1989 发表于 2017-2-3 16:02
报错截图我重新截图了,不知道能否看出什么信息来,菜鸟一枚,还望见谅。
'utf8' codec can't decode byte ...

似乎确实有这么个问题,之前好像有人遇到过。
解决了就好
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-5-3 18:22 , Processed in 0.028837 second(s), 25 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部