选题
对于选题,自然是大写的尴尬。
尴尬在于何处呢?很简单,全程被忽悠和迷茫。
对于我而言,大三的学习和大四一样,在大三的时候完成了其他专业大四的课程。大四学年被外派到了北京基地实习,因为考研的缘故,基本没有学习Python的知识,目前有的只有基础知识。当面临关键的毕业选题的时候,学校却只给一个下午的时间决定题目。经过老师的“忽悠”和踩坑,最后题目“莫名其妙”的变为了“新闻类短讯实时热点展示平台”。
选题背景
网络时代的到来,使得我们的生活进入到一个更高水平的信息环境当中。网络带来的是前所未有的、与之前截然不同的信息传递方式。光、电的传播要比报纸、信件传递的要快的多。因此在这样的大背景下,希望打造的是一个实时的网络平台,这个平台可以刷新得到想要的信息资源,而且是崭新的消息,能够满足大部分人的网络浏览需求。
思路
人呐,只有体会过才知道设计实验的时候思路有多么的重要。总体来说,项目分为三个大块,这三个大块分别是用户登录注册、新闻信息展示以及新闻分类。
出于自身的条件限制,前端内容学习的不完整,在当时连Vue这些框架都没有听说过。所以说用户看到的页面只不过是一个简单的HTML搭建出来的页面,配合上Django框架和ajax,能够实现用户异步信息访问登录即可。随后就是需要爬虫。目前是从某网站上直接按照分类爬取下来的信息,进行展示访问,点击刷新之后可以进行信息的更替,刷新页面信息。下面是在网上找到的爬虫的过程图,忘记了就看看~
框架和一些代码
- Django和ORM
在编写的时候,基地统一采用的是Python代码,所以说用的框架是Django。Django框架在一些web开发方面很有用处,使用的是Python编写的,可以直接联系数据库,避免因为数据库语句问题导致的尴尬。Django可以进行模块化开发,创建一个一个的APP。
注意,要和flask框架区分开。
使用过程中需要形成迁移文件
1 | python manage.py migrations |
前端登录注册页面
前端登录只不过是使用HTML、CSS和JS形成的页面,主要的登录界面会将输入的内容传递给后端的服务器,以方便写入数据库中。代码就不写了。
哦,对了,数据库用的是sqlite,因为就是储存一个用户名和密码,所以想着没必要用MySQL。而且MySQL得安装,卸载还很麻烦,sqlite随开随用,不香嘛? =_=
爬虫
爬虫这里用的是一个简单的实时爬虫,可以把该网站的对应数据爬取下来,然后在我的页面上展示。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22# 设置url,指定爬虫位置
url = '这里是你爬取的网站'.format(cid,i)
# 设置headers
headers = {'Host':'网站host',
'Connection': 'keep-alive',
'Content-Length': '12',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Origin': 'http://www.v1.cn',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Referer': 'http://www.v1.cn/xinwen/',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
}
# 设置cookie,给爬虫使用
cookie = {'cookie里面是浏览器中本机的cookie'}
# 将设置好的url、headers和cookies赋值给a变量
a = requests.get(url,headers,cookies = cookie)
# 将爬取获得的json数据赋值给c变量
c = json.loads(a.text)['list']
# 更新list_info内容,将新的json数据写入
list_info = list_info+c页面展示
页面展示过程中,首先是view中的show去查看是不是已经登陆了,要是没有登录,就必须要登录,并且会跳转到登录页面。之后成功登录之后才会将数据进行爬取,使用flush将视频流进来。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18def show(request,id = '新闻'):
# 设置kooe字典,将想要的分类和指定的数字组合起来,别乱套了
kooe = {'新闻':'3','社会':'5','搞笑':'6','美食':'8','旅游':'15','财经':'23','汽车':'18','音乐':'32'}
# 这里的if就是看是不是登陆了,要是登陆了,浏览器就可以从session里面拿到名字
if request.session.get('name',None):
# 通过session将 ”新闻“ 对应的id传给guid里面的link和list_info。然后使唤guid里面的爬虫爬取视频数据
request.session['link'] = id
list_info = GetVideo(kooe[id])
# 将session中拿到的用户名赋值给user变量
user = request.session.get('name', None)
# 再把user变量里的内容传给 ‘user’ ,因为前面的blog.HTML要用这个名字
context = {}
context['user'] = user
context['info'] = list_info
return render(request, 'blog.html', context)
# 没有登录?玩个球,登录去
else:
return HttpResponseRedirect(reverse('showDate:login'))验证码
注册界面中会设置有验证码的部分,在思考之后,考虑的思路是设置一个字符库,然后设置一个区域,画好麻子,之后再从字符库里面随机拿到四个数字,这四个数字在通过与背景不同的颜色显示出来,然后再设置一个计时器,60秒之后验证码会过期,搞定。
1
2
3
4
5
6
7
8
9charsource = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890"
sum = ""
for i in range(4):
ch = random.choice(charsource)
imageDraw.text((15 + i * 50, 10), ch, fill=createcolor(), font=imageFont)
sum += ch
# 通过session记录这个验证码并且设置过期时间为60秒
request.session["verCode"] = sum
request.session.set_expiry(60)登录时间设置
出于“安全”考虑,在页面设置一个计时器,当到了这个计时器指定的一段时间之后,无论页面中是否有用户动作,都会强制注销,重新登录。(虽然我觉得这个功能对我来说不需要,但是出于安全考量,设置一个也不会掉块肉。。。也许之后我秃了,但是网页变强了呢?(/滑稽))
1
2# 设置session关闭时间,时间到了之后无论是否还在活动则自动退出
request.session.set_expiry(100)显示“你好XXX”
这就得用到cookie/session技术了,view中的函数会通过session向服务器查找对应的用户名,并将用户名传递给user,也就是传递给前端页面,展示出来目前是谁在登录。
view中的login函数和show函数中:
1
2
3
4# info中存储通过POST接收到的数据,包括用户姓名和密码
info = request.POST
user_name = info['username']
user_pwd = info['password']1
2# 将session中获取到的user_name传给name
request.session['name']=user_name1
2
3
4
5
6# 将session中拿到的用户名赋值给user变量
user = request.session.get('name', None)
# 再把user变量里的内容传给 ‘user’ ,因为前面的blog.HTML要用这个名字
context = {}
context['user'] = user
context['info'] = list_info blog.html 中:
1
<h6 style="color: grey">欢迎登陆:{{ user }}</h6>
现在放效果图搞定!
一些概念,写在这里,别忘了(终于能复制而且不怕查重了!!!哈哈哈哈)
Python
Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。
注意,Python不会向下兼容,也就是2.x和3.x不通用
优点:简单易学、编译速度快(C底层)、免费开源、可移植性(可移植在多个平台使用)、解释性、面向对象、丰富内库、代码规范。
缺点:运行速度慢、语法过于严格
Django
Django已经成为web开发者的首选框架,是一个遵循 MVC 设计模式的框架。MVC是Model、View、Controller三个单词的简写,分别代表模型、视图、控制器。Django其实也是一个MTV 的设计模式。MTV是Model、Template、View三个单词的简写,分别代表模型、模版、视图 [4] 。但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式。
Sqlite
Sqlite数据库是Django默认支持的一个数据库,主打轻量级存储数据,也是一款关系型的数据库。作为一个极为轻便的数据库,底层是建立在一个相对很小的C语言库的基础上,目标是建立嵌入式的关系。随着时代和科技的发展,Sqlite数据库已经被应用于许多的嵌入式应用当中。Sqlite数据库占用内存很少,和我们之前见过的SqlServer以及Oracle不同,因此在轻量级应用当中运用广泛,可以支持一些常用的数据存储