Python Flask 编写API  -  一言篇

Python Flask 编写API - 一言篇

动漫也好、小说也好、网络也好,不论在哪里,我们总会看到有那么一两个句子能穿透你的心。我们把这些句子汇聚起来,形成一言网络,以传递更多的感动。如果可以,我们希望我们没有停止服务的那一天。 —— 一言(Hitokoto.cn)

引子

这是来自一言网站的一段话,我觉得这就是许多IT死宅的浪漫吧。最近沉迷于博客相关的东西,自然也就想为博客社区做做贡献,四下翻翻,发现自己也没啥可贡献的(笑),于是乎就有了开发自己的API服务的想法。凡事讲究从易到难,看看那些参数一大堆,认证繁琐的东西,我还是先从稍微简单的一言开始吧。

什么是一言

简单来说,一言指的就是一句话,可以是动漫中的台词,也可以是网络上的各种小段子。 或是感动,或是开心,有或是单纯的回忆。来到这里,留下你所喜欢的那一句句话,与大家分享,这就是一言存在的目的。 一言(Hitokoto.cn)

一言实际上就是让你的博客变得更加高大上的一句话,WordPress自带的Hello Dolly插件的作用也与之类似。

架构选择

要开发这种后端作用远大于前端的应用,选择就非常多了。有Spring Boot ,Go,Python Flask,甚至PHP也行。但综合考虑我的需求和自己的编程水平,我最终选择了Python Flask,因为我对Python稍微熟悉一点,且以后将要实现的更多功能利用Python里的库可以非常方便地实现。

需求与前置工作

设想是这样的:访问一个URL,直接得到一句一言,并可以通过更改请求的方式得到出处。听起来很简单是吧,实现起来我可是处处掉坑。

要建立一言API,一言本身肯定是最重要的。本来这将会成为最困难的一部分,我甚至已经做好了写爬虫的准备,但感谢Hitokoto.cn,将他们的公共API的一言数据全部公开,省去了我一大麻烦。这里给出他们的一言仓库链接,大家可以自行下载。

[github repo="hitokoto-osc/sentences-bundle"]

[github repo="mashirozx/Sakura"]

至于开发环境,就是一般的Python开发环境,我这里在Windows下用PyCharm开发,然后部署到Linux服务器上。

初识Flask

Flask 是一个使用 Python 编写的轻量级 Web 应用程序框架,用于这种没什么前端需求的应用再合适不过。使用很简单,但性能就不是很好。经过后来的实测,长时100QPS或短期1000QPS以上就会炸,在初期小流量下还行。后期可能会用Go重写。

以下提供一个可以运行的最小Flask例程,对于这种开发,哪怕不求甚解也行,反正临时用用。

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
  return 'Hello World'

if __name__ == '__main__':
  app.run(host='0.0.0.0',port=5000, debug=True)

不建议将app.run()写法用于生产环境中

敷衍的开发过程

@app.route('/hitokoto/')
def get_main():
  conn = sqlite3.connect('DB.db')
  hito = conn.execute("""select * from hitokoto order by random() limit 1\').fetchone()""")
  logging.info(Hitokoto  + str(hito[0]))
  return "{} ——「{}」".format(hito[1], hito[2])

这里给出我使用的处理函数,很简单,从SQLite数据库中随机选出一条记录,经格式化后直接返回,没有任何美化或者格式上的东西,这些就交给前端吧。(好像前端后端都是我)另给出一种适合用于生产环境下的服务运行写法

if __name__ == '__main__':
  server = pywsgi.WSGIServer(('0.0.0.0', 50000), app)
  server.serve_forever() 

至此,这个API也基本能用了,但性能不忍直视。等哪天有空,Golang重写,换数据库,还可能搞分布式,但是不一定写博文。