用Django构建REST网页服务
作者:糖果
Django的高版本自身提供了很好REST服务组件和方便的库,Djano REST Framework提供了一个现成的方案,可以将对外的REST服务,与类似Mysql的数据存储建立有机关联,直接与ORM一起使用就更便利。
JSONRenderer和JSONParser提供了方便的JSON解析和响应服务。不过用这些库意味着要按装的新包,对版本和环境可能也有要求,所以,要想在更低的Django版本下支持JSON数据接收和响应,就不要使用这些高级的库,而是直接使用老的API。
如果用Lua来解析和响应JSON,也是同样方便的,关于这些json数据的存储也有很多的选择, mysql,ES,mongo都可以,甚至在SAE上,用kvdb也没有问题。
下面是Django 1.5.x支持的实现。
@csrf_exempt
def testcase(request):
try:
if request.method == 'POST':
receive_data = json.loads(request.body)
phone = receive_data['phone']
return HttpResponse(json.dumps(receive_data), content_type="application/json")
except:
import sys
info = "%s || %s" % (sys.exc_info()[0], sys.exc_info()[1])
return HttpResponse("Parse JSON data error!")
return HttpResponse("Building JSON REST Web Service!")
因为django使用的了中间件django.middleware.csrf.CsrfViewMiddleware,对要测试的函数需要加上@csrf_exempt装饰器,不然会报警。
需要引用下面的包:
from django.views.decorators.csrf import csrf_exempt
对于”testcase“这个方法说,主要用做的处理就两件事,一是接收用户传过的JSON数据,另一个处理,就是直接再把这个数据,依JSON数据形式传回给用户,中途并没有对JSON做过任何的操作。
import json
receive_data = json.loads(request.body)
如果是POST类型的请求,JSON数据,主要取得的API是request.body,在1.5.x较高的版本中,用的是这个,也可以用另外一个等价的API是raw_post_data,这是一个旧的接口,虽然可以执行,但会给出警告信息。
净raw数据解析成json,主要靠的函数是json.loads(request.body).
receive_data = json.loads(request.body)
phone = receive_data['phone']
接口返回json数据时要指明一下mime类型。
return HttpResponse(json.dumps(receive_data), content_type="application/json")
就是这个比较简单的就可以实现json数据的接收和返回。
可以简单的用curl测试一下,这个接口:
curl -b "key=value" http://127.0.0.1/json/ -d'{"phone":"15811111111" ,"identity":"xxx", "credit":"xxx"}'
这接口的圈复杂度其实不高,主要要测试的就三个分支,基本都有Message输出。