日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

FastAPI請(qǐng)求體實(shí)戰(zhàn):Pydantic模型定義、校驗(yàn)與錯(cuò)誤處理

FastAPI請(qǐng)求體實(shí)戰(zhàn):Pydantic模型定義、校驗(yàn)與錯(cuò)誤處理 Fast API請(qǐng)求體前兩天幫一個(gè)從Flask遷移過來的朋友調(diào)接口他問了一個(gè)特別典型的問題FastAPI里接收前端傳的JSON到底怎么確認(rèn)字段類型是對(duì)的是不是還得像Flask那樣自己request.get_json()然后手寫一堆if判斷這個(gè)問題我聽了不下十次。很多剛接觸FastAPI的開發(fā)者第一感覺是這不就是把JSON變成dict嘛但實(shí)際上FastAPI把請(qǐng)求體Request Body作為整套框架里最核心的設(shè)計(jì)之一背后的玩法要比Flask原生方式深得多。這篇文章就用我自己的實(shí)踐經(jīng)驗(yàn)把FastAPI請(qǐng)求體的定義、驗(yàn)證、嵌套處理、錯(cuò)誤排查、進(jìn)階設(shè)計(jì)以及邊界情況完整捋一遍適合正在用FastAPI寫接口、或者準(zhǔn)備從Flask遷過來、又或者想弄清楚Pydantic模型到底怎么影響線上接口的人。你會(huì)在文章里看到大量真實(shí)項(xiàng)目中會(huì)遇到的場(chǎng)景——比如嵌套JSON、動(dòng)態(tài)字段、前后端命名不一致、外部調(diào)用比如FastAPI再封裝一個(gè)AI模型的請(qǐng)求參數(shù)時(shí)的請(qǐng)求體落地方式。這些場(chǎng)景光看官方文檔容易忽略踩過坑才知道怎么做。1. 請(qǐng)求體在FastAPI里的定位從Flask遷移者視角的一次澄清1.1 Flask時(shí)代我們是怎么處理JSON的先說Flask。傳統(tǒng)寫法大概是這樣的from flask import Flask, request, jsonify app Flask(__name____) app.post(/items) def create_item(): data request.get_json(forceTrue) if not data: return jsonify({error: no data}), 400 name data.get(name) price data.get(price) if not isinstance(name, str): return jsonify({error: name must be str}), 400 if not isinstance(price, (int, float)): return jsonify({error: price must be number}), 400 # ... 繼續(xù)手寫校驗(yàn)這段代碼最大的問題不是長(zhǎng)而是每個(gè)接口都要來一遍。字段一多校驗(yàn)邏輯就開始指數(shù)增長(zhǎng)判類型、判必填、判范圍、嵌套的JSON還要遞歸處理。最要命的是這類代碼往往在項(xiàng)目里大量復(fù)制粘貼改一個(gè)字段名就要全局搜。1.2 FastAPI把請(qǐng)求體當(dāng)成了類型系統(tǒng)的一部分FastAPI換了一個(gè)思路它不讓你手動(dòng)接數(shù)據(jù)、手動(dòng)校驗(yàn)而是讓你聲明數(shù)據(jù)長(zhǎng)什么樣剩下交給框架。核心機(jī)制就是Pydantic模型——你用Python類型注解描述請(qǐng)求體的結(jié)構(gòu)FastAPI在收到HTTP請(qǐng)求時(shí)自動(dòng)完成三件事解析、轉(zhuǎn)換、驗(yàn)證。from fastapi import FastAPI from pydantic import BaseModel class Item(BaseModel): name: str price: float tax: float | None None app.post(/items/) async def create_item(item: Item): return item注意這里根本沒寫request.get_json()也沒寫任何isinstance。但實(shí)際收到的效果是前端傳{name: keyboard, price: 299}→item是一個(gè)Item實(shí)例不是普通dict前端漏傳price→ FastAPI直接返回422校驗(yàn)錯(cuò)誤接口代碼一行都不用改前端把price傳成字符串299→ FastAPI做了類型轉(zhuǎn)換變成了float(299)。對(duì)我這種從Flask走過來的人來說這個(gè)差異是顛覆性的。請(qǐng)求體不再是一串JSON字符串而是一個(gè)被類型約束過的Python對(duì)象。順便多說一句在很多面試?yán)飼?huì)問到FastAPI和Flask最大的區(qū)別是什么我如果用一句話回答就是Flask把HTTP請(qǐng)求交給你自己處理FastAPI把HTTP請(qǐng)求變成你聲明的類型模型。理解了這一點(diǎn)后面所有請(qǐng)求體相關(guān)的知識(shí)都能串起來。2. 從零定義一個(gè)請(qǐng)求體模型類型注解、默認(rèn)值與Field約束2.1 BaseModel是最短路徑先建立一個(gè)最小可用模型。無論接口多簡(jiǎn)單我都推薦用BaseModel子類而不是直接返回dict原因后面會(huì)展開。from pydantic import BaseModel class UserCreate(BaseModel): username: str email: str age: int | None None tags: list[str] []這里有幾個(gè)隱含行為值得注意username沒有默認(rèn)值 → 必填字段age的int | None None→ 可選字段傳不傳都行傳了必須是整數(shù)或nulltags給了默認(rèn)空列表 → 前端不傳后端就是[]不會(huì)報(bào)錯(cuò)。我見過不少新手在這里翻車把可選字段寫成age: int | None卻忘記給默認(rèn)值。這在Pydantic里表示必填但只要傳就允許是None和完全可不傳是兩個(gè)意思。把它暴露給前端前端不傳age就會(huì)收到422排查半天。2.2 Field才是真正的校驗(yàn)入口類型注解只是第一層約束。實(shí)際項(xiàng)目中字段往往有更細(xì)的規(guī)則——比如用戶名最短3個(gè)字符、密碼最少8位、價(jià)格不能為負(fù)。這時(shí)用Field來聲明明細(xì)約束from pydantic import BaseModel, Field class ProductCreate(BaseModel): name: str Field(..., min_length3, max_length50, description商品名稱) price: float Field(..., gt0, le999999, description單價(jià)) stock: int Field(0, ge0, description庫(kù)存) tag: str | None Field(None, pattern^[a-z0-9-]$)Field里的...表示必填其他參數(shù)含義非常直觀min_length、max_length、gt大于、ge大于等于、le小于等于、pattern正則。實(shí)際工作中我習(xí)慣把description也寫上。為什么因?yàn)檫@個(gè)description會(huì)直接出現(xiàn)在FastAPI自動(dòng)生成的OpenAPI文檔里前端同事看Swagger UI的時(shí)候能看到每個(gè)字段說明省掉大量口口相傳的溝通成本。這也算是聲明式開發(fā)的附加紅利。2.3 前端傳了類型不對(duì)的值FastAPI做了什么這是我特別想強(qiáng)調(diào)的一點(diǎn)。很多人以為校驗(yàn)失敗就返回一個(gè)籠統(tǒng)的參數(shù)錯(cuò)誤其實(shí)FastAPI在類型轉(zhuǎn)換上非常寬容但在類型轉(zhuǎn)換不成功時(shí)報(bào)錯(cuò)又特別精確。舉個(gè)例子前端傳{name: 123}Pydantic默認(rèn)不會(huì)報(bào)錯(cuò)而是試圖把123轉(zhuǎn)成字符串123。這種行為在有些場(chǎng)景下是好事——比如數(shù)字類型的ID用字符串傳也能被轉(zhuǎn)換但有些場(chǎng)景是坑——比如布爾值true會(huì)被轉(zhuǎn)成1存進(jìn)庫(kù)里可能不符合預(yù)期。如果實(shí)在不想讓Pydantic做這種自動(dòng)轉(zhuǎn)類型可以用StrictStr、StrictInt這樣的嚴(yán)格類型或者用Field(strictTrue)。但我的建議是普通項(xiàng)目保持默認(rèn)就好因?yàn)榍岸说念愋土?xí)慣本來就不嚴(yán)謹(jǐn)自動(dòng)轉(zhuǎn)換能減少很多無謂的422只在關(guān)鍵字段上用嚴(yán)格模式。數(shù)據(jù)準(zhǔn)確性由后端業(yè)務(wù)邏輯再兜一層。3. 嵌套結(jié)構(gòu)、列表字典與多請(qǐng)求體真實(shí)接口最常見的復(fù)雜形態(tài)3.1 訂單接口里的嵌套模型一個(gè)真實(shí)接口往往不是一層JSON而是多層嵌套。比如常見的創(chuàng)建訂單接口{ order: { total: 399.9, items: [ {sku: a01, quantity: 2}, {sku: b02, quantity: 1} ] }, customer: { name: 張三, phone: 13800000000 } }用Flask處理這種結(jié)構(gòu)一般要層層校驗(yàn)?zāi)硞€(gè)嵌套字段忘了判空就是個(gè)隱性Bug。FastAPI做嵌套模型非常順子模型直接作為類型寫進(jìn)去from pydantic import BaseModel class OrderItem(BaseModel): sku: str quantity: int Field(..., ge1, le99) class Customer(BaseModel): name: str Field(..., min_length2) phone: str Field(..., patternr^1\d{10}$) class OrderCreate(BaseModel): total: float Field(..., gt0) items: list[OrderItem] customer: Customer然后接口定義和單層模型一模一樣app.post(/orders/) async def create_order(order: OrderCreate): return {total: order.total, count: len(order.items)}這里最關(guān)鍵的點(diǎn)是Pydantic會(huì)遞歸驗(yàn)證整個(gè)嵌套結(jié)構(gòu)。items里的每個(gè)元素都必須是OrderItem實(shí)例customer里的phone必須匹配正則。只要有一層不合法整個(gè)請(qǐng)求就在進(jìn)入業(yè)務(wù)邏輯之前被攔住了。3.2 字典套模型的寫法除了list嵌套實(shí)際項(xiàng)目里dict嵌套也很常見。比如一個(gè)配置項(xiàng)接口key是動(dòng)態(tài)的配置名value是固定結(jié)構(gòu)的配置內(nèi)容class ConfigItem(BaseModel): enabled: bool True timeout: int Field(30, ge1) class BatchConfigRequest(BaseModel): configs: dict[str, ConfigItem]前端傳{ configs: { retry: {enabled: true, timeout: 60}, cache: {timeout: 5} } }FastAPI能正確處理configs為dict[str, ConfigItem]。這樣你在業(yè)務(wù)代碼里訪問request.configs[retry].timeout時(shí)拿到的是int類型值而不是需要再手動(dòng)轉(zhuǎn)換的原始dict。這類寫法在批量更新配置、批量創(chuàng)建子資源時(shí)非常實(shí)用。3.3 一個(gè)接口有多個(gè)請(qǐng)求體參數(shù)embedTrue出現(xiàn)的時(shí)機(jī)很多后端開發(fā)習(xí)慣把請(qǐng)求體整體作為一個(gè)模型參數(shù)傳入。但FastAPI其實(shí)允許多個(gè)Pydantic模型作為多個(gè)body參數(shù)app.post(/create/) async def create(product: ProductCreate, user: UserCreate): pass聽起來很方便但有個(gè)坑FastAPI期望前端傳的JSON是{product: {...}, user: {...}}也就是每個(gè)參數(shù)對(duì)應(yīng)一個(gè)同名字段。如果你只是想讓前端傳一個(gè)平鋪的{...}就會(huì)得到422。解決方案是Body(embedTrue)from fastapi import Body app.post(/create/) async def create( product: ProductCreate Body(embedTrue), user: UserCreate Body(embedTrue), ): pass用了embed后前端必須傳{product: {...}, user: {...}}這種嵌套結(jié)構(gòu)兩個(gè)模型才能正確解析。我的使用經(jīng)驗(yàn)是多請(qǐng)求體參數(shù)適合兩個(gè)實(shí)體并列出現(xiàn)的場(chǎng)景比如商品和用戶同時(shí)創(chuàng)建如果兩個(gè)實(shí)體中間有明顯的主從關(guān)系不如把其中一個(gè)作為嵌套字段放進(jìn)另一個(gè)模型語義更清楚。不要為了炫技把一個(gè)接口拆成一堆body參數(shù)前端會(huì)恨你。3.4 循環(huán)引用你要不要用model_rebuild同一篇文章里多個(gè)模型互相引用比如Order引用了UserUser里又有orders: list[Order]這在ORM里常見在Pydantic v2里也支持但寫法上要注意。from typing import Optional from pydantic import BaseModel class UserResponse(BaseModel): name: str orders: Optional[list[OrderResponse]] None class OrderResponse(BaseModel): id: int owner: Optional[UserResponse] None UserResponse.model_rebuild()關(guān)鍵在最后一行。Pydantic v2里循環(huán)引用模型定義完成后需要調(diào)用model_rebuild()讓模型完成引用解析。如果不調(diào)用某些場(chǎng)景下會(huì)報(bào)模型未定義的錯(cuò)。這個(gè)坑在v1里對(duì)應(yīng)的函數(shù)叫update_forward_refs()很多老項(xiàng)目遷移上來容易踩。不過說實(shí)話接口返回模型我一般不建議搞循環(huán)嵌套很容易讓序列化數(shù)據(jù)量失控前端也難處理。真有這種需求優(yōu)先考慮用ID代替完整對(duì)象。4. 422錯(cuò)誤不是玄學(xué)一次完整的請(qǐng)求體驗(yàn)證失敗排查鏈路4.1 讀懂422的錯(cuò)誤結(jié)構(gòu)初戀FastAPI的人第一次看到422多半是懵的。前端同事丟過來一句你接口報(bào)錯(cuò)了返回了一個(gè)我看不懂的JSON打開日志一看{ detail: [ { type: missing, loc: [body, items], msg: Field required, input: {name: keyboard}, url: https://errors.pydantic.dev/2.6/v/missing }, { type: string_too_short, loc: [body, customer, name], msg: String should have at least 2 characters, input: {name: x} } ] }拆開看就很清楚loc錯(cuò)誤發(fā)生的位置[body, customer, name]表示請(qǐng)求體里customer對(duì)象的name字段type錯(cuò)誤類型missing是缺失string_too_short是太短還有g(shù)reater_than、string_pattern_mismatch等msg人類可讀的錯(cuò)誤描述input實(shí)際傳入的值方便對(duì)比。這是一個(gè)非常結(jié)構(gòu)化的錯(cuò)誤協(xié)議。你應(yīng)該把它原樣轉(zhuǎn)發(fā)給前端或者干脆在后端把它翻譯成更友好的接口響應(yīng)。4.2 我最常遇到的三種422觸發(fā)點(diǎn)結(jié)合真實(shí)經(jīng)驗(yàn)請(qǐng)求體驗(yàn)證報(bào)422基本是這三個(gè)原因第一字段缺失。最常見是前端漏傳了新加的必填字段。后端上線新版本加了字段前端沒跟上一調(diào)接口就422。第二類型不對(duì)。前端把數(shù)字以字符串方式傳出來通常沒事FastAPI會(huì)轉(zhuǎn)但如果把數(shù)字傳成布爾值就會(huì)出問題——true可以轉(zhuǎn)成1但abc轉(zhuǎn)不了int。第三約束超范圍。比如quantity字段限了ge1前端傳0直接報(bào)greater_than錯(cuò)誤。這類錯(cuò)誤通常是在前端表單加了個(gè)沒有后端同步的邊界條件導(dǎo)致的。4.3 自定義422返回格式讓前端少罵兩句默認(rèn)422的返回體對(duì)前端不算友好尤其是字段名一會(huì)兒snake_case一會(huì)兒camelCase的時(shí)候。我習(xí)慣在項(xiàng)目里加一個(gè)統(tǒng)一異常處理器把Pydantic的校驗(yàn)錯(cuò)誤轉(zhuǎn)成前端約定好的格式from fastapi import Request from fastapi.exceptions import RequestValidationError from fastapi.responses import JSONResponse app.exception_handler(RequestValidationError) async def validation_handler(request: Request, exc: RequestValidationError): errors [] for err in exc.errors(): loc ..join(str(x) for x in err.get(loc, [])) errors.append({ field: loc, message: err.get(msg, ), value: err.get(input), }) return JSONResponse( status_code422, content{code: 422, message: 參數(shù)校驗(yàn)失敗, errors: errors}, )這樣前端拿到的結(jié)構(gòu)更統(tǒng)一能直接渲染到表單里。當(dāng)然如果你們前后端已經(jīng)習(xí)慣了FastAPI默認(rèn)格式不改也行。但自定義處理器有一個(gè)額外好處在入口處統(tǒng)一打日志方便定位是哪個(gè)接口、哪個(gè)字段出了問題。4.4 排查422時(shí)的一個(gè)實(shí)用小技巧當(dāng)我看不到前端實(shí)際傳了什么body時(shí)第一件事就是看FastAPI的訪問日志嗎不一定。我習(xí)慣在自定義異常處理器里加一行日志把request.body()和exc.errors()一起打出來import logging logger logging.getLogger(validation) app.exception_handler(RequestValidationError) async def validation_handler(request: Request, exc: RequestValidationError): body await request.body() logger.warning(Validation failed. Body%s, body.decode(utf-8, errorsreplace)) ...有人會(huì)擔(dān)心安全泄漏——請(qǐng)求體可能含密碼等敏感數(shù)據(jù)。我的做法是在開發(fā)環(huán)境完整打印生產(chǎn)環(huán)境只打印字段名和錯(cuò)誤類型不打印值。這樣既不耽誤排查也不至于把用戶數(shù)據(jù)打到日志里。順便提一句很多項(xiàng)目在FastAPI里配了uvicorn日志但因?yàn)閘ogging配置混亂導(dǎo)致調(diào)試信息看不到。檢查一下你的log_level配置以及異常處理器里logger是否用了正確的logger名字別讓小問題卡住排查進(jìn)度。5. 請(qǐng)求體的進(jìn)階設(shè)計(jì)繼承復(fù)用、字段映射與動(dòng)態(tài)Key5.1 Create與Update模型用繼承避免重復(fù)實(shí)際項(xiàng)目中創(chuàng)建和更新接口的請(qǐng)求體往往高度相似但又略有不同。創(chuàng)建可能必須傳name和price更新則希望兩個(gè)字段都可選。我一般用繼承來拆分class ProductBase(BaseModel): name: str Field(..., min_length3) price: float Field(..., gt0) description: str | None None class ProductCreate(ProductBase): pass class ProductUpdate(BaseModel): name: str | None Field(None, min_length3) price: float | None Field(None, gt0) description: str | None None注意這里ProductUpdate沒有繼承ProductBase因?yàn)槿绻^承了name和price的必填屬性會(huì)被帶過來更新接口就必須傳全部字段了。這是很多人容易寫錯(cuò)的地方——把Update也直接繼承Base結(jié)果更新時(shí)必須帶上所有字段被迫傳一遍完整對(duì)象。還有一種進(jìn)階做法是讓Update繼承Base然后全部覆蓋為可選但這需要重新聲明每個(gè)字段繼承的意義就不大了。所以在請(qǐng)求體設(shè)計(jì)上Base Create Update 三件套只適合Create和Update非常對(duì)稱的場(chǎng)景否則干脆分開寫。5.2 前后端命名不一致alias與alias_generator一個(gè)老生常談的問題前端習(xí)慣camelCase后端Python習(xí)慣snake_case。最笨的辦法是后端全部定義成camelCase字段但這樣Python代碼就很丑。更好的辦法是用Pydantic的alias或alias_generator。from pydantic import BaseModel, ConfigDict, AliasGenerator class UserBody(BaseModel): model_config ConfigDict( alias_generatorAliasGenerator( validation_aliaslambda s: .join(...), # snake轉(zhuǎn)camel ), populate_by_nameTrue, ) user_name: str user_age: int直接手寫轉(zhuǎn)換邏輯容易出錯(cuò)更推薦使用Pydantic的alias_generator配合to_camel工具函數(shù)。但這里有三個(gè)坑需要提醒一是populate_by_nameTrue必須加。如果不加前端用user_name這個(gè)name來傳值會(huì)被拒絕因?yàn)镻ydantic默認(rèn)只接受alias名。加上后兩種命名都能通過。二是alias只影響序列化和解析不影響Python代碼內(nèi)部變量名。你在接口里訪問body.user_name而不是body.userName所以后端代碼風(fēng)格不會(huì)亂。三是如果用了model_dump(by_aliasTrue)返回給前端的字段名才是camelCase默認(rèn)還是Python內(nèi)部的snake_case。這個(gè)細(xì)節(jié)決定了響應(yīng)體和請(qǐng)求體是否保持一致建議全項(xiàng)目統(tǒng)一。5.3 封裝外部模型調(diào)用時(shí)的請(qǐng)求體設(shè)計(jì)以O(shè)llama為例現(xiàn)在不少項(xiàng)目用FastAPI做統(tǒng)一后端再封裝Ollama、OpenAI之類的模型接口。這時(shí)候請(qǐng)求體設(shè)計(jì)有個(gè)常見誤區(qū)把所有模型參數(shù)都平鋪在一個(gè)Pydantic模型里后期加一個(gè)參數(shù)就要改接口。更好的做法是讓請(qǐng)求體結(jié)構(gòu)更貼近業(yè)務(wù)語義同時(shí)把模型相關(guān)參數(shù)放到一個(gè)嵌套字段里class ChatMessage(BaseModel): role: str Field(..., pattern^(system|user|assistant)$) content: str class OllamaChatRequest(BaseModel): model: str Field(qwen2.5, description模型名稱) messages: list[ChatMessage] stream: bool False temperature: float | None Field(None, ge0, le2)然后在接口里把它轉(zhuǎn)換成Ollama實(shí)際需要的payloadapp.post(/chat/) async def chat(req: OllamaChatRequest): payload { model: req.model, messages: [m.model_dump() for m in req.messages], stream: req.stream, } if req.temperature is not None: payload[temperature] req.temperature # 調(diào)用ollama這樣設(shè)計(jì)的好處是兩個(gè)層面對(duì)外前端不用關(guān)心ollama的參數(shù)細(xì)節(jié)只按業(yè)務(wù)需求傳對(duì)內(nèi)Pydantic保證role的合法性、messages的結(jié)構(gòu)正確臟數(shù)據(jù)進(jìn)不到外部調(diào)用層。如果你在做基于FastAPI LangChain或LangGraph的AI Agent項(xiàng)目同樣的思路也適用——用戶輸入的HTTP請(qǐng)求體先做第一層校驗(yàn)再交給Agent工作流去做更復(fù)雜的內(nèi)部處理。5.4 動(dòng)態(tài)Key的請(qǐng)求體用額外字段兜底有一種場(chǎng)景是前端傳的JSON里有一組數(shù)量不定、key為ID的字段。比如投票接口{ item_001: {score: 5}, item_002: {score: 3} }這種結(jié)構(gòu)沒法在Pydantic模型里窮舉字段名但可以用__pydantic_extra__來捕獲額外字段from pydantic import BaseModel, ConfigDict class VoteItem(BaseModel): score: int Field(..., ge1, le5) class VoteRequest(BaseModel): model_config ConfigDict(extraallow) __pydantic_extra__: dict[str, VoteItem]Pydantic v2中定義__pydantic_extra__為dict[str, VoteItem]后所有額外字段都會(huì)被驗(yàn)證為VoteItem類型。這樣既保持了靈活性又沒放棄類型安全。我更推薦的做法是讓前端把動(dòng)態(tài)key包在一個(gè)顯式字段下比如{votes: {item_001: {score: 5}}}然后用dict[str, VoteItem]來聲明這樣結(jié)構(gòu)更清晰。但有些第三方系統(tǒng)你控制不了它發(fā)什么格式extra兜底方案就能派上用場(chǎng)。6. 該用請(qǐng)求體還是不該用文件上傳、流式數(shù)據(jù)與大載荷邊界6.1 文件上傳別往JSON里塞剛開始接觸FastAPI時(shí)我見過有人嘗試把文件轉(zhuǎn)成base64字符串塞進(jìn)JSON請(qǐng)求體然后放進(jìn)Pydantic模型里。這種做法在小文件上能跑通但問題很多base64膨脹三分之一體積、JSON解析大字符串占用內(nèi)存、無法顯示上傳進(jìn)度、出錯(cuò)排查困難。FastAPI的正確姿勢(shì)是用UploadFileFile它在底層走的是multipart/form-data不是JSON請(qǐng)求體。這里想提醒的是不要因?yàn)檎?qǐng)求體聽起來什么都能裝就把文件也裝進(jìn)去。區(qū)分兩者很簡(jiǎn)單JSON請(qǐng)求體適合結(jié)構(gòu)化數(shù)據(jù)嵌套對(duì)象、數(shù)組、數(shù)值校驗(yàn)都很方便文件上傳走UploadFile支持流式讀取不需要把整個(gè)文件加載進(jìn)內(nèi)存。6.2 大JSON請(qǐng)求體的性能賬要怎么算FastAPI的Pydantic驗(yàn)證是CPU密集操作。如果前端一次性傳一個(gè)幾百KB的JSON并且嵌套特別深驗(yàn)證耗時(shí)可能達(dá)到幾十毫秒甚至更久。對(duì)高并發(fā)接口來說這個(gè)開銷不可忽視。經(jīng)驗(yàn)數(shù)值供參考一個(gè)幾百層嵌套的大對(duì)象Pydantic驗(yàn)證耗時(shí)隨字段數(shù)線性增長(zhǎng)但嵌套深度和循環(huán)引用會(huì)讓內(nèi)存分配暴增。我在壓測(cè)中遇到過的極端情況是一個(gè)約2MB的JSON請(qǐng)求體驗(yàn)證加解析耗了接近200ms而同一個(gè)數(shù)據(jù)如果預(yù)先簡(jiǎn)化結(jié)構(gòu)能降到20ms以內(nèi)。處理建議接口層對(duì)請(qǐng)求體大小設(shè)上限比如Nginx或網(wǎng)關(guān)限制10MB這不是歧視是為了保護(hù)后端如果請(qǐng)求體確實(shí)很大優(yōu)先考慮簡(jiǎn)化結(jié)構(gòu)減少嵌套層級(jí)對(duì)于超大載荷用流式讀取Request.stream()自己處理不走Pydantic自動(dòng)驗(yàn)證這是少數(shù)需要放棄請(qǐng)求體模型便捷性的場(chǎng)景。6.3 需要原始JSON時(shí)直接拿Request.body有些場(chǎng)景你要的不是驗(yàn)證后的模型而是原封不動(dòng)的原始JSON。典型場(chǎng)景包括轉(zhuǎn)發(fā)給下游服務(wù)、做簽名校驗(yàn)、做審計(jì)日志。這時(shí)用請(qǐng)求體模型反而礙事——一旦Pydantic轉(zhuǎn)換過原始字符串就沒了。FastAPI的解決方式是不聲明模型參數(shù)改用request對(duì)象from fastapi import Request import json app.post(/webhook/) async def webhook(request: Request): raw await request.body() data json.loads(raw) # 做你自己的驗(yàn)證或轉(zhuǎn)發(fā)這種方式繞過了Pydantic驗(yàn)證數(shù)據(jù)安全性就要自己兜底。我的原則是內(nèi)部接口用請(qǐng)求體模型做完整驗(yàn)證外部平臺(tái)回調(diào)這類不可控來源優(yōu)先保留原始數(shù)據(jù)解析后做最小化必要校驗(yàn)然后立刻落庫(kù)或轉(zhuǎn)發(fā)。6.4 小結(jié)請(qǐng)求體的邊界感請(qǐng)求體是FastAPI中最常用的數(shù)據(jù)入口但所有數(shù)據(jù)都從請(qǐng)求體走并不是好設(shè)計(jì)。路徑參數(shù)適合標(biāo)識(shí)資源、查詢參數(shù)適合過濾排序、請(qǐng)求體適合復(fù)雜的結(jié)構(gòu)化數(shù)據(jù)、文件參數(shù)適合文件傳輸。每種入口都有它的最佳場(chǎng)景理解邊界比掌握更多高級(jí)寫法更重要。我自己在項(xiàng)目里經(jīng)常用的判斷標(biāo)準(zhǔn)是如果這個(gè)接口的參數(shù)少于3個(gè)且都能用查詢參數(shù)表達(dá)就不需要用請(qǐng)求體一旦參數(shù)夾帶著對(duì)象嵌套或數(shù)組結(jié)構(gòu)請(qǐng)求體就是唯一合理的選擇。這樣接口更簡(jiǎn)潔前端也更直觀。7. 最后分享兩個(gè)請(qǐng)求體調(diào)試的小習(xí)慣第一個(gè)習(xí)慣永遠(yuǎn)用curl或httpie先把接口調(diào)通再交給前端。很多人一上來就打開Swagger UI點(diǎn)一下Try it out就把請(qǐng)求發(fā)出去了。其實(shí)我更推薦先寫一個(gè)最小的本地腳本import httpx resp httpx.post(http://127.0.0.1:8000/items/, json{ name: keyboard, price: 299, tags: [new], }) print(resp.status_code) print(resp.json())這樣能跳過瀏覽器和Swagger的各種中間層直接看到你聲明的請(qǐng)求體模型在真實(shí)HTTP請(qǐng)求下的表現(xiàn)。如果返回422就把錯(cuò)誤里的loc對(duì)著你的模型看基本一眼就能定位是字段名拼錯(cuò)還是嵌套層級(jí)不對(duì)。第二個(gè)習(xí)慣接口開發(fā)完成之前先寫一份接口的最小請(qǐng)求體示例放在項(xiàng)目文檔里。不是OpenAPI自動(dòng)生成的那種而是針對(duì)業(yè)務(wù)語義的示例。比如創(chuàng)建訂單至少需要哪些字段哪些字段可以晚點(diǎn)補(bǔ)。很多422問題本質(zhì)上就是前后端對(duì)請(qǐng)求體的理解不一致一份人話示例能減少大量往返扯皮。FastAPI把請(qǐng)求體這個(gè)概念做得足夠深值得花時(shí)間系統(tǒng)掌握。等你在真實(shí)項(xiàng)目里用過一遍嵌套模型、字段約束、錯(cuò)誤處理這些能力之后再回頭看Flask時(shí)代的手寫校驗(yàn)?zāi)銜?huì)明白聲明式這件事帶來的效率提升是實(shí)打?qū)嵉摹?
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产1769在线| 夜夜爽夜夜| 日韩欧美女求操每天更新| 久久9精品| 亚洲一区二区三区在线激情| 嗯啊抽插大香蕉网页| 99热亚洲| 精品久操| 久久精品一区二区三区蜜桃臀| 日韩BBN| BBBBB97COM| 人妻另类 专区 欧美 制服| 人妻81p| 久久人人看| 国产精品熟女AV中文字幕在线播放| 欧美色图片91| 蜜汁欧美| 国产第12页| 婷婷AV一区二区三区| 色蜜AV| 色在线69堂| 在线视频资源| 一区二区三区视频国产免费| 日本三级大片| 亚州精品人妻一二三区| 成人五级久久| 日韩精品熟妇| 啊啊啊啊好疼| 2019天天干天天操| 超碰97资源大奶| 33044男人的天堂深夜备| 女人久久久| 亚洲日韩美女中文字幕乱| 日日狠狠久久偷偷色综合免费| 欧美日韩人人早| 草草草视频在线免费看| 9久精品| 一起草欧美| 91操操| 啊啊啊啊啊好大好舒服想要| 无套后入双马尾| 高清无码一区二区三区| 99国产在线绯色一区| 亚洲图片欧美另类综合免费视频大大香| 丰满人妻-区二区三区免费看| 中日韩一区二区三区欧美| 欧美一级A片在线看视频性色| 久久av网| 一级片视频啪啪| 亚洲经典啪啪| 好色美女九七第一页| 福利视频香蕉免费一区二区在线| h在线看免费版在线看| 操我啊啊啊啊啊| 精品999一区二区| 亚洲天堂7777| 91/欧美| 91老熟女| 日本久操视频| 久久免费9| 欧美精品999| 欧美淫乱视频| 国产大学生高潮在线播放| 后入式在线免费观看60秒| 亚洲精品乱码久久久久久蜜桃麻豆| 国产又爽又黄| 色网亚洲人| 又大又长又粗又爽又黄| 国产超碰在线一区| 91久久| 花野真衣| 日本操逼视频在线| 诱惑人妻欧美一区在线播放| 国模无码人体一区二区三| 影音综合网| 亚洲中文字幕在现观看| 超碰亚洲欧美日韩无| 男女啊啊啊啊啊| 色色无码| 久久啊啊啊| 色999亚洲人成色| 亚洲欧美97√| 一区,二区,三区网站| 天天干18禁| 狠狠干综合| 香蕉视频精品亚洲一区二区三区在线播| 五月天婷婷小说| 一级免费精品| 色蜜AV| 久久啊啊| 欧美黄色图片| 午夜亚洲国产理论秋霞| 欧美色自拍| 欧美人妻久久精品二区三区 | 91在线限制级| 亚洲一区二区久久久久| 17c嫩草51久久91嫩草| 日韩乱伦影音先锋| 99少妇内射| 五月综合色| 国产精品操| 日本女厕偷拍| 亚洲黄色a级片| 97国产精选| 丁香成人五月天| 精品传媒在线一区| 歐美一級亂黃99在綫精品| 欧美黄色大片在线观看 | 99无码视频| 亚洲小说视频| 操人妻丝袜高跟| 国产一区二区三区高清视频| 日欧毛片久久| 亚洲宅男天堂| 天天看天天干| 国产精品久久久久9999小说| 这里是精品| 中文操逼字幕| 涩亚洲欧洲| 99综合网| 乱抡国产91| 老色鬼成人精品视频下载大在线观看| 120分钟婬片免费看| 热热色中文无码| 风月影院男女十八禁| 国产9区| 中文字幕文字幕无码一区二区三区电影99| 五月天激情小说| 欧美乱伦专区| 久久久久无码| 911粉嫩人妻| 久久久中文| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 婷婷五月天成人| 亚洲成人贴图| 国产欧洲精品亚洲午夜拍精品| 极品色www影院| 国产精品久久久啊| 亚洲 综合 第一页| 吻戏激情性巴克| 欧美一区二区三区四区综合| 97碰碰色| 麻豆人妻偷人精品无码视频| 欧美1727免费观看视频| 又粗又长又爽在线观看| 日本视频在线中文字幕| 91亚洲狠狠色| 男人天堂久久日韩| 久久成人午夜狠狠| 久久乐| 欧美精品一区二区少妇免费A片| 亚洲午夜蜜臀| 国产精品suv一区| 9久热| 黄色操人| 97精品视频| 秋霞鲁丝午夜无码一区二区三| 婷婷精品| 欧美成人性爱视频大全| 艹精品| 久久一区二区三区四区五区| 亚洲极品| 大香蕉琪琪日本女优不卡| 大香樵伊人网| 天天流夜夜操| 超碰在线观看av不卡| 色婷婷国产精品一区在线观看| 午夜精品久久999热蜜桃介男人用| 国产超碰在线| 激情接吻视频久久久久久| 丁香色狠狠色综合久久小说| 99999亚洲| 久草精品一区 | 精品人妻一区二区三区-国产| 人妻一区视频| 人人操人人插人人摸人人干| 亚洲影院无码在线| 黄污污污污| 自拍内地三级在线观看| 91亚洲欧美激情| 久久久内射良家| 久久99精品九九久久久婷婷| 中文一区二区婷婷视频| 九九热精品在线| 成人美女av| 高潮毛片无遮挡高清免费| 精品久久久久久久| 国产精品播放| 一本色道熟妇| 国产精品农村妇女| 欧美激情 亚洲色图| 91少妇香蕉久久精品| 国产精品久久发布| 亚洲 欧美 另类 日韩 人妻一区 | 青娱乐手机日韩在线视频| 中文字幕视频2区| 98色网| 日日夜夜干| 国产精品久久久久综合| 亚洲AV永久无码一区仙野| 久久久久久亚洲中文| 无码人妻精品一区二区三区99不卡| 清纯唯美亚洲综合| 天天澡天天狠天天天做| 蜜臀久久99精品久久久久| 日韩综合97p| 欧美偷拍| 久久成年片色大黄全免费网站| 五十路熟女人妻一区二区三区四区五| 欧美 亚洲 在线| 亚洲欧美综合| 精品国产Av无码久久久亚洲| 桃花色综合影院| 最新国内自拍av免费| 尹人免费观看视频在线| 国产人妖视频一区在线观看| 口爆吞精在线观看| 操操逼操操逼操操逼逼| 巨爆乳肉感一区二区三区竹菊影视| 日本五十路熟女一区二区| 强奸乱伦资源| 精品亚洲国产成人AV制服丝袜| 日韩另类| 嗯嗯嗯不要不要免费视频| 九九成人| 99久久com免费视频′| 亚洲AV资源| 超碰精品| 欧洲亚洲综合| 久久东京热久久| 绯色一区二区三区不卡少妇 | 白 大 人妻 区 在线| 日日骚精品视频| 久久9精品网站| 亚洲黄色电影| 国产精品白丝在线播放| 国产一区二区精品久久99| 亚洲天堂人妻熟妇视频| 丁香啪啪| 亚洲熟妇丝袜在线观看| 天天影视射综合网| 免费男人的天堂| 久久精品国产免费观看99| 中文字幕一二区二三区人妻专区| 97人人模人人爽人人| 狠狠干综合| 超碰97资源中文字幕| 99热导航| 999久久久久久久久| 夜夜嗨视频| 亚洲自拍天堂| 黄色污污污污污污网站| 美腿丝袜高跟网免费视频免费视频| 久久有码| 日韩欧美日韩| 秋霞曰韩R级| 无码9区| 91日产欧美| 欲香欲色综合天天伊人| 琪琪精品免费一区二区三区| 超碰在线国产| 中文字幕97色| 殴美性天天| 伊人久久综合影院精品久久久| 国产精品婬乱一级毛片彝族| 爱爱60秒免费视频| 91黑丝操| 人人么人人操| 激情五月天婷婷| av东京热男人的天堂| 丰满人妻-区二区三区免费看| 久久精品人妻一区| av在线一区二区三区| 日韩在线76| 亚洲图片 激情小说| 性色A∨91| 久久草在线综合视频| 精品网站9999| 欧美色图另类图片| 天天看天天在线精品| 国产按摩一区二区三区| 人妻天天爽| 欧美性天天| 天天天天天天天天天天干美女| 久视频在线观看| 嗯嗯嗯啊啊在线观看| 久久欲| 激情六月婷婷| 久久精品超碰| 国产男女无套视频免费观看| 97中文字幕色| 亚洲精品自拍| 天天添天天干电影| 精品国产乱码久久久久久久久久毛片 | 91老熟女逼| 91少妇通奸网站| 91精品无码久久久久久久| 欧美一级黄片免费播放| 色香伊人| 欧美一级A片不卡视频。| 午夜天天碰综合视频| 精品丰满熟妇人妻一区| 夜夜影视四色| 97视频在线视频| 99婷婷一区二区| 久久99网站| 欧美国产操逼| 少妇无码av专区线| 久久超碰亚洲人| 精品久久久久久久| 污啪啪啪视频| 国产路线专区| 九九色逼| 人妻熟女一区二区| 久久6热视频免费观看| 亚洲AV无码久久精品蜜桃小说| 网友自拍第一页| 九九AV| 日本二区不卡| 99热这里只有精品地址| 东北女人高潮视频| 91操人视频| 中文字幕一二三av| 欧美婷婷五月天| 哑洲在线| 亚洲色综合| 舔人妻中文免费视频| 亚欧性爱ab| 伦理日韩国产久久| 四色永久成人网站| 国产97av| 五月天激情视频| 国语精品av| 色五月婷婷在线| 欧美激情专区| 在现视频女上位好爽| 九九九九久久久久| 国产又爽又黄| 日韩久草| 97大色网| 亚洲色图超碰在线| 人成午夜免费大片| 大香蕉乱伦视频网| 91狠狠综合久久久| 激情专区综合| 精品久久久亚洲AV成人网站| 在线欧美69V免费观看视频| 亚洲欧洲综合av在线| 伦激情人妻另类人妻| 日韩肏逼视频| 啊啊啊久久| 欧美日韩1234| 天天日天天操天天射河南省| 亚洲色图图片| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 国产熟女精品区| 欧美精品丝袜久久久中文字幕| 啊啊啊啊啊在线观看网址 | 看日韩操逼| 国产精品一级特黄aaa大片在线观看| 中文字幕久热视频在线| 亚洲精品人妻在线| 人妻日日干| 嫩草影院性色| 日韩中文欧美| 青青草日逼视频| 91美女丝袜诱惑视频| 99热成人| 欧美亚男人的天堂| 啊啊啊不要嗯嗯在线观看| 小骚逼被操的爽不爽| 久色99999| 91嫩草欧美| 综合网97| 超碰97伊人| 一区二区三| 中文字幕精品免费一区二区| 巨爆乳一区二区爆乳区| 熟妇操花| 欧美嗯啊……在线观看视频免费| 91五月天| 日韩99999| 日韩欧美性吧婷婷乱伦大香蕉| 九九九九久久久久| 亚洲精品乱码线路中文字幕| 性色av网站| 在线99热| 秋霞午夜视频一区二区| 欧美在线|亚洲| 91亚洲在线| 免费视频在线一区二区不卡| 久99| 躁躁日曰躁2020| 亚洲天天精品| 男人午夜天堂| 超碰成人最新最好看| 91啪啪| 亚洲AV高潮| 97久久综合网| 中文字幕人成乱码熟女香港| 小泽玛利亚一二三| 在线 亚洲 网爆 自拍| 国产丝袜高跟美女av免费观看| 中文字幕乱妇免费视频| 亚洲 欧美 偷拍 唯美| 欧美日韩91| 真实高潮91| 国产精品69久久久久孕妇欧美| 亚洲精品97久久| 中文字幕123| 高清不卡一二三区视频......| 97精品久久久久中文字幕| 在线播放中文字幕| 热久久国产| 超碰97起碰| 99re在线视频国产| 99视频这有这里有精品| 五月丁香在线| 在线色资源| 久久性爱视频免费看| 日本色婷婷| 都市激情人妻一区二区青青操视频| 综合亚州欧美| 26uuu偷拍亚洲欧洲综合| 国产伦精品一区二区三区视频女| 日本熟妇色熟妇在线视频播放| 久久超碰97| 五月激情视频| 在线五区| 亚洲AV秘无码一区..| 婷婷五月影院| 欧美97av| 国产三区免费在线观看| 激情终合网| 91白虎| 在线观看综合精品亚洲| 91AV天堂| 亚洲精品国产熟女| 草久久久| 亚洲av无码国产精品字幕| 亚洲无码色| av日韩中文字幕| 18禁的网站在线| 中文字幕97色| 秋霞免费无码视频日韩A片| 欧美在线官网| 春色综合网| www.色操逼| 色天天野狼综合社区| 人人操人人干网页| 国产AV人人 夜夜人人澡| 久久亚洲日韩熟女精品| 99ri精品| 久久久久成人网| 操比国产| 日天天九九天堂666| 免费一级毛片在线视频观看| 亚洲男人天堂视频 | 国产精品亚洲色婷婷久久久| 丰满人妻一区二区三区在线| 97色碰| 精品少妇一区二区三区免费观看| 久久精品国产亚洲av水密被窝| 丁香五月婷婷基地| 2020中文字幕在线观看| 天天插天天插| 国产精品96| 日本午夜福利视频| 精品国产乱码| 久草在| 国产18精品亚洲精品| 国产91丝袜在线播放蜜月| 5278欧美一区二区三区| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 91天天c| 又粗又长又爽在线观看| 精人妻无码一区二区三区伊人直播| 国产精品自拍xxxx| 亚洲欧美综合网| 一区二区激情国产熟女 | 中文字幕成人| 亚洲电影中字一区二区| 啊啊啊啊操死我了| 欧美性爱在线无码| 中国熟女老妇仑乱一区二区三区| 亚洲免费97免费| 黄片无码在线制服| 久久精品久久久久久久| 99热免费精品| 亚洲无码久久久久久久| 久久岛国| 美女丝袜激情小说| 天天综合网~69| 日韩欧美操逼xxx| 亚欧美色图| 欧美亚涩| 欧美亚洲| 五十路三区在线| 亚洲情色在线| 国产免费一区在线观看| 91女色| 人人污日韩一区二区| 日韩无码黄色片| 国产精品伦理| 国产性感在线观看| 亚欧无码在线| 亚洲91在线| 日夜干射色啊| 国产乱码久久| 中日韩久久久| 久久区| 一级黄碟在线看| 色婷婷电影| 99re免费视频精品全部| 欧美高清91| 宗合情欲网| 欧美日韩国产色图在线| 国产黄色剧情影片麻豆免费播放| 啊啊啊啊啊啊啊网址在线观看| 久久精品色欧美aⅴ一区二区| 熟妇乱伦一区二区| 欧美日韩系列| 97日本超碰综合| 欧美日韩 强奸乱伦| 欧美日韩中文视频播放| 久久是精品| 熟女天天干| 99综合免费视频| 岛国色情视频在线观看| 老司机香蕉| 97这里只精品| 无码一区二区三区四区五区六区七区八区九区十区视频 | 婷婷深爱五月| 亚洲第2页| 国产精品成久久久久午夜午夜| 久久久久96| 日韩天天本| 亚洲中文人妻色| 99热超碰在线| 国产精品久久久久综合| 99在线免费公开视频| 人妻丝袜日本| 91青青| 中文字幕诱惑制服人妻丝袜美丝袜美 | 日本免费一区二| www.婷婷| 黄色片大香蕉| 97人人操人人摸人人爱| www.久久制服糖| 男人的天堂2019| 色亚洲欧美| 日韩淫色网| 欧美大香蕉97| 九久9热| 天天流夜夜操| 日本天天色| 五月色网| 97最新在线播放视频| 99久久婷婷丁香| 色伊人91| 综合欧美激情网| 日韩中文字幕国产| 欧 美 自 拍 偷 拍| 一级性爱视频免费观看| 最新国产精品| 国产色产精品在线观看| 欧美成人一级麻豆| 国产视频第二页| 伊人宅男大香蕉| 蜜桃臀一区二区三区久久| 老鸭窝日丰县女人| 日韩欧美蜜桃精品久久中文字幕久久 | 精品中文字幕一区二区| av最新免费中文字幕| 吖在线不卡一区二区国产剧情| 一中国女人毛片水真多| 日韩性爱小视频| 欧美极品美女aaaaaa级黄片| heyZO天然素人无码AⅤ专区| 在线视频亚洲无码| 91人人| 婷婷丁香人妻 | 走光一区92下载| 综合久欧洲| 熟妇视频一区二区三区在线观看| 亚洲av在线免费观看| 久久婷综合| 国产AV高清AV无码| 岛国黄色大片网站| 九九综合久久| 盗摄女人妻在线| 自拍偷拍2025在线观看| 激情干在线| 骚逼高潮久久精品| 日日日啊啊啊| 熟妇国产免费一区| 超碰79人人乐| 综合日韩激情另类图片| 亚洲欧洲第二视频在线观看色图| 啊啊啊在线看| 精品无吗m| 亚洲乱码精品一区二区| 欧美色www亚洲国产阿娇要播| 99视频这有这里有精品| 久久首页| 六月丁香啪啪| 天天爽夜夜欢视| 热的中文 热的有码 热的国产| 大色网久久| 神马九九| 强奸乱伦AV网站| 影音先锋每日最新资源在线观看 | 亚洲国产丝袜熟女av| 国产精品盗摄 偷窥盗摄| 强奸乱伦中文字幕AV| 丁香五月色情| 久久精品天美| 亚洲精品97p| 无码九九| 国产精品操| 91在线超高颜值国产| blacked精品一区国产| 99视频自拍| 国产污视频麻豆传媒一区二区| 无码人妻丰满熟妇奶水区毛片| 伦理日韩国产久久| 日韩无码极品| 91久久婷婷| 天天影视射综合网| 国产精品久久久午夜夜伦鲁鲁| 色与欲影视| 国产操伦| 黄色污污污污污污网站| 亚洲精品 超碰| 锕锕好爽 死我在线观看| 国产精品96| 亚洲国产高清福利视频| 精品无码一二三四区| 男人天堂2019| 盗摄女人妻在线| 亚洲欧洲视频小说在线观看| 久久久天美| 国产亚洲精品A在线观看下载| 人妻熟女av国产网站| 精品大久久| 精品少妇一区二区| 日韩精品一区二区日韩| 亚洲美乱| 超碰导航97| 中文字幕精品日韩中文字幕| 国产精品91一样| 天天影视综合色| 日本免费人成视频播放120秒| 黄色AV影视| 日韩电影免费网站麻豆视频| 91精品微拍福利| 国产97色在线| 国产欧洲精品亚洲午夜拍精品| 97伊人超碰| 成人三一级一片aaa| 日韩传媒在线| 91 欧美| www.丁香五月| 国产又长又大又粗的视频| 人人贴人人摸| 欧美午夜色妇色鬼| 亚洲成a人v欧美综合天堂下载| www.色操逼| 久插综合| 亚洲精品三区在线观看| 亚洲美欧999| 欲香欲色| 婷婷亚洲中文字幕在线| 中文字幕黄色一起草| 五月天黄色激情视频| 色情亚洲日本成人| 人妻偷拍一区二区三区| 91n美女视频| 亚洲 欧美综合| 99综合视频一体| 人妻夜爽夜夜爽| 亚洲欧美日韩夜夜| 偷拍欧美亚洲| 国产欧美一区激情交| 亚洲伊人久久精品影院| 手机在线视频国内精品| 日韩精品三级片长长久久| 超碰综合97在线| 成人三级片无码| 97在线欧| 91狠狠综合久久| 日韩99999| 青青操青娱乐| 极品销魂美女一区二区| 超碰久久性爱| 国产精品成久久久久午夜午夜| 91 国产丝袜在线放观看| 唯美清纯 妖精视频| 91熟女熟妇视频网站| 国产精品在线免费| 中文字幕二区日韩天堂| 青青青国产| 日韩字幕一区| 亚洲素人网| 伊人女女资源在线观看| julia国产在线 | 亚洲精品天天影视综合网 | 久久久久久亚洲中文| 欧美影音在线| 日韩成人精品中文字幕| 国产精品香蕉| 在线97在线| 日韩精品中文字幕一| 色偷偷2020免费视频播放| 91久久久久久| 国产在线综合福利网站| 歐美一級亂黃99在綫精品| 亚洲精品国产无码高清| 欧亚成人在线视频| 九九无码视频| 亚洲97综| 天堂射| 狠狠色色| 国产高清视频无码在线| 中文欧丝袜诱惑| 亚洲va综合va国产va中文| 啊啊啊好多水| 热热热热日日漂亮永久永久国产日| 国产乱码精品一区二区三区四川| 啊啊啊啊免费视频| 2019AV天堂| 欧美一级久久久丰满| 欧美性第1页| 嗯阿好爽好紧| 天天看天天在线精品| 91热热色| 青青11操操操操操操操操| 91AV入口| 人妖欧美一区二区| 色91综合网| 亚洲色欲天天人妻无码系列专区| 久久精品国产精品一区| 亚洲日韩资源| 91精品电影18| 日本日皮视频逼| 羞涩视频| 中文字幕精品三级久久久| 久久久久久久久久久久久久久性生活视频| 亚洲无码国产精品久久| 伊人九九| 人妻丝袜肏逼| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 91九色丨国产丨爆乳| 无码精品一区二区三区潘金莲| 亚洲一区二区三区婷婷| 欧美韩日精品资源| 116美女午夜| 无遮挡h肉动漫在线观看| 亚洲AV麻豆Aⅴ无码电影一| 久久久九九九九| 欧美第一页性| www.色操逼| 国产欧美在线观看免费观看| chaopen97久久| 日韩午夜国产| 久久久啊啊| 超碰AV在线| 成人午夜小视频手机在线看| 亚洲无码偷拍| 麻豆91熟妇人妻中文字幕茄子| 色妇91| 亚洲AV高潮| 殴美,日韩国产伦精品| 国产精品毛片?v一区二区三区| 99中文字幕| 偷拍99| 久久97超碰香蕉| 神马久久久久久久久久久久| 欧美九九爱| 人人摸人人干| 91热爆在线| 天堂中文资源在线bt| 超碰国产精品无码| 蜜臀无码视频在线观看| 亚洲色电影在线| 国产精品白丝AV| 老司机午夜精品福利视频一区二区| 91男女啊啊啊| 狠狠色综合网| 婷婷丁香五月激情啪啪| 91人人臊| 日韩乱插| 岛国激情视频在线观看| 欧美在线永久天堂| 小说区 图片区色 综合区| 国产综合久久久麻桃个| 干B| 使劲用力艹少妇视频一区二区| 欧美97在线观看| 大香蕉天天看妹子| 中文字幕乱码人妻一区二区三区,99精品| 性爱视频无打码在线观看| 日本孕妇一区二区视频操逼免费看 | 国产一区二区三区免费视频在性观看| 91精品国产91久久青草| 激情小说在线视频| 老熟女阿 国产91| AV色五月天| 国产精品色| 青久久| 久9久9久9久9久9久9| 我想要啊 啊 啊| 免费男人的天堂| 偷拍2020| 无码九九| 欧美丝袜91| 啊啊啊啊好多水| 97超碰人妻| 操屄日韩| 日韩欧美成人综合在线| 中文字幕精品一区二区精| 久久毛卡| 人人操人人插人人摸人人干| 中文字幕交换人妻| 欧美日韩操逼嗦吊| 日本欧美成人片AAAA| 丁香五月婷婷基地| 蜜臀少妇一区二区| 日本免费不卡二区| 日韩不卡码| 日韩二区三四区五区六区在线看| 国产少妇内射| 日韩大香蕉AV影片| 深夜福利黄片| 少妇人妻好深太紧了vr91| 日本视频在线观看污污污| 综合久久中文字幕综合日韩精品| 熟女精品一区二区三区| 国产久久久9999| 使劲用力艹少妇视频一区二区 | 九热大香蕉| 国产情色第一第二页在线观看| 日本高清视频在线观看黄已三辽| 九九这里只有精品| 狠狠操狠狠操操| 97在线精品观看视频| 99久久久无码国产精品性男| ?亚洲伊人伊成久久人综合网| www.夜夜操| 超碰97玖玖爱| 久久精品六区| 极品销魂美女一区二区| AV网站高清无码在线观看| 伊人久久婷婷| 91电影色诱| 大香蕉92| 精品夜夜澡人妻无码AV| yaouchengrenav| 强奸乱伦资源| 熟妇在线视频一区二区| 久久久久久久久久黄色网| 激情婷婷黑人91| 亚洲欧洲自拍图片专区满春格| 日韩欧美字幕亚洲一区二区 | 久久精品人体AV| 欧美青青视频| 日韩精品午夜操呦呦不卡影院| 国产精品福利资源在线尤物| 国产av美女被艹的乱叫| 亚洲国产精品久久久久婷婷青年| 97超碰超欧美。| 999国产精品999久久久久久| 欧美人人操人人插| 日韩人妻一区二区精品| 4141514逼喷水三级片| 桃色人妻在线视频| 91无遮挡| 国产精品视频精品一二| 99九九久久| 亚洲 中文 欧美 日韩 在线| 91福利网在线观看| www.色99| 小骚逼被操的爽不爽| 国内外内射高清视频| 操逼操网| 欧亚第一综合网| 四虎免费在线播放| 一级做a爰片久久毛片图片| 婷婷久久综合| 精品视频久久区| 99久久久久久亚洲精品不卡| 二色av| 亚洲天堂日本| www.亚洲成人一区| 夜夜爽爽爽| 日本一卡二区在线| 久久中出| 狠狠穞A片一區二區三區| 男人天堂 天天射| 69av一区二区三区| 性色一线| 青青在线视频免费| 欧美性爱十八禁| 大肉棒导航| CCYY草草影院地址入口| 91老司机在线视频免费观看 | 欧美日韩大陆黑人少妇99| 青青草毛片| 国产 v乱码一区二| 九一综合网| 一级二级三级黑人无码| 日本不卡高清免v欧美日韩在线观看| 少妇贴图| 99超级碰免费视频| 激情文学小说一区二区| 国产精品嫩草影院免费| 久久久婷| 国产无码高清操逼视频| 强上我不卡卡| 2024黄色视频| 国产天天骚| 性色高清..……| 亚洲中文字母在线播放| 屁股久久久久久久久| 欧美另类综合久久| 1024午夜激情男人的天堂| 日韩av不卡在线看| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 97亚洲性爱| 啊啊啊好想要| 77777亚洲蜜臀精品久久综合蜜臀| 国产传媒一区二区三区| 国产精品国产拍高清AV| 97精品一区二区视频在线观看| 亚洲各类熟们中文字幕| 综合熟妇一区二区三区| 超碰人妻在线| 日韩有码中文字幕女同性恋| 无码聚合| 97免费视频在线观看视频| 熟妇的味道HD中文字幕| 超碰在线97国产| 青青久久手机线视频| 嗯嗯啊啊日韩精品| 久久久久久久伊人精品| 91久久堂| 黄色一区二区秘书性感| av草草在线电影| 日韩中文字幕视频在线观看| 99re这里只有精品2| 高凊专区人人操| www.亚洲黄色| 亚洲欧美91√| 亚洲五月婷| 欧美色www亚洲国产阿娇要播| 天天天肏屄欧美| 性影在线视频| 九九热re99re6在线精品| 99这里有精品| 国产精品一区二区亚洲人成毛片| 天堂射| 欧美性爱另类综合| 亚欧操逼片在线观看 | 日产123区精品免费观看| 男人的天堂一区三区| 欧色网址| 亚洲精品天天影视综合网 | 精品欧美日韩在线观看| 人人透人人操| 久久久久久久久999| 亚州精品丝袜-不卡成人免费| 最好看的中文字幕在线2018| 日韩无码AB| 成人综合久久精品色婷婷| 色九色久| 国产伦精品免编号公布| 日韩熟女乱伦中出| 久热精品在线| 日韩熟女精品无码专区一区二区 | 日韩性爱电影一区| 亚洲高清91| 欧美一区二区成人一卡| 国产成人久久久精品免费AV| 大香蕉乱级| 骚鸭AV| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 亚州综| 99九九久久| 婷婷色影院| 操逼大黄片| 天天综合色图| 一区二区三区在线日韩影院观看| 资源在线观一 二| 亚州AV无码国产精品| 欧美性爱18观看| 女人香蕉久久毛毛片精品| 蜜桃色院一区久久| 久久精品国产精品亚洲艾通辽熟妇| 日韩亚洲国产视频| 草草草草视频| 黄色一区三区| 91在线丝袜视频| 啊啊啊操一区| 三级三久久线久久99久目本WW| 91在线欧美| 蜜臀99久久国产| 亚洲se电影| 久久超碰免费的| 亚洲人人操| 亚洲福利中文字幕在线| 久久综合资源一区二区| 亚洲色婷婷久久久综合日本| 大香蕉一人| 二三四区精品| 美女主播色欲91抠b在线播放| 欧美亚洲激情小说| 五月丁香六月婷| 国产树林里野战在线看| 日韩av性爱在线播放| 97超碰人妻| 久久久久久久9| 亚洲影视高清第一页| 九九九九九九九九九九九九九九九女| 亚殴在线| 亚洲 欧美都市激情| 久久五月视频| 黄色大香焦1级‘′‘| 日韩在线一区高清在线| 另类图片综合| 久草午夜| 久久一区二区蜜桃| 久久久无码精品人妻二区| 91热色| 美女91av| 精品大全99999| 欧美日韩性爱无码| 99久久99九九99九九九| 男人的天堂2018东京热啪啪啪| 免费的很黄很污的全部视频| 国产无吗在线播放| 奸色色 男人天堂 天天射| 国产激情av女片自拍| 国产99久久99热这里只有精品15 | 色69大色97香蕉| 欧美在线|亚洲| 91精品国| 久久9免费视频| 骚鸭AV| 久久精品无码不卡| 久99在线免费观看视频| 91久久国产精品| 97在线视频观看免费| 国产又粗又长又大的视频| 欧美色图欧美| 欧美成人精品欧美一级乱黄一区二…| 久久久青青草| 自拍六区| 一二三区操逼国产91| 爱妃国产亚洲视频中文字幕| 超碰免费97| 自拍偷拍草一草| 乱伦av国产| aⅴ日韩成人电影av在线免费看av大全| 熟女突然公开看18禁影片| 欧美日韩国产色图在线| 激情久久av一区av二区av| 久久99亚洲精品久久99果| 精品一区二区成人| 久久久久成人亚洲国产| 久久久国产成人一区二区三区在线| 欧美性爱伊人| 国产浮力影院第1页| JIZZJIZZ国产精品喷水| 一块操欧美| 偷拍欧美激情| 九九九久久久久| 超碰午夜| 国产精品夜夜| 精品国产Av无码久久久伦古装| 亚洲一区在线观看欧洲 | 国产九九九九九九| 久久久一区二区三区麻豆| 欧美亚洲| 乱伦Av网| 亚洲五月婷| 国精品一区二区三| 欧美一品道| 十八禁黄色| 欧美呦呦性爱| 豆花视频操逼网址| 精品久久人妻成人网| 91天天日| 精品人妻一区二区三区夜夜| 欧美少妇高潮视频| 色视频蜜乳| 亚洲色图殴美色图激情乱伦| caorenqi shipin| 人妻在线大香蕉| 91男女| 日本国产亚洲一区在线观看| 性爱乱伦网址| 亚洲第一在线视频| 亚洲一区二区三区久久 亚洲一区二区| 67194无码不卡| 精品人妻一区二区三区蜜桃视频| 亚洲色图欧美色图另类图片| 一二三四视频中文字幕在线看| 这里都是精品在线观看| 男女91| 中文字幕av片| 99久久精品无码一区二区毛片免费 | 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 91色色综合| 91无遮挡| 404操逼福利视频| 尤物av网站| 亚州欧美在线| av黄图片在线观看| 少妇滛荡视频| 91天射| 人妻激情视频| 久久av一级av少妇av高潮| 奸色色 男人天堂 天天射| 色眯眯射| 日本506070| 99热18这里只有精品| 特级丰满少妇一级AAAA爱毛片| 日本狠狠干| 粉嫩小泬久久久一区二区| 中国91AV| 欧美aa一级片| 亚洲色图在线视频| 久久精品91| 一级人妻性爱视频| 国产精品色| 久久 久久国内精品亚洲| 九九九999久久久网站| 人人操人人插 - 百度 - 百度| 日韩乱中文| 欧美图片色综合| 国内一区二区免费| 天天爽人人综合免费7799| 日本黄色裸日本黄色裸体 | 成人精品视频一区二区| 欧美姓爱综合网| a v网站在线播放| 一牛一区二区三区久久| 在线免费观看高清无码视频| 国产精品国产拍高清AV| 日韩中文9| 久久久久久久亚洲Av无码| 久草色悠悠在线视频| 好吊色综合| 亚洲天堂,男人| 丰满人妻-区二区三区免费看| 亚洲av综合色区无码一| 天堂射| 91深夜夜| 欧美日本久久精品一区| 日韩精品在线视频,日韩精品……|