Django中解決跨域問題


跨域問題

根本原因:瀏覽器的同源策略,瀏覽器拒絕不是當前域返回的數據

ps:ip地址和端口號都相同才是同一個域

CORS基本流程

瀏覽器將CORS請求分成兩類:簡單請求和非簡單請求

瀏覽器發出CORS簡單請求,只需要在頭信息之中增加一個Origin字段

瀏覽器發出CORS非簡單請求,會在正式通信之前,增加一次HTTP查詢請求,稱為“預檢”請求(OPTIONS請求)。瀏覽器先詢問服務器,當前網頁所在的域名是否在服務器的許可名單之中,以及可以使用哪些HTTP動詞和頭信息字段。只有得到肯定答復,瀏覽器才會發出正式的XMLHttpRequest請求,否則就報錯。

解決跨域問題(寫好這個中間件配置一下)

class MyCorsMiddle(MiddlewareMixin):
	def process_response(self, request, response):
		if request.method == 'OPTIONS':
			# 允許它
			response['Access-Control-Allow-Headers'] = 'Content-Type'
			# obj['Access-Control-Allow-Headers']='*'
            
			# obj['Access-Control-Allow-Origin']='http://127.0.0.1:8000'
		response['Access-Control-Allow-Origin'] = '*'
		return response

補充:

支持跨域,簡單請求

服務器設置響應頭:Access-Control-Allow-Origin = ‘域名’ 或 ‘*’

支持跨域,復雜請求

由於復雜請求時,首先會發送“預檢”請求,如果“預檢”成功,則發送真實數據。

  • “預檢”請求時,允許請求方式則需服務器設置響應頭:Access-Control-Request-Method(put請求等)
  • “預檢”請求時,允許請求頭則需服務器設置響應頭:Access-Control-Request-Headers

Djangocorsheaders(第三方cors)

DRF后端實現跨域我們使用一個第三方擴展——— djangocorsheaders

安裝

pip install django-cors-headers

注冊

INSTALLED_APPS = (
  'corsheaders',
)

添加中間件

MIDDLEWARE = [
  'corsheaders.middleware.CorsMiddleware', #最好添加至第一行
]

配置白名單

#單個配置
CORS_ORIGIN_WHITELIST =(
   ' 域名',
)
#正則配置:
CORS_ORIGIN_REGEX_WHITELIST =(r'^(https?://)?(\w+\.)?jim\.com $',)

或者直接允許所有主機跨域

CORS_ORIGIN_ALLOW_ALL = True 默認為False


免責聲明!

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



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