FastAPI(39)- 使用 CORS 解決跨域問題

同源策略

//www.cnblogs.com/poloyy/p/15345184.html

 

CORS

//www.cnblogs.com/poloyy/p/15345871.html

 

FastAPI 模擬跨域問題

//www.cnblogs.com/poloyy/p/15345763.html

 

需要先了解什麼是同源策略、CORS、跨域報錯栗子才能更好看懂這篇文章

 

先看看之前跨域請求報錯的截圖

  • preflight 就是預檢請求,沒有通過服務端的允許,所以訪問失敗;
  • 點下右側的箭頭,實際發起的 login 請求會高亮
  • 第一個 login 請求就是實際發送的請求,因為預檢請求失敗,所以會報跨域錯誤

 

CORSMiddleware

  • CORSMiddleware 使用的默認參數在默認情況下是有限制性的,所以才有跨域問題
  • 因此需要顯式啟用特定的源、方法或 Headers,以便允許瀏覽器在跨域上下文中使用它們

 

allow_origins

  • 允許發出跨域請求的列表
  • 例如  [//example.org, //www.example.org] 
  • 可以使用  [*]  來允許任何來源

 

allow_methods

  • 允許跨域請求的 HTTP 方法列表
  • 默認為 [GET] 
  • 可以使用  [*] 來允許所有標準請求方法

 

allow_headers

  • 允許跨域請求攜帶的 HTTP Request Headers 列表
  • 默認為 [] 
  • 可以使用 [*] 來允許所有 Headers
  • 對於 CORS 請求,始終允許 Accept、Accept-Language、Content-Language 和 Content-Type 

 

allow_credentials

  • 跨域請求應該支援 cookie
  • 默認為 False
  • 重點:為了允許憑據,allow_origins 不能設置為 [‘*’],必須指定 origins

 

allow_origin_regex

  • 正則表達式字元串
  • 匹配允許發出跨域請求的源

 

expose_headers

  • 允許瀏覽器訪問的任何 Response Headers
  • 默認為 [] 

 

max_age

  • 設置瀏覽器快取 CORS 響應的最長時間(以秒為單位),其實就是 preflight 預檢請求的結果能夠被快取多久
  • 默認為 600 

 

使用 CORSMiddleware 解決跨域問題

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠蘿測試筆記
# blog:  //www.cnblogs.com/poloyy/
# time: 2021/9/28 12:58 下午
# file: 33_cors.py
"""
import uvicorn
from fastapi import FastAPI, Body
# 1、導入對應的包
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

# 2、聲明一個 源 列表;重點:要包含跨域的客戶端 源
origins = [
    "//localhost.tiangolo.com",
    "//localhost.tiangolo.com",
    "//localhost",
    "//localhost:8080",
    # 客戶端的源
    "//127.0.0.1:8081"
]

# 3、配置 CORSMiddleware
app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,  # 允許訪問的源
    allow_credentials=True,  # 支援 cookie
    allow_methods=["*"],  # 允許使用的請求方法
    allow_headers=["*"]  # 允許攜帶的 Headers
)


# 模擬服務端 登錄 介面
@app.post("/login")
def get_login(id: str = Body(...), name: str = Body(...)):
    return {"id": id, "name": name}


if __name__ == '__main__':
    # 服務端埠是 8080!
    uvicorn.run(app="33_cors1:app", reload=True, host="127.0.0.1", port=8080)

 

訪問瀏覽器,查看 F12 開發者工具 Network

  • preflight 就是預檢請求,服務端允許它訪問了,所以請求成功
  • 點下右側的箭頭,實際發起的 login 請求會高亮
  • 第一個 login 請求就是實際發送的請求,因為預檢請求成功,所以它也請求成功啦

 

看看 preflight 預檢請求的響應

這些就是 FastAPI 服務端設置的

 

看看實際 login 請求的響應頭

 

看看響應體

 

至此!現在可以正常跨域發起請求啦!

至此!現在可以正常跨域發起請求啦!

至此!現在可以正常跨域發起請求啦!