新聞中心
CORS 或者「跨域資源共享」 指瀏覽器中運(yùn)行的前端擁有與后端通信的 JavaScript 代碼,而后端處于與前端不同的「源」的情況。

專(zhuān)注于為中小企業(yè)提供成都網(wǎng)站制作、做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)橫山免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了千余家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
源
源是協(xié)議(http,https)、域(myapp.com,localhost,localhost.tiangolo.com)以及端口(80、443、8080)的組合。
因此,這些都是不同的源:
- http://localhost
- https://localhost
- http://localhost:8080
即使它們都在 localhost 中,但是它們使用不同的協(xié)議或者端口,所以它們都是不同的「源」。
步驟
假設(shè)你的瀏覽器中有一個(gè)前端運(yùn)行在 http://localhost:8080,并且它的 JavaScript 正在嘗試與運(yùn)行在 http://localhost 的后端通信(因?yàn)槲覀儧](méi)有指定端口,瀏覽器會(huì)采用默認(rèn)的端口 80)。
然后,瀏覽器會(huì)向后端發(fā)送一個(gè) HTTP OPTIONS 請(qǐng)求,如果后端發(fā)送適當(dāng)?shù)?headers 來(lái)授權(quán)來(lái)自這個(gè)不同源(http://localhost:8080)的通信,瀏覽器將允許前端的 JavaScript 向后端發(fā)送請(qǐng)求。
為此,后端必須有一個(gè)「允許的源」列表。
在這種情況下,它必須包含 http://localhost:8080,前端才能正常工作。
通配符
也可以使用 "*"(一個(gè)「通配符」)聲明這個(gè)列表,表示全部都是允許的。
但這僅允許某些類(lèi)型的通信,不包括所有涉及憑據(jù)的內(nèi)容:像 Cookies 以及那些使用 Bearer 令牌的授權(quán) headers 等。
因此,為了一切都能正常工作,最好顯式地指定允許的源。
使用 CORSMiddleware
你可以在 FastAPI 應(yīng)用中使用 CORSMiddleware 來(lái)配置它。
- 導(dǎo)入 CORSMiddleware。
- 創(chuàng)建一個(gè)允許的源列表(由字符串組成)。
- 將其作為「中間件」添加到你的 FastAPI 應(yīng)用中。
你也可以指定后端是否允許:
- 憑證(授權(quán) headers,Cookies 等)。
- 特定的 HTTP 方法(POST,PUT)或者使用通配符 "*" 允許所有方法。
- 特定的 HTTP headers 或者使用通配符 "*" 允許所有 headers。
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
origins = [
"http://localhost.tiangolo.com",
"https://localhost.tiangolo.com",
"http://localhost",
"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"}
默認(rèn)情況下,這個(gè) CORSMiddleware 實(shí)現(xiàn)所使用的默認(rèn)參數(shù)較為保守,所以你需要顯式地啟用特定的源、方法或者 headers,以便瀏覽器能夠在跨域上下文中使用它們。
支持以下參數(shù):
- allow_origins - 一個(gè)允許跨域請(qǐng)求的源列表。例如 ['https://example.org', 'https://www.example.org']。你可以使用 ['*'] 允許任何源。
- allow_origin_regex - 一個(gè)正則表達(dá)式字符串,匹配的源允許跨域請(qǐng)求。例如 'https://.*\.example\.org'。
- allow_methods - 一個(gè)允許跨域請(qǐng)求的 HTTP 方法列表。默認(rèn)為 ['GET']。你可以使用 ['*'] 來(lái)允許所有標(biāo)準(zhǔn)方法。
- allow_headers - 一個(gè)允許跨域請(qǐng)求的 HTTP 請(qǐng)求頭列表。默認(rèn)為 []。你可以使用 ['*'] 允許所有的請(qǐng)求頭。Accept、Accept-Language、Content-Language 以及 Content-Type 請(qǐng)求頭總是允許 CORS 請(qǐng)求。
- allow_credentials - 指示跨域請(qǐng)求支持 cookies。默認(rèn)是 False。另外,允許憑證時(shí) allow_origins 不能設(shè)定為 ['*'],必須指定源。
- expose_headers - 指示可以被瀏覽器訪問(wèn)的響應(yīng)頭。默認(rèn)為 []。
- max_age - 設(shè)定瀏覽器緩存 CORS 響應(yīng)的最長(zhǎng)時(shí)間,單位是秒。默認(rèn)為 600。
中間件響應(yīng)兩種特定類(lèi)型的 HTTP 請(qǐng)求……
CORS 預(yù)檢請(qǐng)求
這是些帶有 Origin 和 Access-Control-Request-Method 請(qǐng)求頭的 OPTIONS 請(qǐng)求。
在這種情況下,中間件將攔截傳入的請(qǐng)求并進(jìn)行響應(yīng),出于提供信息的目的返回一個(gè)使用了適當(dāng)?shù)?CORS headers 的 200 或 400 響應(yīng)。
簡(jiǎn)單請(qǐng)求
任何帶有 Origin 請(qǐng)求頭的請(qǐng)求。在這種情況下,中間件將像平常一樣傳遞請(qǐng)求,但是在響應(yīng)中包含適當(dāng)?shù)?CORS headers。
更多信息
更多關(guān)于 CORS 的信息,請(qǐng)查看 Mozilla CORS 文檔。
技術(shù)細(xì)節(jié)
你也可以使用 from starlette.middleware.cors import CORSMiddleware。
出于方便,F(xiàn)astAPI 在 fastapi.middleware 中為開(kāi)發(fā)者提供了幾個(gè)中間件。但是大多數(shù)可用的中間件都是直接來(lái)自 Starlette。
文章名稱(chēng):創(chuàng)新互聯(lián)FastAPI教程:FastAPI教程CORS(跨域資源共享)
文章起源:http://www.dlmjj.cn/article/cdhssjh.html


咨詢(xún)
建站咨詢(xún)
