设为首页收藏本站

Crossin的编程教室

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

Python 实战(4):搜一下

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
楼主
发表于 2015-5-3 15:54:43 |只看该作者 |正序浏览
someweb-04.png
一个内容型网站如果不能进行站内搜索,那是会令人抓狂的。都说知乎的搜索不好使,可人家好歹也是有的。所以我们的电影网站至少也得有个搜素框。

那么要如何做呢?HTML 里有一个 form 标签,它的作用是创建一个表单,用来提交一些数据。诸如搜索、登录、评论等操作,都可以通过 form 标签来解决。前面说过,我们直接在流量器里访问一个 url 地址是向服务器发送了一个 GET 请求。而用 form,就可以选择使用 POST 请求,从而更方便更安全地传递数据。

这件事情的大体思路是,在首页上通过 form 标签增加一个搜索框。当用户输入文字点击搜索后,会向服务器发送一个 POST 请求。服务器端的代码里拿到请求中的文字,在数据库里搜索标题中包含此文字的影片列表,返回给首页模板进行显示。

在首页模板 index.html 中添加搜索框:

<form action="/" method="post">
        <input type="text" name="title" />
         <input type="submit" value="搜索" />
</form>

action 是请求的地址,这里选择向首页请求,method 表示方法是 POST。input 是表单中的元素,type="text" 表示一个文本框,name="title" 在服务器端处理数据时会用到。type="submit" 表示一个提交按钮,value="搜索" 是按钮上显示的文字。

添加完之后刷新页面,可以看到已经有了一个搜索框。不过此时输入内容并点击“搜索”后,页面会显示 None。这是因为服务器端的 index 类中还没有对 POST 请求做相应的处理。所以,在 code.py 里,index 类中的 GET 方法下,增加一个类似的 POST 方法:

def POST(self):
   data = web.input()
   condition = r'title like "%' + data.title + r'%"'
   movies = db.select('movie', where=condition)
   return render.index(movies)

web.input() 拿到的是表单传入的数据,data.title 就是用户输入的文本。与 GET 方法中获取数据库中所有影片不同,这里额外增加一项搜索条件:

title like "%搜索内容%"

这里用r''是为了防止 python 默认对于字符串中 % 的转义。

like 是 SQL 的语法,% 表示匹配 0 到任意多个字符。这里对应完整的 SQL 查询语句是:

select * from movie where title like "%搜索内容%";

执行效果是查询出所有标题中包含(搜索内容)的影片数据。

此时再点击搜索,便可看见,首页上的影片列表只会列出符合搜索条件的影片标题。在之后数据量增加的情况下,这个小小的功能将会大有用处。


someweb-4-code.py (645 Bytes, 下载次数: 208)
someweb-4-index.html (303 Bytes, 下载次数: 180)


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

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

38#
发表于 2019-8-20 22:23:31 |只看该作者
boat 发表于 2019-8-17 08:33
这一课最大的问题是编码的问题,出现中文都会报错。
首先是pycharm里,要确认是utf8编码
可以参考文章https ...

webpy的坑确实有点多
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

146

积分

注册会员

Rank: 2

37#
发表于 2019-8-17 08:33:11 |只看该作者
这一课最大的问题是编码的问题,出现中文都会报错。
首先是pycharm里,要确认是utf8编码
可以参考文章https://segmentfault.com/q/1010000007395685/检查一下自己的默认编码格式
然后是两个html文档,记事本的默认编码格式不是utf8,可以用其他的来修改。我用了notepad++
最后是MySQL的默认编码格式。这个真的费了我很长时间,一直报错,最后终于找到了下面的文章,成功解决问题。
参考文章https://blog.csdn.net/qq_31683121/article/details/73371697
回复

使用道具 举报

1

主题

0

好友

43

积分

新手上路

Rank: 1

36#
发表于 2018-5-10 15:40:44 |只看该作者
crossin先生 发表于 2018-5-10 14:42
报405是没有找到POST方法
没看出代码问题

额,按照先生说的统一了空格和Tab之后果然就可以搜索了……没想到会出现这种问题……
十分感谢先生!
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

35#
发表于 2018-5-10 14:42:26 |只看该作者
2894386560 发表于 2018-5-9 21:06
按照教程做到这课,也是碰到了405 Method Not Allowed 的问题,百度之后也没能解决掉这个问题,在网页搜索 ...

报405是没有找到POST方法
没看出代码问题

唯一可能的是,你把你代码里 空格和Tab 统一了之后再重新试下
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

1

主题

0

好友

43

积分

新手上路

Rank: 1

34#
发表于 2018-5-9 21:10:26 |只看该作者
2894386560 发表于 2018-5-9 21:06
按照教程做到这课,也是碰到了405 Method Not Allowed 的问题,百度之后也没能解决掉这个问题,在网页搜索 ...

我试过在数据库里搜   title like "%阿甘正传%"    是可以得到结果的。。

4.png (51.64 KB, 下载次数: 279)

4.png

回复

使用道具 举报

1

主题

0

好友

43

积分

新手上路

Rank: 1

33#
发表于 2018-5-9 21:06:41 |只看该作者
按照教程做到这课,也是碰到了405 Method Not Allowed 的问题,百度之后也没能解决掉这个问题,在网页搜索之后得不到结果只能得到None。有点头疼不太懂为什么出现这个问题。
把代码图片发上来,希望先生可以帮忙看看。

2.png (22.25 KB, 下载次数: 272)

2.png

1.png (13.02 KB, 下载次数: 281)

1.png

3.png (43.36 KB, 下载次数: 279)

3.png

回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

32#
发表于 2018-2-9 16:23:02 |只看该作者
fubixingwzy 发表于 2018-2-9 16:14
先生,这个问题弄得我头好疼,麻烦帮帮我,非常感谢!
跟着您的教程做完了这个电影网站,但是搜索这里还是有问题 ...

这个不清楚,从你报错也没看出什么问题。你把拿到的参数输出一下看看吧,可能是文本编码的问题
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

10

积分

新手上路

Rank: 1

31#
发表于 2018-2-9 16:14:04 |只看该作者
先生,这个问题弄得我头好疼,麻烦帮帮我,非常感谢!
跟着您的教程做完了这个电影网站,但是搜索这里还是有问题,我输入单个字搜索总是会出错,多个字就可以;点演员名子搜索的时候有的可以,有的却报错
演员探索 单字搜索
回复

使用道具 举报

0

主题

0

好友

34

积分

新手上路

Rank: 1

30#
发表于 2017-9-12 12:27:05 |只看该作者
crossin先生 发表于 2017-9-12 12:14
title是对应你的文本框

原来是这样,谢谢先生
回复

使用道具 举报

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

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

GMT+8, 2024-5-4 05:33 , Processed in 0.032922 second(s), 25 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部