Django之AJAX傳輸JSON數據


  AJAXJSON數據傳輸:

AJAX請求JSON類型數據:

·         AJAX通過GET或者POST方式都可以發送JSON數據請求,需要指定內容類型:‘Content-Type':'application/json'post請求必須設置

headers:{'X-CSRFToken': $('input[name=csrfmiddlewaretoken]').val()},在請求頭部進行csrf認證;

 

·         請求數據data經過JSON.stringify()進行序列化

·         AJAX在前端發送的JSON數據,django不能自動解析,因此request.GETrequest.POST都為空,JSON數據在請求體request.body中需要手動解析(解碼反序列化)

django響應JSON類型數據:

django視圖函數通過importjson導入模塊,對數據需要返回的數據進行json.dumps()序列化

 

AJAX請求JSON類型數據:

post請求為例,get請求不需要csrf認證,故不需要JSON數據請求的headers信息

  login.html 

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
 6     <title>login</title>
 7 </head>
 8 <body>
 9 <div>
10     用戶名:<input type="text" name="username" id="username">
11     密碼:<input type="password" name="password" id="password">
12     <input type="button" id="submit" value="提交">{% csrf_token %}
13     <span id="status"></span>
14 </div>
15 </body>
16  
17 <script>
18     //以post方式請求
19     $(function () {
20         $('#submit').click(function () {
21  
22             $.ajax({
23                 url: "{% url 'auth' %}",//請求路徑
24                 type: 'post',            //請求方式
25  
26                 //(1)默認數據請求
27                 //data: { //請求數據(post請求的csrf認證鍵值對固定)
28                   //  username: $('#username').val(),
29                     //password: $('#password').val(),
30                     //csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),
31                 //},
32  
33                 //(2)JSON數據請求
34                 'Content-Type':'application/json',
35                 headers:{'X-CSRFToken': $('input[name=csrfmiddlewaretoken]').val()},//在請求頭通過csrf認證,鍵固定
36                 data:JSON.stringify({
37                     username: $('#username').val(),
38                     password: $('#password').val(),
39                 }),
40  
41  
42                 success: function (response) {//請求回調函數
43                     if (response == 1) {
44                         location.href = "{% url 'index' %}"
45                     } else {
46                         $('#status').text('賬號或密碼有誤!')
47                     }
48                 }
49             })
50         })
51     });
52  
53 </script>
54 </html>
login.html

  urls.py 

1 urlpatterns = [
2     url(r'^admin/', admin.site.urls),
3     url(r'^login/',views.login,name='login'),
4     url(r'^auth/',views.auth,name='auth'),
5     url(r'^index/',views.index,name='index'),
6 ]
urls.py

  views.py

 1 def auth(request):
 2     if request.method == 'POST':
 3         #(1)默認數據請求
 4         # name = request.POST.get('username')
 5         # psd = request.POST.get('password')
 6  
 7         #(2)JSON數據請求
 8         request_data=request.body
 9         print(request_data)
10         request_dict=json.loads(request_data.decode('utf-8'))
11         name=request_dict.get('username')
12         psd=request_dict.get('password')
13  
14  
15         if name == "yang" and psd == '123':
16             status = 1
17         else:
18             status = 0
19         return HttpResponse(status)
views.py

 

django響應JSON類型數據:

AJAX中回調函數接收到的數據都為string字符串類型,因此在視圖函數響應的原始數據只有字符串類型的才能被AJAX正常接收,其它的數據類型(數字,列表,字典等)都必須通過json數據類型進行傳輸

(1)視圖函數響應字符串,AJAX正常接收,其否則響應的其它數據類型也都是string無法解析使用:

 

   

2)視圖函數響應JSON數據類型:

·         使用HttpResponse響應手動序列化后JSON數據直接響應,前端得到的響應數據需要被動反序列化成對應的數據類型

 

·         使用HttpResponse響應手動序列化后JSON數據並設置參數content_type='application/json'前端得到的響應數據是經過JSON對象自動進行反序列化后的對應數據類型

 

·         使用HttpResponse響應不需要手動序列化JSON數據,直接響應即可,但是對於非字典類型的數據類型需要設置參數safe=False前端得到的響應數據是經過JSON對象自動進行反序列化后的對應數據類型

 

 

①使用HttpResponse響應:未告知類型,前端需要被動解析

視圖函數:

data={'status':[1,2,3],'info':'login'}

return HttpResponse(json.dumps(data))#直接發送json字典,前端需要被動反序列化

 

AJAX回調函數:

success: function (response) {//請求回調函數參數response被動反序列化

    console.log(JSON.parse(response));

    console.log(typeof JSON.parse(response));

 

②使用HttpResponse響應,告知類型,前段自動調用JSON對象解析

視圖函數:

data={'status':[1,2,3],'info':'login'}

return HttpResponse(json.dumps(data),content_type='application/json')#發送json字典,告知類型

return HttpResponse(json.dumps(ret,ensure_ascii=False)) #ensure_ascii=False是告訴json不要對中文進行編碼,不然返回給前端的數據中如果有中文的話會被編碼成unicode類型的數據,導致前端看不到中文

AJAX回調函數:

success: function (response) {//請求回調函數參數response自動反序列化

    console.log(response);

    console.log(typeof response);

 

 

使用JsonResponse響應,不需要手動進行序列化,同時也不需要告知類型,在響應除字典以外的數據類型時,需要添加參數safe=False

 

from  django.http  import  JsonResponse

響應字典視圖函數:

data={'status':[1,2,3],'info':'login'}

return JsonResponse(data)#使用JsonResponse,直接響應數據

響應非字典視圖函數:

data=[{'status':[1,2,3],'info':'login'}]

return JsonResponse(data,safe=False)#使用JsonResponse,直接相應數據,字典以外數據類型徐設置參數safe=False

 

AJAX回調函數:

success: function (response) {//請求回調函數參數response自動反序列化

    console.log(response);

    console.log(typeof response);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM