Django 作了大量工做簡化咱們的Web開發工做, 這其中固然也包括接收來自客戶端的數據這一廣泛需求. 大部分時候,從客戶端傳入的數據主要是FORM的POST數據,和來自URL的GET數據, 在Django中對應了HttpRequest對象的POST和GET屬性, 例如讀取FORM表單中的用戶名username輸入框的內容:javascript
def someView(request): username = request.POST.get('username'); ......
在WEB2.0時代, 若是咱們從客戶端傳入的是JSON格式的數據, 上面的方法就沒法正常讀出數據了. 可能有人要問,爲何必定要用JSON格式的數據, 不直接編碼成FORM形式的數據呢? 由於JSON格式可以更好地體現數據的層次結構, 而FORM形式的數據每每只能是單層.html
下面經過一個例子演示如何從HTML中發送json,並在Django中接收json數據.java
在HTML中,能夠經過JSON對象將數據以Json格式發送到服務器,假設在play.html中有如下內容要發送到服務器:json
用戶名username數組
密碼password服務器
一個數組,其中每一個元素包含: 遊戲編號game_id和得分levelpost
那麼, 可使用以下JavaScript(JQuery)代碼:編碼
<script type="text/javascript"> $(function() { $('#upload').click(function() { var json_obj = { username: $('#username').val(), password: $('#password').val(), datas: [ { game_id: $('#datas1').val(), level: $('#level1').val() }, { game_id: $('#datas2').val(), level: $('#level2').val() } ] }; //JSON對象 var json_str = JSON.stringify(json_obj); //將JSON對象轉變成JSON格式的字符串 $.post("/datasave", json_str, callback, "json"); }) function callback(json){ $('#response').html('code:'+json['status']['code'] + "\tmessage:" + json['status']['message']); } }) </script>
在上面的代碼中, 數據將發送到/datasave, 在Django中,視圖方法若還使用request.POST來讀數據, 獲得的全是None, 這時得使用request.raw_post_data, 並藉助simplejson來將其轉換爲字典dict數據類型, 而後的使用就簡單了,以下:spa
def datasave(request): dict = {} info = 'Data log save success' try: if request.method == 'POST': req = simplejson.loads(request.raw_post_data) username = req['username'] password = req['password'] datas = req['datas'] game_id1 = datas[0]['game_id'] except: import sys info = "%s || %s" % (sys.exc_info()[0], sys.exc_info()[1]) dict['message']=info dict['create_at']=str(ctime()) json=simplejson.dumps(dict) return HttpResponse(json)
request.raw_post_data表示的是從客戶端發送過來的原始數據,爲了純字符串, 經過simplejson
的loads
方法將其轉換爲字典數據類型req.
上面的代碼也演示瞭如何以JSON格式做爲響應值, 而非HTML, 即經過simplejson
的dumps
方法, 將字典數據dict序列化爲字符串形式,將經過HttpResponse返回.code