先來看一個例子
定義server01
的項目,在路由表中添加一條路由記錄
url(r'^getData.html$',views.get_data)
對應的視圖函數
from django.shortcuts import render,HttpResponse
def get_data(request):
response=HttpResponse("server----001")
return response
定義server02
項目,在路由表中添加一條路由記錄
url(r'^index.html/',views.index),
對應的視圖函數
from django.shortcuts import render
def index(request):
return render(request,"index.html")
對應的index.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>server----002</h1>
<script src="/static/jquery-3.2.1.js"></script>
<script>
$.ajax({
url:'http://127.0.0.1:8000/getData.html',
type:'GET',
success:function(data){
console.log(data);
}
})
</script>
</body>
</html>
運行server01
項目,使用8100端口
打開server02的index.html
網頁,可以看到如下信息
發送這個請求使用的是GET
方法.如果把server02的index.html網頁中設定為使用PUT
方法發送請求,會看到什么情況呢?
把index.html
中的請求方法修改為PUT
,然后刷新瀏覽器
可以看到網頁上顯示的request method變成了OPTIONS
,可是在網頁中聲明的請求方法是PUT
呀
為什么會出現這樣的情況呢???這就涉及到簡單請求
和非簡單請求
了.
簡單請求就是使用設定的請求方式請求數據
而非簡單請求則是在使用設定的請求方式請求數據之前,先發送一個OPTIONS請求,看服務端是否允許客戶端發送非簡單請求.
只有"預檢"通過后才會再發送一次請求用於數據傳輸
簡單請求與非簡單請求的區別
* 請求方式:HEAD,GET,POST
* 請求頭信息:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type 對應的值是以下三個中的任意一個
application/x-www-form-urlencoded
multipart/form-data
text/plain
只有同時滿足以上兩個條件時,才是簡單請求,否則為非簡單請求
如果在上面的例子中,在server01中設定響應頭,
from django.shortcuts import render,HttpResponse
def get_data(request):
if request.method=="OPTIONS":
response=HttpResponse()
response['Access-Control-Allow-Origin']="*"
response['Access-Control-Allow-Methods']="PUT"
return response
elif request.method =="PUT":
response=HttpResponse("server----001")
response['Access-Control-Allow-Origin']="*"
return response
再次刷新http://127.0.0.1:8100/index.html/
網頁,可以看到
先發送的是OPTIONS請求
,第二次發送的是PUT請求
,而且獲取到目標字符串.
由此得知,對於非簡單請求,客戶端以PUT
方式請求數據,服務端的"預檢"里邊一定要包含允許客戶端使用非簡單方式請求數據的響應頭
“預檢”請求時,允許請求方式則需服務器設置響應頭:Access-Control-Request-Method
“預檢”請求時,允許請求頭則需服務器設置響應頭:Access-Control-Request-Headers
“預檢”緩存時間,服務器設置響應頭:Access-Control-Max-Age
雖然可以通過設置響應頭和響應方式等支持非簡單請求,但是不到萬不得已的情況,不能允許客戶端發送非簡單請求.
因為非簡單請求會使服務器比簡單請求的多一倍的壓力.