日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)(二)

發布時間:2024/9/30 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

簡單請求:
注意:跨域問題的解決實在被請求方的服務端進行設置

// 8000端口發送請求頁面<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>緩存測試</title><script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.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: 'get',//{#contentType: 'application/json',#}//{#data: {"name": "sgt"},#}success:function (data) {console.log(data);//{#$('#info').html(data)#}}})}) </script> </body> </html>

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,其它的是交給中間件去解決

#views.pydef test(request):response = HttpResponse("恭喜你,跨域成功")return response

其它不變。

以上就是跨域問題在Django框架中的解決流程,這里需要知道的是,一般實際項目當中不會這么繁瑣的去操作,會經常使用一個模塊來處理跨域問題:djang-cors-headers,當然它的實現流程就是我們上面的例子,只不過封裝程度更高點。

三、自動生成接口文檔

待續…

總結

以上是生活随笔為你收集整理的Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。