前言

开发一个有服务端的应用,通常需要先约定服务端提供的API接口,然后客户端、服务端同学分别进行开发。在服务端接口实现之前,客户端如何进行这部分对应的工作呢。通常的方案有,

  • 其一,服务端先提供接口,fake数据返回
  • 其二,客户端在代码中fake数据,在联调之前不去真正访问服务端接口

等到服务端提供了正式的API接口,联调才会真正开始。那么上述两种方法哪个更有效率呢?不得不选的话,第一种方式更好。这样客户端开发过程中,逻辑上是完整的,会充分的考虑到各接口是否合理。但这个方式有一个缺点,就是容易打扰到服务端同学。在接口不变的情况下,要fake不同情况的数据就得让对应的人来加,这些内容往往又很难一开始就想清楚,在开发过程中去打断别人终归是没那么有效率的。

如何测试接口客户端自己来开发维护,那么对整体的开发效率会有不少提升。对于前后端都通的同学来说,这自是没什么难度,但也是不少工作量。对于那些不怎么熟悉服务端开发的同学来说,这也可能会成为一个负担。有没有什么框架能既易用又少工作量呢?

bottle.py这个框架可能会是个不错的选择。

bottle是什么

bottle是python语言实现的一个web framework。它的最大特点是整个框架只有一个.py,没有其它依赖关系。用于测试目的的话,启动部署非常方便。

bottle常用操作

对于仅仅将bottle用于开发测试阶段来说,只要弄明白如何处理请求,返回数据就足够了。服务器性能、部署、运维相关的内容可以统统不去考虑。因此上手bottle会非常快速。

http请求分发

在bottle里面http请求分发是通过decorator来做的,有几种选择,通常可以选用route,

from bottle import route

@route('/wiki')
def show_wiki():
    ...

如果url里面需要指定参数,可以修改为,

@route('/wiki/<pagename>')            
def show_wiki_page(pagename):
    ...

如果需要获取query参数,则可以通过request获取,

from bottle import route, request

@route('/wiki/<pagename>')            
def show_wiki_page(pagename):
    page = request.query.get('page')
    ...

除了route之外,bottle另外提供了,get、post、put、delete、patch等decorator用于修饰请求,只有对应http操作匹配时才会调用到处理函数。

更加具体的规则,参见Request Routing

静态资源访问

除了动态http请求之外,bottle也支持访问静态资源,通过static_file来实现,

from bottle import static_file

@route('/apk/<file_path:path>')
def server_static(file_path):
    current_path = os.path.abspath(os.curdir)
    return static_file(file_path, root='%s/%s' % (current_path, APK_PATH))

数据格式支持

bottle返回各种数据格式也很方便,比如最常见的返回json数据,

返回json字典,

@route(/)
def index():
  return {'msg': 'hello, world!'}

返回json列表,这个需要多一步操作,

from bottle import response
import json

@route(/)
def index():
    msg_list = ['hello, world!', 'foobar']
    response.content_type = 'application/json'
    return json.dumps(msg_list)

启动运行

通过bottle提供的run可以直接运行bottle服务,

from bottle import run

run(host='', port='')

总结

客户端服务端开发两手都能抓的话,可以算某种意义上的全栈。Full Stack的真正好处并不在于要样样精通,而在于能站在更高的角度来思考问题寻找解决方案。一个方案涉及的人数越少时,执行起来就越高效。bottle.py这个东西看着就是能提升客户端开发效率的一个东西,值得去尝试。

参考