Flask的一次巧妙应用

来源:互联网 发布:淘宝上卖水果怎么收费 编辑:程序博客网 时间:2024/06/05 18:49

想起之前我遇到了这样的一个场景:有一套项目源代码,这个项目有个需求是实时更新数据,每间隔5分钟就要更新一次,数据是通过请求API来获取,但这些API所在的服务器在美国,而我们的应用服务器则在香港,通讯链路过长导致了每次更新数据都会延时。因为项目代码涉及到大量业务逻辑,并且任务要求在2天时间内完成,如果去改动项目,牵扯到的问题将不仅仅是解决数据更新延时那么简单,所以我们在尽量不改变原有项目代码的前提下,把数据更新延时的问题解决掉。
因为同样的数据在香港也有,并不一定要请求美国服务器,但是香港本地提供的数据在网页上,没有提供API。为了尽量提高数据更新的即时性,我们只能从香港服务器请求数据了。
看到这里,你会采用什么方法?
我采用的方法是:写好网络爬虫挂在本机,项目里请求API的路径改为本机的爬虫服务(这样就只需要改动那部分URL,不需要改动其它业务逻辑,出错概率大大减小),每请求一次爬虫就会解析一次数据页面并把数据返回给项目。这确实是个办法,但若要请求爬虫服务,肯定要有一套API请求地址,也就是请求路由,最方便的就是直接使用web容器来提供这样的路由机制,将爬虫业务逻辑写在现成的web框架中是一个不错的办法。但许多框架都太重量级了,我们需要的不是web框架的其它部分,我们仅仅只需要一个路由机制而已,这就意味着我们要用的是一个轻量级的web框架,并且可以单独使用其中的某一部分,不将多余的代码加入到其中,因为这会加大系统运行的成本,更重要的是,修改起来会更麻烦。这时候,Python的一款开源轻量级框架Flask就派上用场了。
下面给各位看看使用Flask搭建起来的最小的应用是啥样的,上代码(这是从Flask官网上拷贝的)。

from flask import Flaskapp = Flask(__name__)@app.route('/')def hello_world():    return 'Hello World!'if __name__ == '__main__':    app.run()

把它保存为 hello.py (或是类似的),然后用 Python 解释器来运行。 确保你的应用文件名不是 flask.py ,因为这将与 Flask 本身冲突。

$ python hello.py* Running on http://127.0.0.1:5000/

现在访问 http://127.0.0.1:5000/ ,你会看见 Hello World 问候。

看到这里,我发现Flask正好满足我们的需求,可以只用其路由机制,这样我们就可以把爬虫代码和路由机制都集成到一个Python文件上。
实现好爬虫的业务逻辑,封装成一个函数,而API也与爬虫代码在同一个文件上,有多少种类的数据我们就写多少个API,例如:

@app.route('/a')def a():    return 'a'@app.route('/b')def b():    return 'b'

以上就写好了2个数据接口(当然这里只是举例),每个数据接口都调用我们在同一个页面封装好的爬虫函数,根据传入的参数不同来实现获取不同的数据即可。
请求URL分别为:http://127.0.0.1:5000/a , http://127.0.0.1:5000/b
用以上方法,简单有效地解决了问题。