最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python web框架fastapi中間件的使用及CORS跨域問題

 更新時間:2024年03月08日 11:30:51   作者:景天科技苑  
fastapi "中間件"是一個函數(shù),它在每個請求被特定的路徑操作處理之前,以及在每個響應之后工作,它接收你的應用程序的每一個請求,下面通過本文給大家介紹Python web框架fastapi中間件的使用及CORS跨域問題,感興趣的朋友一起看看吧

fastapi中間件與CORS

1、中間件

你可以向 FastAPI 應用添加中間件。

fastapi "中間件"是一個函數(shù),它在每個請求被特定的路徑操作處理之前,以及在每個響應之后工作.
它接收你的應用程序的每一個請求.
然后它可以對這個請求做一些事情或者執(zhí)行任何需要的代碼.
然后它將請求傳遞給應用程序的其他部分 (通過某種路徑操作).
然后它獲取應用程序生產(chǎn)的響應 (通過某種路徑操作).
它可以對該響應做些什么或者執(zhí)行任何需要的代碼.
然后它返回這個 響應.

請求與響應中間件,并不是需要每次都要寫
根據(jù)業(yè)務需求
例如:如果向做個請求攔截中間件,攔截那些非法請求的ip,只需要在請求中間件中做限制即可,無需讓該用戶的請求到達業(yè)務邏輯層
如果想做響應給每個用戶的頁面添加個作者信息的響應頭,不需要在業(yè)務代碼每個邏輯都做,只需要在響應中間件處做個響應中間件即可
當然,也有兩個中間件都用到的,例如測試請求的響應時間

1.創(chuàng)建中間件方法

要創(chuàng)建中間件你可以在函數(shù)的頂部使用裝飾器 @app.middleware(“http”).

中間件參數(shù)接收如下參數(shù):

  • request.
  • 一個函數(shù)call_next,它將接收request,作為參數(shù),然后執(zhí)行下一個中間件.
    • 這個函數(shù)將 request 傳遞給相應的 路徑操作.
    • 然后它將返回由相應的路徑操作生成的 response.
  • 然后你可以在返回 response 前進一步修改它.

請求中間件函數(shù)在最下面的最先執(zhí)行

案例:

import time
from fastapi import FastAPI  # FastAPI 是一個為你的 API 提供了所有功能的 Python 類。
import uvicorn
from fastapi import Request
#創(chuàng)建應用程序,app是應用程序名
app = FastAPI()  # 這個實例將是創(chuàng)建你所有 API 的主要交互對象。這個 app 同樣在如下命令中被 uvicorn 所引用
#定義中間件m2
@app.middleware('http') #全局中間件
async def m2(request:Request,call_next):
    #請求代碼塊
    print("m2 request")
    response = await call_next(request)
    #響應代碼塊
    print("m2 response")
    # 每個中間件的response,都是訪問的邏輯函數(shù)的響應體
    return response
#定義中間件m1
@app.middleware('http') #全局中間件
async def m1(request:Request,call_next):
    #請求代碼塊
    print("m1 request")
    response = await call_next(request)
    #響應代碼塊
    print("m1 response")
    #每個中間件的response,都是訪問的邏輯函數(shù)的響應體
    return response
@app.get("/user")
def get_user():
    time.sleep(3)
    print("get_user函數(shù)執(zhí)行")
    return {
        "user": "current user"
    }
@app.get("/item/{item_id}")
def get_item(item_id: int):
    time.sleep(2)
    print("get_item函數(shù)執(zhí)行")
    return {
        "item_id": item_id
    }
if __name__ == '__main__':
    #注意,run的第一個參數(shù) 必須是文件名:應用程序名
    uvicorn.run("main:app", port=8083,  reload=True,workers=1)

我們測試接口/user,看下請求與響應順序

請求先走m1中間件,再走m2中間件。然后是邏輯函數(shù)響應,然后走走m2中間件響應,最后走m1中間件響應

2.中間件里面添加響應頭

#定義中間件m2
@app.middleware('http') #全局中間件
async def m2(request:Request,call_next):
    #請求代碼塊
    print("m2 request")
    response = await call_next(request)
    #響應代碼塊
    print("m2 response")
    #添加響應頭
    response.headers['author'] = 'jingtian'
    # 每個中間件的response,都是訪問的邏輯函數(shù)的響應體
    return response

測試,可以看到所有接口,都添加了個響應頭

3.在請求處,設置攔截等等

if request.client.host in ['127.0.0.1']:
    return  Response(content='visit forbidden',status_code=403)

訪問接口

也可以針對某個接口請求做限制

if request.url.path in ["/user"]:
    return Response(content="visit forbidden",status_code=403)

訪問/user接口被拒絕

訪問其他接口正常

4.測試接口響應時間

可以在最后一個中間件做

#定義中間件m1
@app.middleware('http') #全局中間件
async def m1(request:Request,call_next):
    #請求代碼塊
    print("m1 request")
    # if request.client.host in ['127.0.0.1']:
    #     return  Response(content='visit forbidden',status_code=403)
    start = time.time()
    if request.url.path in ["/user"]:
        return Response(content="visit forbidden",status_code=403)
    response = await call_next(request)
    #響應代碼塊
    print("m1 response")
    #測試訪問結束時間
    end = time.time()
    response.headers["ProcessTimer"] = str(end - start)
    #每個中間件的response,都是訪問的邏輯函數(shù)的響應體
    return response
我們針對每個接口做了響應時間阻塞
@app.get("/user")
def get_user():
    time.sleep(3)
    print("get_user函數(shù)執(zhí)行")
    return {
        "user": "current user"
    }
@app.get("/item/{item_id}")
def get_item(item_id: int):
    time.sleep(2)
    print("get_item函數(shù)執(zhí)行")
    return {
        "item_id": item_id
    }

測試,/item接口響應時間為2秒多

/user接口響應時間,響應3秒多

2、CORS

1.同源策略帶來的跨域問題

在前后端分離的項目中,前端和后端如果部署在同一個服務器,那么運行端口肯定不一樣
當前端發(fā)起請求到后端,這個時候發(fā)送的首先是 option 請求,而不是真正的請求
后端拿到 option 請求后先判斷有沒有資格(權限),如果沒有就會報錯;如果有,則會繼續(xù)請求你真正發(fā)起的請求
一句話總結:在瀏覽器中運行的前端編寫了和服務端通信的 JavaScript 代碼,而服務端與前端處于不同“源”的情況
協(xié)議相同+域名相同+端口號相同,瀏覽器才認為是同一個網(wǎng)站,才不會受到同源策略的影響,才可以正常的發(fā)送Ajax請求

2.跨域的解決方法

因為瀏覽器同源策略,也正是有了跨域限制,才使我們能安全的上網(wǎng)
但是在實際開發(fā)中,有時候需要突破這樣的限制,所以就誕生了 CORS

3.CORS

Cross-Origin Resource Sharing 跨域資源共享
是一種基于 HTTP Headers 的機制,該機制通過允許服務器標示除了它自己以外的其它origin(域名,協(xié)議和端口),這樣瀏覽器可以訪問加載這些跨域資源
CORS 還通過一種機制來檢查服務器是否會允許要發(fā)送的真實請求,該機制通過瀏覽器發(fā)起一個到服務器托管的跨源資源的"預檢"請求
在預檢中,瀏覽器發(fā)送的 Headers 中標示有 HTTP 方法和真實請求中會用到的頭

案例:

后端代碼:

from fastapi import FastAPI  # FastAPI 是一個為你的 API 提供了所有功能的 Python 類。
import uvicorn
#創(chuàng)建應用程序,app是應用程序名
app = FastAPI()  # 這個實例將是創(chuàng)建你所有 API 的主要交互對象。這個 app 同樣在如下命令中被 uvicorn 所引用
@app.get("/user")
def get_user():
    print("user:jingtian", )
    return {
        "user": "jingtian"
    }
if __name__ == '__main__':
    #注意,run的第一個參數(shù) 必須是文件名:應用程序名
    uvicorn.run("CORS:app", port=8080,  reload=True)

創(chuàng)建個前端頁面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
</head>
<body>
<p>click</p>
<script>
    $("p").click(function () {
        $.ajax({
            url: "http://127.0.0.1:8080/user",
            success: function (res) {
                console.log(res)
                console.log(res.user)
                $("p").html("hello " + res.user)
            },
        })
    })
</script>
</body>
</html>

我們在本地用瀏覽器將html文件打開,可以看到協(xié)議,域名都與服務端不同

此時,我們點擊click,可以看到出現(xiàn)了同源跨域攔截

后端改造,實現(xiàn)CORS,資源跨域共享
添加個響應中間件

1.方式一

@app.middleware("http")
async def CORSMiddleware(request: Request, call_next):
    response = await call_next(request)
    response.headers["Access-Control-Allow-Origin"] = "*"
    return response

此時再在頁面點擊click,拿到數(shù)據(jù)

看下響應頭,就有了我們添加的響應頭 Access-Control-Allow-Origin

如果只允許部分網(wǎng)站來訪問,那么就不要用*,使用允許訪問的ip(域名)和端口

2.方式二

使用fastapi自帶的中間件

from fastapi.middleware.cors import CORSMiddleware
#方式二
origins = [
    "http://localhost:63342"
]
app.add_middleware(
    CORSMiddleware,
    allow_origins="*",  # *:代表所有客戶端
    allow_credentials=True,
    allow_methods=["GET", "POST"],
    allow_headers=["*"],
)

默認情況下,CORSMiddleware 默認實現(xiàn)的參數(shù)較為保守,因此需要顯式地啟用特定的源、方法或者 headers,以便瀏覽器能夠在跨域上下文中使用它們。

支持以下參數(shù):

allow_origins :允許跨域請求的源列表。例如 [‘https://example.org’, ‘https://www.example.org’],你可以使用 [‘'] 允許任何源。
allow_origin_regex :一個正則表達式字符串,匹配的源允許跨域請求。例如 'https://..example.org’。
allow_methods :允許跨域請求的 HTTP 方法列表,默認為 [‘GET’],你可以使用 [‘‘] 來允許所有標準方法。
allow_headers:允許跨域請求的 HTTP 請求頭列表。默認為 [](空)。你可以使用 [’’] 允許所有的請求頭,Accept、Accept-Language、Content-Language 以及 Content-Type 請求頭總是允許 CORS 請求。
allow_credentials:指示跨域請求支持 cookies,默認是 False。另外,允許憑證時 allow_origins 不能設定為 [‘*’],必須指定源。
expose_headers:指示可以被瀏覽器訪問的響應頭。默認為 []。
max_age:設定瀏覽器緩存 CORS 響應的最長時間,單位是秒。默認為 600。

點擊,也能實現(xiàn)跨域訪問

到此這篇關于Python web框架fastapi中間件的使用,CORS跨域詳解的文章就介紹到這了,更多相關Python fastapi中間件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 一文帶你深入理解Python中zip的用法

    一文帶你深入理解Python中zip的用法

    在Python編程中,zip()函數(shù)是處理多個可迭代對象d的好方法,本文將深入解析zip()的核心用法、進階技巧及實際應用場景,有需要的小伙伴可以了解下
    2026-01-01
  • pycharm新建Vue項目的方法步驟(圖文)

    pycharm新建Vue項目的方法步驟(圖文)

    這篇文章主要介紹了pycharm新建Vue項目的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • 使用Python代碼實現(xiàn)對Excel單元格的鎖定

    使用Python代碼實現(xiàn)對Excel單元格的鎖定

    在Excel表格中,我們可以通過鎖定特定的單元格或區(qū)域,防止對單元格內容進行隨意修改,確保關鍵數(shù)據(jù)、公式或格式不被誤改,本文將介紹如何使用Python代碼來實現(xiàn)對Excel單元格的鎖定,實現(xiàn)批量操作以及自動化,需要的朋友可以參考下
    2024-06-06
  • python3中的類繼承你真的了解嗎

    python3中的類繼承你真的了解嗎

    這篇文章主要為大家詳細介紹了python3中的類繼承,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Python中Functools模塊的高級操作詳解

    Python中Functools模塊的高級操作詳解

    functools模塊是Python標準庫中的一個寶庫,提供了一些有用的功能,可以幫助您更好地利用函數(shù)的潛力,下面小編就來為大家介紹一下functools模塊的相關具體使用吧
    2023-11-11
  • Keras使用ImageNet上預訓練的模型方式

    Keras使用ImageNet上預訓練的模型方式

    這篇文章主要介紹了Keras使用ImageNet上預訓練的模型方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Python方法中self和parent參數(shù)用法詳解

    Python方法中self和parent參數(shù)用法詳解

    大家好!今天我們來聊一個 Python 中常見但可能讓人困惑的話題:方法參數(shù)里的 self 和 parent,在這篇博客中,我會分三個章節(jié)逐步講解它們的含義、作用和實際應用,帶你徹底搞懂它們,需要的朋友可以參考下
    2025-04-04
  • 三大Python時間處理庫datetime/arrow/pandas的使用通關指南

    三大Python時間處理庫datetime/arrow/pandas的使用通關指南

    本文從標準庫datetime的底層原理講起,到arrow的簡潔優(yōu)雅,再到pandas的時間序列大殺器,覆蓋99%的Python時間處理場景,全文附代碼示例,時區(qū)避坑指南和工程落地建議
    2026-03-03
  • Python零錢兌換的實現(xiàn)代碼

    Python零錢兌換的實現(xiàn)代碼

    假如有這樣一個問題給你一個整數(shù)數(shù)組?coins?,表示不同面額的硬幣以及一個整數(shù)?amount?,表示總金額,計算并返回可以湊成總金額所需的最少的硬幣個數(shù),接下來通過示例代碼給大家介紹Python零錢兌換問題,感興趣的朋友一起看看吧
    2022-05-05
  • python使用import引入其他目錄文件方式

    python使用import引入其他目錄文件方式

    這篇文章主要介紹了python使用import引入其他目錄文件方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02

最新評論

东辽县| 通城县| 神农架林区| 宜川县| 吉木萨尔县| 高碑店市| 霞浦县| 屏东市| 锦屏县| 玛曲县| 定边县| 平顶山市| 佳木斯市| 聂拉木县| 山东省| 武功县| 民县| 金沙县| 佛教| 阿巴嘎旗| 太仓市| 卢氏县| 内乡县| 六安市| 池州市| 肥乡县| 天柱县| 招远市| 龙井市| 黄梅县| 保亭| 浦县| 昆山市| 油尖旺区| 东乌| 潮安县| 维西| 长垣县| 金昌市| 台南市| 德清县|