python 生產實戰 跨域資源那些事兒~


點擊python編程從入門到實踐置頂 公衆號重磅 python入門資料,第一時間送達javascript



仍是牛html


讀完須要java

8
分鐘

速讀僅需 3 分鐘python

/ python 生產實戰 跨域資源那些事兒 /
web

CORS 是一個 W3C 標準,全稱是"跨域資源共享"(Cross-origin resource sharing)。它容許瀏覽器向跨源服務器,發出 XMLHttpRequest 請求,從而克服了 AJAX 只能同源使用的限制。本文詳細介紹 CORS 的內部機制正則表達式

咱們看一下百度百科給出的解釋:CORS 是一種容許當前域(domain)的資源(好比 html/js/web service)被其餘域(domain)的腳本請求訪問的機制,一般因爲同域安全策略(the same-origin security policy)瀏覽器會禁止這種跨域請求。編程

1json


   

CORS 實現兩種模型api

1.1跨域


   

簡單模型

支持 get/post/put/delete 請求,例如返回 Access-Control-Allow-Origin:*,可是不容許自定義 header 且會忽略 cookies,且 post 數據格式有限制,只支持 ‘text/plain', 'application/x-www-urlencoded'and'multipart/form-data',其中’text/plain'默認支持,後面兩種須要下面的預檢請求和服務器協商。

1.2


   

協商模型/預檢請求(Preflighted Request)

舉例:瀏覽器發出 PUT 請求,OPTION 請求返回 Access-Control-Allow-Origin: 容許瀏覽器的腳本執行服務器返回的數據。

跨域資源共享標準新增了一組 HTTP 首部字段,容許服務器聲明哪些源站經過瀏覽器有權限訪問哪些資源。另外,規範要求,對那些可能對服務器數據產生反作用的 HTTP 請求方法(特別是 GET 之外的 HTTP 請求,或者搭配某些 MIME 類型的 POST 請求),瀏覽器必須首先使用 OPTIONS 方法發起一個預檢請求(preflight request),從而獲知服務端是否容許該跨域請求。服務器確認容許以後,才發起實際的 HTTP 請求。在預檢請求的返回中,服務器端也能夠通知客戶端,是否須要攜帶身份憑證(包括 Cookies 和 HTTP 認證相關數據)。

2


   

FastAPI 利用 CORSMiddleware 中間件來實現 CORS。

2.1


   

使用 CORSMiddleware

咱們經過如下流程在 FastAPI 應用中使用 CORSMiddleware
一、導入 CORSMiddleware
二、建立容許的 origins 列表
三、在應用中引入 CORSMiddleware 中間件
四、鑑權信息(Authorization headers, Cookies 等)
五、支持的 HTTP 方法(POST,GET,或者全部"")

from fastapi import FastAPIfrom fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
origins = [ "http://127.0.0.1", "https://www.baidu.com", "https://www.hao123.com", "http://localhost:8080",]
app.add_middleware( CORSMiddleware, allow_origins=origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"],)

@app.get("/")async def main(): return {"message": "Hello World,"}


2.2


   

CORSMiddleware 解析

CORSMiddleware 的參數默認值是受限制的,爲了在跨域訪問中支持相應的功能,咱們應當顯示指定具體參數的的信息。CORSMiddleware 支持參數信息以下:
一、allow_origins:容許跨域請求的域名列表,例如 ['https://example.org ', 'https://www.example.org'] 或者 ['']
二、allow_origin_regex:容許容許跨域請求的域名正則表達式,例如 'https://..example.org'
三、allow_methods:容許跨域請求的 HTTP 方法列表,默認爲['GET'],[''] 表示容許全部 HTTP 方法

四、allow_headers:跨域請求支持的 HTTP 頭信息列表。['']表示容許全部頭信息。Accept, Accept-Language, Content-Language 和 Content-Type 頭信息默認全都支持

五、allow_credentials:表示在跨域請求時是否支持 cookie,默認爲 False

六、expose_headers:表示對瀏覽器可見的返回結果頭信息,默認爲[]
七、max_age:瀏覽器緩存 CORS 返回結果的最大時長,默認爲 600 (單位秒)

3


   

請求種類

瀏覽器將 CORS 請求分紅兩類:簡單請求(Simple requests)和非簡單請求,也叫預檢請求(CORS preflight requests)。

3.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 凡是不一樣時知足上面兩個條件,就屬於非簡單請求。

3.2


   

瀏覽區處理兩種請求的區別

一、簡單請求對於簡單請求,瀏覽器直接發出 CORS 請求。具體來講,就是在頭信息之中,增長一個 Origin 字段。Origin 字段用來講明,本次請求來自哪一個源(協議 + 域名 + 端口)。服務器根據這個值,決定是否贊成此次請求。在這種狀況下,中間件會正常傳遞請求信息,但會在返回結果中包含恰當的 CORS 頭信息。

二、預檢請求非簡單請求是那種對服務器有特殊要求的請求,好比請求方法是 PUT 或DELETE ,或者 Content-Type 字段的類型是 application/json。

非簡單請求的 CORS 請求,會在正式通訊以前,增長一次 HTTP 查詢請求,稱爲"預檢"請求(preflight)。

瀏覽器先詢問服務器,當前網頁所在的域名是否在服務器的許可名單之中,以及可使用哪些 HTTP 方法和頭信息字段。只有獲得確定答覆,瀏覽器纔會發出正式的請求,不然就報錯。

"預檢"請求用的請求方法是 OPTIONS,表示這個請求是用來詢問的。頭信息裏面,關鍵字段是 Origin,表示請求來自哪一個源。

除了 Origin 字段,"預檢"請求的頭信息包括兩個特殊字段。

1.Access-Control-Request-Method 該字段是必須的,用來列出瀏覽器的 CORS 請求會用到哪些 HTTP 方法,上例是 PUT 。

2.Access-Control-Request-Headers 該字段是一個逗號分隔的字符串,指定瀏覽器 CORS 請求會額外發送的頭信息字段,上例是 X-Custom-Header。服務器收到"預檢"請求之後,檢查了 Origin、Access-Control-Request-Method 和 Access-Control-Request-Headers 字段之後,確認是否容許跨源請求,就能夠作出迴應。

在這種狀況下,中間件會攔截請求信息而且根據是否容許跨域請求返回不一樣的請求結果信息。

4


   

與 JSONP 的比較

CORS 與 JSONP 的使用目的相同,可是比 JSONP 更強大。JSONP 只支持 GET 請求,CORS 支持全部類型的 HTTP 請求。JSONP 的優點在於支持老式瀏覽器,以及能夠向不支持 CORS 的網站請求數據。

5


   

CORS 總結:

1.給出 CORS 的定義
2.在 fastapi 中如何使用 CORSMiddleware 中間件實現 CORS
3.給出 CORS 與 JSONP 的比較

擴展資料:

1.https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS


原創不易,只願能幫助那些須要這些內容的同行或剛入行的小夥伴,你的每次 點贊分享 都是我繼續創做下去的動力,我但願能在推廣 python 技術的道路上盡我一份力量,歡迎在評論區向我提問,我都會一一解答,記得一鍵三連支持一下哦!


加入python學習交流微信羣,請後臺回覆「入羣



往期推薦

python生產實戰 python 閉包之庖丁解牛篇

大型fastapi項目實戰 靠 python 中間件解決方案漲薪了

大型fastapi項目實戰 高併發請求神器之aiohttp(下)

大型fastapi項目實戰 高併發請求神器之aiohttp(上) [建議收藏]


本文分享自微信公衆號 - python編程軍火庫(PythonCoder1024)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索