1. 程式人生 > >Django框架(二十九)—— 跨域問題

Django框架(二十九)—— 跨域問題

目錄

跨域問題

一、同源策略

只允許當前頁面朝當前域下發請求,如果向其他域發請求,請求可以正常傳送,資料也可以拿回,但是被瀏覽器攔截了

只有IP和埠號都相同才是同一個域

二、CORS(跨域資源共享)

整個CORS通訊過程,都是瀏覽器自動完成,不需要使用者參與。對於開發者來說,CORS通訊與同源的AJAX通訊沒有差別,程式碼完全一樣。瀏覽器一旦發現AJAX請求跨源,就會自動新增一些附加的頭資訊,有時還會多出一次附加的請求,但使用者不會有感覺。

只要伺服器實現了CORS介面,就可以跨源通訊。

三、CORS兩種請求(簡單請求與非簡單請求)

# 原理
def test(request):
    import json
    obj=HttpResponse(json.dumps({'name':'lqz'}))
    # obj['Access-Control-Allow-Origin']='*'
    obj['Access-Control-Allow-Origin']='http://127.0.0.1:8004'
    return obj

1、簡單請求(一次請求)

必須同時滿足以下來搞個條件,才能為簡單請求

(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

凡是不同時滿足上面兩個條件,就屬於非簡單請求。

2、非簡單請求(兩次請求)

一次預檢(OPTION請求),只有服務端允許發請求,才能繼續發第二次正常請求,即一次真正的請求

四、CORS在Django中的應用

1、簡單請求

(1)定義一箇中間件

from django.utils.deprecation import MiddlewareMixin

class MyCorsMiddle(MiddlewareMixin):
    def process_response(self,request,response):
        # 允許http://127.0.0.1:8001域向我發請求
        # response['Access-Control-Allow-Origin']='http://127.0.0.1:8001'
        # 允許所有人向我發請求
        response['Access-Control-Allow-Origin'] = '*'
        return response

(2)註冊中介軟體

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'app01.MyMiddle.MyCorsMiddle'
]

2、非簡單請求

(1)定義一箇中間件

from django.utils.deprecation import MiddlewareMixin

class MyCorsMiddle(MiddlewareMixin):
    def process_response(self,request,response):
        # 處理簡單請求:
        response['Access-Control-Allow-Origin'] = '*'
        # 處理非簡單請求
        if request.method == 'OPTIONS':
            # 所有的頭資訊都允許
            response['Access-Control-Allow-Headers'] = '*'
            return response

(2)註冊中介軟體

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'app01.MyMiddle.MyCorsMiddle'
]
  • 允許的域可以在配置檔案中配置