谈谈用Flask搭建通用静态网站服务的方法
2021-01-11关丽梅
关丽梅
(武汉城市职业学院 湖北·武汉 430064)
Flask是一个使用Python编写的轻量级Web应用程序框架(又称为“MicroFramework微框架”),它拥有基本完备的Web应用支持功能,比如:Web应用、Web路由、Web表单交互、静态文件、动态模板 等等一系列功能,同时又将数据库支持等更复杂的高级特性抽离掉,但是又可以通过扩展来添加这些高级功能。由于Flask是用Python写的,又简单易学,在教学环境不能接入互联网的条件下使用Flask构建与爬虫程序配套的Web服务是一个非常方便实用的教学解决方案。
1 纯文本网页服务的Flask代码设计
server.py的代码如下:
在 server.py所在目录下的 web文件夹中放入网页文件studentInfo.html,网页内容是一张学生信息表格,其中的内容是纯粹文字的内容。
server.py执行效果如下:
在网页浏览器中输入网址http://127.0.0.1:5000/即可打开server.py发布的web网页,看到的将是一张表格,效果如图1所示,网页的显示没有什么问题。
图1
图2
2 带图像网页服务的Flask代码设计
可以看到网页中新加入的图像没有能够正常的显示出来,为什么会这样呢?
浏览器在访问网址http://127.0.0.1:5000/时,显示的表格内容是server.py返回的web/studentInfo.html文件的内容,因此表格的显示是没有问题的。
进一步来说,真实的爬虫程序往往会要求访问到网站中的多个URL地址,那么相配套的Web服务就不应该像上面的server.py那样,只能提供单一的一个URL访问。
我们更希望这个Web服务端程序可以将Web网站文件夹发布为一个静态网站,让我们可以自由访问网站中的每个静态文件。要想实现这样的效果,server.py中的@app.route()必须使用动态URL路由表达,可以更改如下:
@app.route("/
这个路由指令可以接受形如http://127.0.0.1:5000/studentInfo.html和http://127.0.0.1:5000/python.jpg这样可变形式的URL访问地址,不过路由指令相对应的处理函数也需要修改,这个处理函数可以接受路由变量path的值作为函数的一个参数变量,并根据此变量的值做出针对性的处理。
另外,因为jpg图像文件是二进制数据文件,与纯文本形式的html网页文件很不一样,我们还需要透过文件mini类型这个概念,对二进制文件进行相应的编码处理,然后Web服务才能正确的将图像数据通过http协议传送给浏览器客户端。
新修改的server.py的完整程序代码如下,其中包含有详细的注释说明:
上面的代码由于将网站的根目录指定默认页面为 index.html,即使用URL地址http://127.0.0.1:5000访问的将是index.html。如果要访问前面的那个表格网页studentInfo.html,可以将URL地址改为 http://127.0.0.1:5000/studentInfo.html,浏览器显示的效果如下:可以看到图像已经可以正常显示了。
图3
3 带css与js网页服务的Flask代码
上文第2部分所设计的代码中使用了下面的字典mimetypes,用来根据文件扩展名查询对应的mime类型
所以也适用于引用了css与js文件的网页。比如用爬虫爬取有一定复杂数据的网页,在教室不能连外网的情况下我们可以先在有网的环境将网页及相关文件全部下载下来,拿到教室把下载的网站文件夹放到与servey.py同级的web文件夹内,就可以用Flask提供服务了,访问“http://127.0.0.1:5000”与有外网上访问真实的网址效果完全相同。
如练习从中国气象局官网首页爬取数据,真实网址是http://www.cma.gov.cn/,将网站下载后保存到文件index.html与文件夹index_files中,将这个文件与文件夹带到教室放到web文件夹内运行Flask,用http://127.0.0.1:5000网址访问服务器,可以看到布局效果与可以上外网的效果完全相同,左下角的图片是个动态轮播图像特效,也能正常显示,可见上文第2部分中所设计的代码具有通用性,可以提供通用静态网站发布服务。
4 小结
通过以上所述,我们得出这样的结论:在没有外网的情况下我们自己动手写Falsk服务器代码是完全可以模拟真实的网站服务的,在教室练习爬虫程序从网站爬取数据将不再为上网条件所困,而且Flask代码是用Python语言所写,同学们也容易看懂。可见用Flask搭建通用静态网站服务真是个不错的选择。