Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)(二)
二、跨域:
回到頂部
跨域知識介紹:
點我以前博客
跨域解決方法:CORS:跨域資源共享
CORS請求分類(簡單請求和非簡單請求)
簡單請求(simple request):只需要在頭信息之中增加一個Origin字段。
非簡單請求(not-so-simple request):會在正式通信之前,增加一次HTTP查詢請求,稱為"預檢"請求(preflight)。瀏覽器先詢問服務器,當前網頁所在的域名是否在服務器的許可名單之中,以及可以使用哪些HTTP動詞和頭信息字段。只有得到肯定答復,瀏覽器才會發出正式的XMLHttpRequest請求,否則就報錯。
只要同時滿足以下兩大條件,就屬于簡單請求。
-------------------------------------------------------------------- 注:如果你對python感興趣,我這有個學習Python基地,里面有很多學習資料,感興趣的+Q群:895817687 --------------------------------------------------------------------(1) 請求方法是以下三種方法之一: HEAD GET POST (2)HTTP的頭信息不超出以下幾種字段: Accept Accept-Language Content-Language Last-Event-ID Content-Type:只限于三個值application/x-www-form-urlencoded、multipart/form-data、text/plain凡是不同時滿足上面兩個條件,就屬于非簡單請求。
瀏覽器對這兩種請求的處理,是不一樣的。
* 簡單請求和非簡單請求的區別?簡單請求:一次請求非簡單請求:兩次請求,在發送數據之前會先發一次請求用于做“預檢”,只有“預檢”通過后才再發送一次請求用于數據傳輸。 * 關于“預檢”- 請求方式:OPTIONS - “預檢”其實做檢查,檢查如果通過則允許傳輸數據,檢查不通過則不再發送真正想要發送的消息 - 如何“預檢”=> 如果復雜請求是PUT等請求,則服務端需要設置允許某請求,否則“預檢”不通過Access-Control-Request-Method=> 如果復雜請求設置了請求頭,則服務端需要設置允許某請求頭,否則“預檢”不通過Access-Control-Request-Headers支持跨域,簡單請求
服務器設置響應頭:Access-Control-Allow-Origin = ‘域名’ 或 ‘*’
支持跨域,復雜請求
由于復雜請求時,首先會發送“預檢”請求,如果“預檢”成功,則發送真實數據。
- “預檢”請求時,允許請求方式則需服務器設置響應頭:Access-Control-Request-Method
- “預檢”請求時,允許請求頭則需服務器設置響應頭:Access-Control-Request-Headers
示例:
建立2個Django項目,一個端口8000,一個8001,8000向8001發送請求
8000端口項目
# urls.pyurl(r'^cors_test/', views.cors_test), # views.pydef cors_test(request):return render(request, 'show_time.html')8001端口項目
#urls.pyurl(r'^cors_test/', views.Test.as_view()), from django.shortcuts import render,HttpResponse# Create your views here. from rest_framework.views import APIView class Test(APIView):def get(self, request):print(123)response = HttpResponse('恭喜你,跨域成功')response['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8000'return response簡單請求:
注意:跨域問題的解決實在被請求方的服務端進行設置
8001端口服務端設置:
非簡單請求:
先在視圖中實現:
(由于非簡單請求要請求2次,第一次是options,所以不能使用CBV視圖來處理請求,使用FBV才能在一個視圖函數中同時處理第一次和第二次請求)
# 8000發送端<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>緩存測試</title><script src="/static/jQuery-3.4.1.js"></script> </head> <body> <p><button id="test">點擊</button></p> <span id="info" style="color: red"></span> <script>$('#test').on('click',function () {$.ajax({url: 'http://127.0.0.1:8001/cors_test/',type: 'post',contentType:'application/json',data: {"name": "sgt"},success:function (data) {console.log(data);{#$('#info').html(data)#}}})}) </script> </body> </html> # 8001服務端 # urls.pyurl(r'^cors_test/', views.test), # 8001服務端 # views.pydef test(request):response = HttpResponse("恭喜你,跨域成功")if request.method == "OPTIONS":print(request.POST.get('name'))# 允許response["Access-Control-Allow-Headers"] = "Content-Type"# 也可以使用*來通配所以請求數據類型# response['Access-Control-Allow-Headers'] = '*'response["Access-Control-Allow-Origin"] = "http://127.0.0.1:8000"return response
跨域問題的解決方法一般是寫在Django的中間件中,所以接下來在它中間件中使用:
app01中創建一個中間件文件,并注冊
# MyMiddleWare.pyfrom django.utils.deprecation import MiddlewareMixin class MyCorsMiddle(MiddlewareMixin):def process_response(self, request, response):if request.method == "OPTIONS":print(request.POST.get('name'))# 允許response["Access-Control-Allow-Headers"] = "Content-Type"# 也可以使用*來通配所以請求數據類型# response['Access-Control-Allow-Headers'] = '*'response["Access-Control-Allow-Origin"] = "http://127.0.0.1:8000"return response
視圖直接返回 response,其它的是交給中間件去解決
其它不變。
以上就是跨域問題在Django框架中的解決流程,這里需要知道的是,一般實際項目當中不會這么繁瑣的去操作,會經常使用一個模塊來處理跨域問題:djang-cors-headers,當然它的實現流程就是我們上面的例子,只不過封裝程度更高點。
三、自動生成接口文檔
待續…
總結
以上是生活随笔為你收集整理的Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django框架深入了解_05 (Dja
- 下一篇: 列表推导式与生成表达式的区别