用Django构建REST网页服务

1.5k 词

作者:糖果

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输出。

源码地址: