前言
开发一个有服务端的应用,通常需要先约定服务端提供的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这个东西看着就是能提升客户端开发效率的一个东西,值得去尝试。