亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

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
返回資訊列表
欧美 亚洲 大香| 四虎国产精品永久地址入口| 少妇被c 黄 免费观看| 久操99| 亚洲图片婷婷五月天| 97操97干| 日韩成人小视频| 精品无码久久久| 999岛国大片| 人人操人人摸人人看人人插| 69一区二区三区 | 快点操死我| 91天堂色男人的天堂| 男女一进一出视频久久| 久久内射| 可乐操在线| 国产欧美后入| 97视频在线观看高清资源| 巨爆乳肉感一区二区三区竹菊影视| 久久国产在线一区二区| 天天综合-91入口| 久久久国产护士丝袜美腿一| 新视频sss国产| 97超碰巨乳| 蜜色网色哟哟| 偷拍超碰| 中国的操老妇女| 性生活无遮挡纯毛片在线看| 亚洲精品 欧美精品| 久日91在线| 欧美激情欧美精品| 999热日韩精品| 午夜AV污污污| 97人人色| 无码粉嫩白虎一线天b区| 欧美人妻熟女在线| 日韩无码服务区| 亚洲蜜臀精品视频久久| 久操免费观看| 中文操逼字幕| 亚洲黄片免费在线播放| 人人玩人人添人人澡免费| 日本影视久久免费| 国产精品人人爽人人做可爱福利| 免费作爱一级视频| 天天爽天天| 一区二区三区精品黑丝白丝酒店对鸡 | 飘花国产午夜精品不卡| 99在线无码精品秘 入口黑人| 爽极品影院| 久操网址| 97超碰国产亚洲精品资源| 欧美图片偷拍| 久久女同性恋一二区| 五月开心久久AV官网| 亚洲综合69| 久操影视| 亚洲se91| 免费看A片毛毛片在线播| 成视频在线观看免费看| 9999亚洲电影| 97视频在线播放| 国产成人99久久亚洲综合| 中文字幕乱码人妻二区三区| 天堂岛av| 在线视频 亚洲精品| 美女国产一区二区久久| 日韩少妇无码| 久久9久| 岛国毛片在线观看免费| 国产精品熟女丝袜一区二区| 亚洲综合97中文网| 熟女一区二区三区四区| 美女极品一区二区三区| 婷婷久久五月天| 97国伦国色| 一区二区三区色综合| 亚91网| 大香蕉视频一二三区| 亚洲精美粉嫩嫩泬在线观看| 97爱免费插| 一本久久精品中文字| 4tube欧美女厕所| 一本色道无码DVD中文字幕| 乱欲一区二区| 无卡一区=区| 国产最火爆久久国产网站网站| 久久婷婷色| 91美女色视频亚洲| 看免费的黄片| 日韩av女优在线免费一区| 日日黄色三级网站| 农村女一级毛卡片| 亚洲天堂男人在线| 日韩欧美麻豆| 免费作爱一级视频| 亚州中文字幕超碰97| 啊啊啊想要| 激情久久久| 欧美日韩精品国产91| 熟女熟妇一区二区三四区| 琪琪精品免费一区二区三区 | 亚洲熟妇自偷自拍另欧美| 曰韩香蕉97| 狠狠操使劲操| 在线黄页看毛片| 国产精品另类一区大香蕉| 国产在线激情视频| 日日干夜夜欢| 黄色区免费观看中文字幕| 99精品在线播放| 亚洲脚交| 婷色五月天| 208天天久久九九九| 免费操逼视频下载| 久久久久少妇| 天天日日日射| 18禁免费视频| 超碰一区二区| 人人爱操| 粉嫩av平台| 亚洲情色一区综合| 91精品久久久久五月天精品| 九九国产热| 无码人妻精品一区二区中文| 日本天天干天天搞一区| 天天色天天干天天射| 求求你操操我| 久久九九国产精品| 992视频一区| 精品国产嫩穴视频| 99re热有精品视频国产| 麻豆精品天美| 亚洲色图日韩精品| 亚洲,欧美,综合网| 欧日a| 97操在线| 久久九九99| 欧洲亚洲人妻无码高清久久三区四区| 精品一区二区三区18| 激情五月丁香五月| 亚洲色欧美| 亚洲最大的黄色电影网站。| 久操网视频| 欧美一二级| av九九| 久久久久亚洲熟妇熟女| 亚洲在钱| 97干色天堂| 深夜国产一区二区三区在线看| 亚欧美色图| 夜夜操二区| 91久久久亚洲| 综合色久欲| 久久香蕉国产传媒一区剧情天美| 一类av片在线看| 国产后入式在线观看| 中文字幕 码 自拍 视频 区| 偷看洗澡一二三区美女| 男女激情黄色网址| 日本男人天堂| 人妻少妇精品久久久| www.丁香五月| 天天干夜夜操网| 国产强奸乱伦第1页| 亚洲日韩XXX| 麻豆天美电影一区二区| 操逼操逼逼操操逼91| 东京热双插| 欧美 综合 亚洲| 蜜臀久久一区二区| 亚洲无码99| 日本孕妇孕交| 麻豆影音天美视频| 激情自拍 校园春色| 狠狠操夜夜| 丝袜美腿亚洲| 日韩有码专区| 91免费看中出视频| 玖玖爱伊人玖玖爱| 人人澡综合涩| 加勒比日本在线| 中文字幕黑人大片| 再深点灬舒服灬太大了好硬好爽| 日韩另类| 亚洲国产欧美中文永久| 亚洲国产奇米影视久久| 国内毛片热久久思思热| 亚洲美女精品九九视频| 色噜噜人妻av中文字幕| 老熟女中文字幕高清| 亚洲夜色在线| 99啪啪| 人妻精品4K4K4K4K4| www99热| 人人摸人人干人人拍97| 欧美日韩另类在线| 日韩成人精品| 高清成年美女黄网站免费大全 | 留下AⅤ黄色片| 中文字幕人成乱码熟女香港| 精品九九国产无码| 秋霞一级A片黄色视频| 日本影视久久免费| 久久透逼视频| 四虎国产精品永久地址入口| 欧美日韩黄片精品在线| 一区操逼| 可以在线观看AV的网站| 操逼无码一区| 亚洲日韩国产欧美综合v| 91精品啪在线观看国产城中村| www.av在线视频| 日韩av不卡在线看| 青娱乐亚洲自拍| 国产av强奸美女| 99re公开精品免费视频| 五月婷婷AV| 五月天婷婷成人网| 久久久久久中文字幕中文字幕最新| 婷婷色色五月天| av资源在线观看少妇| 日本污ww视频网站| 99.色网| 天天综合网久久ww| 一区二区播放| 97超碰中文在线| 乱性AV| 免费一级黄色录像影片| 干婷婷综合网| 男人的天堂2019AV| 亚洲天堂自拍| 青青草国产一区二区三区| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 五月丁香综合| 日韩久久超碰色| 久久爽爽精品| 伊色久人大在线| 久久超碰网| 无码人妻精品一区二区中文| 高清无码网址| 免费亚洲国产精品久久一区| 熟妇一区二区| 蜜桃无码AV一区二区| 国产毛片精品一区二区色欲黄A片| 开心激情站| 青青草色情网站视频| 综合大香蕉美。| 97免费在线视频| 综合操逼| 亚洲色图 欧美热图 清纯唯美 另类自拍| 免费啊啊啊| 久久久999国产精品| 欧美一级A一级a爱片久久| 一本精品日本在线视频精品 | 国产蜜臀精品一区二区尤物| 中文字幕日韩专区精品系列| 国产女人成人精品视频| 亚洲av热热色| 日日夜夜骑| 日韩乱伦AⅤ| 99精品久久| 搞中出视频在线观看| 久久久999国产精品| 在线有码中文字幕| 99这里有精品视频| 色眯眯av| 日韩欧美tv一区二区在线观看| 蜜桃视频精品一区二区| 在线观看啊啊啊啊啊| 亚洲国产婷婷在线播放| 九一亚洲国产免费| 91老司机在线| 99色综合| 夜夜夜爽www精品视频| 曰韩精品视频一区二区| 国产精品午夜成人福利| 亚洲不卡三级手机播放| 午夜福利久久久噜久噜久久综合| 国产精品国产精品国产| 开心五月深爱五月| 欧美色亚洲色| 亚洲夜夜欢无码一区二区 | 男女激烈网站最新| 男人的天堂.com| 中欧人妻丝袜中文字幕| 1024香蕉视频| 久久久久国产精品久久久| 午夜一区| 夜夜高潮夜夜爽夜夜爱爱一区 | 久久色AV线| 中文字幕AV乱伦| 91+欧美| a片自拍直播视频| 久久久久久国产精品| 老熟女阿 国产91| 国产AV超爽| 亚州精品人妻一二三区| 国产成人无码网站在线视频| 麻豆色约约| 天天天天干| 欧美综合第一页| 九月婷婷综合| …亚洲黄色厕厕女女在线播…| 麻豆国产尤物AV| 麻豆尤物视频网| 亚洲 日本 一 二 三| 国产成人精品网站| 欧美九九99久久精品| 亚洲影院成人| 欧美亚州色的图| 综合久久欧美| 欧美色亚洲| 成人女人国产| 中文字幕丝袜国产第一页不卡| 亚洲有码第一页| 每日更新AV| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 欧美激情超碰777| 亚洲97成人在线观看| 欧美伦乱爱| 91人妻尻屄视频| 大香蕉99999| AV天堂男人的天堂| 欧美精品999| 97操| 福利五区| 中文字幕在在线观看网站| 岛国片在线视频网站| 2003天天干夜夜操| 久久这里精品国产99丫e6| 日韩亚洲中文字幕在线| 四虎精品一区二区| 蜜桃传媒视频第一区入口在线看| 亚洲国产综合久久天堂| 丁香六月东京热| 日韩精品人妻| 蜜臀一二三| 玖玖人人爱| 操逼逼中文字幕| 91精品老女人| 一区二区无码视频| 久久综合女优| 久久久久久久极品香蕉视频| 99精品久久久久久久婷婷| 人妻精品一区二区| 亚洲图片欧美另类综合免费视频大大香| 理论久久婷婷网 8| 亚洲av淫乱| 中文字幕日韩专区精品系列| 2020中文字幕在线观看| 9997se| 射欧美综合| 色婷婷丁香五月天| 天天看,天天做| 午夜视频黄| 96麻豆精品一区二区三区| 好屌色综合| 欧美大香蕉卡久久| 操一区| 日韩精品亚洲专区在线影视| 免费av高清无码| 青青青青操国内视频在线| 亚洲诱惑天堂| 手机久操欧美综合色码| 亚州色国| 欧美日动态视频| 亚洲AO在线| 天美传媒国产原创中文字幕亚洲欧美另类 | 欧美日韩国产另类综合| 久久久性| 乱伦熟女专区| 波多野结衣AV无码一区| 亚洲欧美第一页| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 久久久久网站-538在线视频-欧美永久乱码| 防屏蔽在线视频| 亚洲国产日韩欧美熟妇在线| 色综合99| 欧美午夜精品久久久久久3D| 欧洲色| 日本在线一二 | 久久精品国产亚洲粉嫩| 亚洲欧美另类图片| a片自拍直播视频| 免费精品无码一级毛片牛牛影视 | 欧美一区91大爱| 密桃99999| 激情五月激情综合网| www.夜夜操| 男人的天堂啪啪| 久久这里都是精品| 久久综合女优| 中文在线视频| 精品人妻一区二区三区不卡断| 久久婷婷一区| 婷婷婷婷婷婷久久久久| 日韩熟女乱伦中出| 欧美性爱一级操| 九九精品热| 超碰超碰95| 国产美女91视频| 亚洲综合 欧美| 日日97| 97视频在线看| 404操逼福利视频| 四虎影院成年人片| 亚洲天天艹| 天天摸天天碰天天添青青| 日韩78m视频| 久久久久幕乱码| 性色亚洲| 无码精品蜜桃一区二区三区ww| 欧美视频在线视频免费va| 2011国产精品| 免费看国产大AB| 亚洲视频精选| 日逼国产| 亚洲s在线观看| 啊啊啊啊啊啊啊啊要喷了| 91插B网站| 久久永久无码人妻视频| 女人爽到高潮潮喷18禁网站| 一区中文字幕二区日韩| 成人丁香五月| 久久精品视频在线观看| 欧美综合色,www| 亚洲激情在线观看一区| 国产成人+综合亚洲+天堂| 欧美三级免费伊人| 久久久久久九| 黑人黄片在线免费观看| 国产精品色哟哟| 中文字幕乱妇免费视频| 亚洲黄色a级片| 无码一区二区三区四区五区六区七区八区九区十区视频 | 日韩中文字幕视频在线观看| 麻豆AV一区二区| 色九色久| 国产精品激情久久久久久久| 久久av网| 欧美日韩在线小说 | 国产婷婷一区| 综合 亚洲 欧美| 亚洲成?V人片在线观看福利| 欧美久久久15P| 人妻久久一区二区三区| 成人性爱AV在线免费观看| 麻豆国产97在线| 亚洲高清欧美总合| 蜜臀AV网站| 青娱乐大香蕉| 日韩免费a级毛片无码a∨| 天天做日日爱夜夜爽| 99热在线不卡| a男人的天堂久久一级A毛片| 日日夜夜干| 亚洲 中文 欧美 日韩 在线| 久久美女国产| 人人搡人人肉久久精品| 免费观看性欧美一级| 夜夜爽77777| 国产9熟妇视频网站| 亚洲日韩精品一区视频在线| 欧美 日韩 婷婷 五月| 中国一级αV| 久久久久久久久久久久久久久性生活视频| 91欧美网| 国产欧美第五页| 96一区二区| 婷婷五月丁香五月| 97色97干| 粘花网06av视频| 青娱乐二区免费| 欧美综合加勒比在线| 久久夜夜| 91福利网在线观看| 欧美日韩222| 91精品亚洲内射孕妇| 又黄又粗又硬又长又大| 高清无码一区二区三区| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 欧美日不卡| 一起草三级AV电影在线观看 | 欧美精品第四五页中文字幕在线观看| 国产成人精品必看| 久久久久久久久久久精| 亚洲综合五月天| 超碰在线91| 天美av在线观看| 久久国产熟女影院| 亚洲 综合 第一页| 91free福利| 精…码一二三区| 亚洲中文字幕乱码无码一区二区 | 性站| 一本色道久久天天射天天干| 久久久久国产精品人妻aⅴ天堂| 久久久精品国产亚洲AV无码| 欧美组图日韩亚洲中文字幕| 免费网站观看www在线观| 亚洲精美粉嫩嫩泬在线观看 | 国产极品精品美女视频| 色婷婷日韩精品一区二区三区| 色婷婷丁香五月| 操操操五月天婷婷丁香影院| 久久久一区二区| 91色插| 快点操死我| 思思热影视| 啊啊啊网站| 欧美91丝袜| 人妻少妇一区二区| 国产一级不卡在线观看| 国产精选视频| 东京热熟女亚洲视频网站| 婷婷色导航| 自拍偷拍草一草| 91白嫩| 天天天天做夜夜夜夜做| www.狠狠| www成人啪啪18秘 免费| 欧美一级黄色18片免费看| 欧美一级A一级a爱片久久| 色网综合网| 亚洲精品丝袜| 日韩无码专区| 国产精品欧美日韩久久| 欧美亚洲自拍另类人妻| 91n处女在线观看| 超碰1997| 久久m| 国产精品制服丝袜中文字幕日韩一区二区三区 | 亚洲黄片免费在线播放| 中文字幕视频在线观看| 九99久久| 欧洲亚洲人人爽爽视频| 99只有精品| 色九九九| 开心六月色| 91neishe| 999久久久精品国产| 久久一区二区三区入口| 可以在线观看的黄色网址| 日韩av无码网站| 韩国三级色呦呦| 美女91| 99999久久精| 国产深喉| 青青草依人大香蕉| 超碰在线免费一区二区三区| 久久噜噜噜精品国产亚洲综合| 精品久久九| 国产精品视频| 亚洲一区二区 麻豆传媒| 妇女视频网站| 日日干男人的天堂| 欧美青青草视频| 人妻五十路在线| 日本黄色XXX| 亚洲人精品午夜不卡| 国产成人精品午夜福利| 亚洲se电影| 高清孕妇孕交 交孕妇| 91无摭挡| 99久草| 黄骗免费网站| 激情小说日韩无码| 国产精品爽爽v| 日韩 欧美 另类 人妻| 人妻 中文 日韩| 性爱乱伦一区| 亚洲欧美大香蕉| 日韩AV一区二区三区三州三州| 97超碰无码网| 9精品久久| 色哟哟av| 东京热一区二区中文字幕| 东北少妇高潮zzzz| 奇米四色影视777久久久| 天天做日日做天天欢。| 婷婷五月av| 欧美制服另类丝袜| 欧美国产一区二区三区麻豆传媒| 天天综合网合集91| 日本加勒比无码专区| 蜜乳中文字幕a在线| 亚洲AV性爱电影| 91综合天天看| 中文?日韩?免费?精品| 高清无码一区二区三区| 99精品在线| 亚洲色性情三级| 蜜区区视频79 | 亚洲无吗在线视频| 伊人AAA| 级品肉射| 中文字幕三四五区| 欧美亚洲色图另类国产| 99这里有精品| 亚洲性少妇| 精品九九| 国产成人精品日本亚洲语言| 婷婷综合在线观看| 91中文字幕在线观看| 欧美v亚洲v综合v国产v妖精| 我爱大香蕉| 天天内射| 日本淫乱女一区二区三区视频| 人人人人插| 亚洲色人妻综合| 伊人久日| 岛国视频一二三区| 中文字幕精品丝袜| 青青在线视频免费| 囯产操逼片| 神马午夜久久久| 青青草好吊色| 五月丁香综合啪啪| 蜜臀aV午夜一区二区三区| 边做饭边操逼逼| 久久久久久久人妻| 欧美图片校园春色| 欧美性巨大╳╳╳╳╳高跟鞋| 天堂资源欧美| 美女久久久久久久久久久| 把腿张开老子CAO烂你| 国产美脚女优尤物在线观看| 久久久久久九九九| 色婷婷狠狠| 国产AV线| 亚洲蜜桃V妇女| 色网综合网| 日本免费一级AAA大片器| 在线 亚洲 网爆 自拍| 色悠久| 97天天爽| 欧美日韩在线小说 | 99蜜月精品久久| 亚洲国产精品无码AV在线| 成人综合视频久久| 成人a v在线播放免费| 天天看少妇| dy888午夜老子影视达达兔| 国产亚洲人妻综合日韩 久久| 婷婷激情丁香| 丁香五月婷婷基地| 97资源久久| 女优免费一区二区永久| 一区二区三区不卡视频| 亚州精品一区二区三区香中文字幕在线| 78m啪啪啪| 麻豆久久久一区二区| 欧美美女视频| 熟妇高潮一区二区免费视频| 精品国产一区探花在线观看| 台湾佬中文娱乐自偷自拍| 一级性爱视频免费在线| 欧美亚洲日韩16色| 在线中文字幕极品av| 婷婷精品国产欧美精品亚洲人人爽| 视频国产精品未满十八禁止在线观看| 熟妇高潮二区三区| 天天综合精品| 国产在线综合网| 大乔未久88一区| 国精精品无码一二三区水多多| 天操天操夜操夜月月年年操操 | 九九九九精品精| 精品人妻二区三区| 日韩人妻一二三区视频| 99精品在线| 人人天天欧洲| 涩涩涩综合| 夜夜春夜夜操| 东北女人av| 大香蕉黄色一级片免费看| 久欲AV| 伊人久久青青草| 少妇无码av专区线| 亚洲天堂电影网99999| 少妇二级| 91快色色色色色| 亚洲91色| 久湿久久| 狼人综合婷婷激情四射| 欧美强奸乱| 无码天堂| 99久久e免费热视| 热热色91| 九九九精品色乱九九九| 午夜精品一区二区三区三上悠亚| 精品午夜福利国产一区二区在线观看| 免费视频观看60秒| 国产五码丝袜屁眼| 人妻熟女字幕一区二区| 日本操大逼| 超碰在线人人射| 黄站在线免费观看| 亚洲永久永久永久永久一级一级一级精品 | av婷婷色婷婷色六月| 热99这里有精品综合久久 | 亚洲AV不卡在线观看| 美女在线H91| 中文字幕精品资源在线| 人人操人人色人人摸| 96超碰网| 国产精品粉嫩福利在线| 中文字幕88av在线| av天堂影视中文在字幕在线中文 | 蜜臀va69| 天天操天天看| 欧美人妻色| 老熟女91av| 激情五月天网| 亚洲中文字幕三级在线| 国产久久av| 欧美性爱免费短视频| 人人操人人摸人人骑| 日天天九九天堂666| 狠狠躁日日躁夜夜躁A| 麻豆天美传媒在线视频天堂| 国产丝袜美女诱惑| 吻戏激情性巴克| 无套内射性感少妇视频| 亚洲图片欧洲图片aⅴ| av天堂精品久久| 99久久精品欧美国产| 熟女探花啪啪| 神马久久久久久| 97超碰超碰| 91天堂| 91久| 欧美综合第一页| 极品少妇久久久| 亚洲综合在线91| 可乐操亚洲蜜911| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 国产精品动态一区二区三区四四| 中文字幕文字幕无码一区二区三区电影99| 国产又大又粗又长视频在线| 99精品热| 在线观看午夜婷婷久久久久清性观看| 丝袜av一区二区三区| 激情综合av| 久噜噜| daxiangjiao你懂的| 午夜无码熟妇丰满人妻| 99热国产| 欧美综合色,www| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 国产第25页在线观看| 日本一本道A级黄色毛片试看60分钟| 亚洲欧综合另类无码一区| 韩国午夜理伦三级好看| 色牛牛AV| 欧美午夜精品久久久久久超碰| 美女尤物福利视频| 人人摸人人干| 日韩美女高潮喷水视频| 99精品丰满人妻无码| 夜夜国自区| 激情欧美97| 四虎国产精品永久入口| 国产精品美女在线一区| 日本123区操B视频| 久久本道| 是还免费视频1727我| 国产自偷| 综合久久少妇中文字幕| 国产精品久久久久无码A√| 亚洲一区二区三区AV无码| 99热综合| 国产乱弄免费在线视频。| 91男同| 东京热男人天堂| A级毛片在线看免费| 久久鲁干| 中美日韩毛片| 骚妻少妇精品性色无码四色A V| 91精品国产一区三一| 日韩美女啪啪一区| 色婷婷久久| 熟女色图在线| 精品女同一区二区三区| 国产1024在线播放| 亚洲精品aa久久伊人| 久久久工口| 男人天堂最新手机版在线青青草| 久久久999| 国产精品一二三在线看| 久久大香蕉手机高清| 97超碰中文字幕| 日本视频在线中文字幕| 韩国三级理论在线| 殴美综合色88| 极品肉射| 熟女人妻一区二区三区| 二对二中文字幕。| 999精品乱码| 久久国内| 99 国产丝袜在线| 亚洲图片欧美| 亚洲欧美经典一区二区| 亚州中文字幕超碰97| 97干97色| 9色在线| 亚洲偷91色| 久久久久久久伊人精品| 老女人爆菊| 欧美色97| 欧美专区日本专区| 97精品第3页| 成人五月天丁香激情综合| 熟女熟妇伦久久影院毛片一区二区| 欧美一级A一级a爱片久久| 91精品黄在线观看| 91色综合色| 日va操| 老司机午夜福利视频一区二区| 操b在线观看| 久久啊哟| 人妻夜夜爽天天爽三区麻豆AV网站| 91chinese在线| 综合熟妇一区二区三区| 大伊香蕉在线视频免费| 操曰本熟女| 国产熟女完整版中字 | av无码av无码专区| 高潮综合网| 在线色导航| 综合色拍| 太久视频| 熟女久久久| 在线性黄高清免费视频| 欧美激色| 去干网最新版| 日韩久射综合| 五月天社区| 97亚洲欧美| 国产乱婷婷精品二区三区| 曰韩中文人妻视频| 欧美第38页| 欧美精品23| 亚洲AV不卡在线观看尤物| 亚洲精品性爱片| 久日综合网| 国产福利影视| 欧美78P| 久久久艹艹艹| 久久精品人人做人人看| 夜草欧美| 成人性爱电影一区二区| 人人妻人人爽| 精品福利视频| 欧美日本中字另类在线| 超碰9 7女人| 超碰在线91| 激情小说亚洲| 九九九九日本| 亚洲超碰AV| 久草看看看| 有码免费观看| 视频国产精品未满十八禁止在线观看| 久久是精品| 91大学精品激情戏| 欧美片第一页| 色拍偷亚洲| 九九热精品视频在线观看| 亚洲精品国产精品成人| 欧美少妇高潮久久91| 日本123区操B视频| 国产高清自拍视频| 国产精品久久久久久久免牛肉蒲团| 女人午夜视频777| 免费视频一二三区| 97超碰资源网| 国产精品一二三免费网站| 欧美一级美片在线观看免费| 久热99999| 国产粉嫩蜜臀av一区二区三区| 久久国模av| 丁香激情五月| 日本精品无码三级网站| 好吊色综合| 成人一区二区三区四区| 色五月激情网| 国产精品自拍xxxx| 亚州综合色| 久久久精品视频欧州站| 91精品电影18| 亚洲AV无码国产精品久久久久| 黑人免费福利视频| 久啪视频| 神马久久69| 91亚洲不卡一区| 日韩av乱伦| jk白丝没脱就开始啪啪| 精品999999| 欧美成人贴图| 97精品97久久| 97se综合网| 亚洲激情网一二三四区| 天天操天天舔| 欧美人与性动交a美精品| 欧美亚洲中文| 国产精品在线免费| 亚洲色棕合| 日日做夜狠狠爱欧美黑人| 精品网站9999| 天天操狠狠日夜夜干超碰撸com视频在线观看 | 强奸乱伦动态污图免费| 精品亚洲成人免费在线| 东北熟女91| 亚洲精品黄码久久久久| 美熟女逼导航AV操逼| 青青草视频在线观看一区二区| 久久五月份| 亚洲AV免费在线| 插欧洲美女欧美精品| 少妇干B| 国产精品干干干| 欧美A片中文字幕| 综合久久久久久久久91| 免费人成毛片乱码| 久久久久久精| 久久夜夜| 日韩在线国产字幕| 欧美国产精品久久九九| 偷拍精品一区二区三区| 青青青青操国内视频在线| 天天综合网在线91| 国色综合天| 大香蕉日韩| 色香av| 丰满人妻一区二区三区色-百度| 大粗鳼巴久久久久| 人妻丝袜一区二区三区在线| 精品亚洲天堂| 91亚洲色图| 99久久无码| 啪啪啪精品| av网站在线观看了| 视频国产精品未满十八禁止在线观看| 亚洲欧美日韩免费电影| 欧美强奸乱能| 国产小u女在线观看| 国内精品久久久久影院亚洲| 久操精品网| 亚洲激情网一二三四区| 中文字幕丝袜美腿| 综合网久久| 啊啊啊啊好大好硬啊啊啊啊啊 | 91丨熟女丨丰满熟女| 久久久精品国产亚洲AV无码| 五月激情啪啪| 日韩天堂av电影在线观看| 97免费视频网| 91色综合色| 欧姜老司机| 91被操| 日本免费专区| 日本三级大片| 97超碰逼| 日韩专区久久久| 久久久久久九| 高清无码一区二区三区| 成人日本视频人妻在线| 看日韩美女二区三区免费操逼视频 | 青青草吊丝| 99热日| 亚洲色图亚洲| 99re国产精品视频| 婷婷五月天久久久| 久视频在线观看| 少妇内射视频| 国产成人久久精品蜜臀| 隔壁邻居波多野结衣中文字幕| 精品国产精品一区二区| 久久久99久9| 精品国产乱码久久久久久日本公司| 91欧美综合| 国产曰批免费观看久久久| 97色婷婷| 国产第二页| 中文字幕在线播放2中文字幕在线观看2| 国产精品熟女AV中文字幕在线播放| 操淫穴亚洲五月丁香| 国产精品操| 亚洲黄色网址视频| 中文一区二区婷婷视频| 国产熟女自拍| 日韩黄片影院| 95人妻爽爽人人做人人澡| 91天美传媒在线| 啊啊啊好多水| 亚洲经典啪啪| 神马久久啊啊| 在线视频免费观看午夜| 成片免费播放| 精品一二三区四视频| 男人天堂电影院| 国产67194| 少妇第一页| 在线观看一级α片刺激高潮视频| 婷婷啪啪| 少妇熟女视频一区二区三区| 久久中文字幕一区不卡| 发朗少妇买婬全视频中文| 精品乱码在线观看| 人妻丰满熟妇一区二区三| 亚洲美乱| 人妻丝袜一区二区三区在线| 国产亚洲色婷婷久久99精品91葵花宝典 | 国产AV天美| 激情文学88| 黄色AV影视| 久久精品区| 亚洲高清无码免费观看视频| 肉丝无码中文高清| 国产精品人妻熟女aⅴ| 久热久一区二区三区| 色香综合| 五月开心网| 黄色成年| 日韩成人网址| 国产三级中文字幕粉嫩| 亞洲久久直播| 97超碰这里只有精品| 欧美日产国产在线成人第一区| 麻豆黄四叶草网站| 久96热在线观看视频| 久久久久密| 69国产对白刺激| 丝袜狠狠草尤物人妻av91| 久久久久亚洲| 小草三级久久观看| 欧美狠狠干| 欧洲中文字幕| 国产亚洲精品久久久久小| 成人A片男人的天堂| 天天射天天| 香港日本韩国人妇99www.wccm20| 欧洲亚洲国产综合在线| 天天干天天中出av| 3d成人精品一区二区| 九九综合网| 韩国一级婬片A片AAAAA| 欧美性色欧美| av优播| 中字幕人妻一区二区三区| 国产亚洲色婷婷99精品91| 三级特黄60分钟播放| 超碰97在线色男人??| 手机在线看片免费人成视频| 久久亚洲日韩国产欧| 六月天婷婷| 久久伊人最新网址视频| 久婷婷一区| 性开放中文AV高清无码免费看| 2020中文字幕在线| 超碰av人人人| 久久 国产 无码| 欧亚揄拍偷拍精品视频 | 久久久久久性爱免费视频| 亚洲伊人久久精品狠狠在线| 国产最新小视频在线播放下载 | 国产福利精品最新在线| 人人妻人人爽一区二区三区| 99re这里只有精品3| 成年女人黄网站| 久久蜜桃一区二区| 亚洲av总站| 99热在线观看| WWW.操逼.COM| 亚洲人人夜夜澡人人爽| 大香蕉乱级| 2024人人操人人摸| 精品久久99| 熟女一区二区三区| 97国产精品视频| SUV一区二区在线看| 岛国成人av在线播放网址| 97日韩| 亚洲视频小说| 狠狠综合| 国产女同视频在线播放| 男生通女生屁股| 97青娱乐超碰久久| 大香蕉综合在线| 可以免费看黄片的视频| 玖色av| 国产成人主播| 日韩欧美视频青青| 国产操偷| 老司机午夜精品视频| 久久中久文96| 欧亚第一综合网| 伊人久久婷婷| 亚洲欧美日韩二区视频| 亚州91| 东京热伊久| 天天激色| 亚洲乱色视频一区、二区在线| 日本123区操B视频| 中文字幕日韩电影人妻| 精品一级| 激情文学小说一区二区| 日本A级视频| 麻豆视频test| 丁香色色网| 免费在线观看国内色片网站网址| 国产精品一二三区18| 少妇熟女一区二区三区| 天欧美在线| 久久99草| 蜜臀AV成人精品蜜臀| 中文字幕av色| 国产精品色色| 我爱大香蕉| 人人操人人狠狠操| 亚洲精美粉嫩嫩泬在线观看| 人人操人人爽人人操人人| 精品国产乱码久久久久久蜜臀| 国产三级中文字幕粉嫩| 日韩色女精品| 性爱AV天堂| 操死我了嗯嗯嗯| 欧美72网页| oumeisetupian| 夜夜操av亚洲一区二区| 插入综合网| 91 手机在线播放 绯色| 色色色网站| 亚洲日韩一区电影| 91狠狠综合久久久久久| 不卡免费av在线播放| 久久久久九九九| 中国一区二区亚洲人妻| 欧美大香蕉专区网| 日韩精品黄片免费观看| 精品国产人成在线| 国产h片在线观看视频| 久久直播国产| 国产区性爱在线视频秋霞豆| 免费看A片毛毛片在线播| 综合影视国产无码| 秋霞影音一区二区三区| AV无码久久久精品| 欧美性爱在线无码| 日本三级大片| 日本 欧美 亚中文字幕| 东京热激情视频一二三区| 97视频播放| 天天色播| 精品妇女一区二区三区| 91精品电影18| 不卡九肏| 亚av顶级裸体一区二区三区四区五区| 国产25页|