[{"data":1,"prerenderedAt":1805},["ShallowReactive",2],{"article-backend\u002Ffastapi":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"tags":11,"body":15,"_type":1799,"_id":1800,"_source":1801,"_file":1802,"_stem":1803,"_extension":1804},"\u002Farticles\u002Fbackend\u002Ffastapi","backend",false,"","FastAPI 入门：7 个核心概念快速上手 Python Web API","从最小程序到完整示例，系统梳理 FastAPI 的 7 个基础概念：路由、路径与查询参数、Pydantic 请求体、JSON 响应、HTTPException 错误处理与 async\u002Fdef 选择，帮助快速搭建可用于 AI 药物发现项目的接口。","2026-05-25",[12,13,14],"人工智能","软件工程","Agent开发",{"type":16,"children":17,"toc":1789},"root",[18,26,37,42,77,110,119,124,133,146,228,233,263,268,315,320,344,354,363,368,523,528,583,592,597,628,632,646,675,688,719,723,737,757,872,877,943,952,973,1028,1037,1057,1133,1138,1218,1227,1232,1301,1306,1331,1350,1358,1715,1720,1783],{"type":19,"tag":20,"props":21,"children":22},"element","p",{},[23],{"type":24,"value":25},"text","明白。FastAPI 基础可以按 7 个概念学，不要一开始就陷进项目结构。",{"type":19,"tag":27,"props":28,"children":30},"h3",{"id":29},"_1-fastapi-是什么",[31],{"type":19,"tag":32,"props":33,"children":34},"strong",{},[35],{"type":24,"value":36},"1. FastAPI 是什么",{"type":19,"tag":20,"props":38,"children":39},{},[40],{"type":24,"value":41},"FastAPI 是 Python 的 Web API 框架。你写普通 Python 函数，它帮你处理：",{"type":19,"tag":43,"props":44,"children":45},"ul",{},[46,52,57,62,67,72],{"type":19,"tag":47,"props":48,"children":49},"li",{},[50],{"type":24,"value":51},"HTTP 路由",{"type":19,"tag":47,"props":53,"children":54},{},[55],{"type":24,"value":56},"JSON 请求和响应",{"type":19,"tag":47,"props":58,"children":59},{},[60],{"type":24,"value":61},"参数校验",{"type":19,"tag":47,"props":63,"children":64},{},[65],{"type":24,"value":66},"自动 API 文档",{"type":19,"tag":47,"props":68,"children":69},{},[70],{"type":24,"value":71},"错误返回",{"type":19,"tag":47,"props":73,"children":74},{},[75],{"type":24,"value":76},"异步接口",{"type":19,"tag":20,"props":78,"children":79},{},[80,82,89,91,97,99,108],{"type":24,"value":81},"官方基础示例也是从 ",{"type":19,"tag":83,"props":84,"children":86},"code",{"className":85},[],[87],{"type":24,"value":88},"FastAPI()",{"type":24,"value":90},"、路由装饰器、启动服务、访问 ",{"type":19,"tag":83,"props":92,"children":94},{"className":93},[],[95],{"type":24,"value":96},"\u002Fdocs",{"type":24,"value":98}," 开始。参考：",{"type":19,"tag":100,"props":101,"children":105},"a",{"href":102,"rel":103},"https:\u002F\u002Ffastapi.tiangolo.com\u002Ftutorial\u002Ffirst-steps\u002F",[104],"nofollow",[106],{"type":24,"value":107},"FastAPI First Steps",{"type":24,"value":109},"。",{"type":19,"tag":27,"props":111,"children":113},{"id":112},"_2-最小程序",[114],{"type":19,"tag":32,"props":115,"children":116},{},[117],{"type":24,"value":118},"2. 最小程序",{"type":19,"tag":20,"props":120,"children":121},{},[122],{"type":24,"value":123},"下载依赖：\nuvicorn：服务器",{"type":19,"tag":125,"props":126,"children":128},"pre",{"code":127},"uv install python 3.11\nuv add 'fastapi[standard]@latest'\nuv add 'uvicorn[standard]'\n",[129],{"type":19,"tag":83,"props":130,"children":131},{"__ignoreMap":7},[132],{"type":24,"value":127},{"type":19,"tag":20,"props":134,"children":135},{},[136,138,144],{"type":24,"value":137},"新建 ",{"type":19,"tag":83,"props":139,"children":141},{"className":140},[],[142],{"type":24,"value":143},"main.py",{"type":24,"value":145},"：",{"type":19,"tag":125,"props":147,"children":151},{"code":148,"language":149,"meta":7,"className":150,"style":7},"from fastapi import FastAPI\n\napp = FastAPI()\n\n\n@app.get(\"\u002F\")\ndef read_root():\n    return {\"message\": \"Hello FastAPI\"}\n","python","language-python shiki shiki-themes github-dark",[152],{"type":19,"tag":83,"props":153,"children":154},{"__ignoreMap":7},[155,166,176,185,193,201,210,219],{"type":19,"tag":156,"props":157,"children":160},"span",{"class":158,"line":159},"line",1,[161],{"type":19,"tag":156,"props":162,"children":163},{},[164],{"type":24,"value":165},"from fastapi import FastAPI\n",{"type":19,"tag":156,"props":167,"children":169},{"class":158,"line":168},2,[170],{"type":19,"tag":156,"props":171,"children":173},{"emptyLinePlaceholder":172},true,[174],{"type":24,"value":175},"\n",{"type":19,"tag":156,"props":177,"children":179},{"class":158,"line":178},3,[180],{"type":19,"tag":156,"props":181,"children":182},{},[183],{"type":24,"value":184},"app = FastAPI()\n",{"type":19,"tag":156,"props":186,"children":188},{"class":158,"line":187},4,[189],{"type":19,"tag":156,"props":190,"children":191},{"emptyLinePlaceholder":172},[192],{"type":24,"value":175},{"type":19,"tag":156,"props":194,"children":196},{"class":158,"line":195},5,[197],{"type":19,"tag":156,"props":198,"children":199},{"emptyLinePlaceholder":172},[200],{"type":24,"value":175},{"type":19,"tag":156,"props":202,"children":204},{"class":158,"line":203},6,[205],{"type":19,"tag":156,"props":206,"children":207},{},[208],{"type":24,"value":209},"@app.get(\"\u002F\")\n",{"type":19,"tag":156,"props":211,"children":213},{"class":158,"line":212},7,[214],{"type":19,"tag":156,"props":215,"children":216},{},[217],{"type":24,"value":218},"def read_root():\n",{"type":19,"tag":156,"props":220,"children":222},{"class":158,"line":221},8,[223],{"type":19,"tag":156,"props":224,"children":225},{},[226],{"type":24,"value":227},"    return {\"message\": \"Hello FastAPI\"}\n",{"type":19,"tag":20,"props":229,"children":230},{},[231],{"type":24,"value":232},"启动：",{"type":19,"tag":125,"props":234,"children":238},{"code":235,"language":236,"meta":7,"className":237,"style":7},"uvicorn main:app --reload\n","bash","language-bash shiki shiki-themes github-dark",[239],{"type":19,"tag":83,"props":240,"children":241},{"__ignoreMap":7},[242],{"type":19,"tag":156,"props":243,"children":244},{"class":158,"line":159},[245,251,257],{"type":19,"tag":156,"props":246,"children":248},{"style":247},"--shiki-default:#B392F0",[249],{"type":24,"value":250},"uvicorn",{"type":19,"tag":156,"props":252,"children":254},{"style":253},"--shiki-default:#9ECBFF",[255],{"type":24,"value":256}," main:app",{"type":19,"tag":156,"props":258,"children":260},{"style":259},"--shiki-default:#79B8FF",[261],{"type":24,"value":262}," --reload\n",{"type":19,"tag":20,"props":264,"children":265},{},[266],{"type":24,"value":267},"含义：",{"type":19,"tag":43,"props":269,"children":270},{},[271,287,304],{"type":19,"tag":47,"props":272,"children":273},{},[274,280,282],{"type":19,"tag":83,"props":275,"children":277},{"className":276},[],[278],{"type":24,"value":279},"main",{"type":24,"value":281},"：文件名 ",{"type":19,"tag":83,"props":283,"children":285},{"className":284},[],[286],{"type":24,"value":143},{"type":19,"tag":47,"props":288,"children":289},{},[290,296,298],{"type":19,"tag":83,"props":291,"children":293},{"className":292},[],[294],{"type":24,"value":295},"app",{"type":24,"value":297},"：代码里的 ",{"type":19,"tag":83,"props":299,"children":301},{"className":300},[],[302],{"type":24,"value":303},"app = FastAPI()",{"type":19,"tag":47,"props":305,"children":306},{},[307,313],{"type":19,"tag":83,"props":308,"children":310},{"className":309},[],[311],{"type":24,"value":312},"--reload",{"type":24,"value":314},"：开发模式，代码变化自动重启",{"type":19,"tag":20,"props":316,"children":317},{},[318],{"type":24,"value":319},"访问：",{"type":19,"tag":125,"props":321,"children":324},{"code":322,"language":24,"meta":7,"className":323,"style":7},"http:\u002F\u002F127.0.0.1:8000\u002F\nhttp:\u002F\u002F127.0.0.1:8000\u002Fdocs\n","language-text shiki shiki-themes github-dark",[325],{"type":19,"tag":83,"props":326,"children":327},{"__ignoreMap":7},[328,336],{"type":19,"tag":156,"props":329,"children":330},{"class":158,"line":159},[331],{"type":19,"tag":156,"props":332,"children":333},{},[334],{"type":24,"value":335},"http:\u002F\u002F127.0.0.1:8000\u002F\n",{"type":19,"tag":156,"props":337,"children":338},{"class":158,"line":168},[339],{"type":19,"tag":156,"props":340,"children":341},{},[342],{"type":24,"value":343},"http:\u002F\u002F127.0.0.1:8000\u002Fdocs\n",{"type":19,"tag":20,"props":345,"children":346},{},[347,352],{"type":19,"tag":83,"props":348,"children":350},{"className":349},[],[351],{"type":24,"value":96},{"type":24,"value":353}," 是自动生成的接口调试页面。",{"type":19,"tag":27,"props":355,"children":357},{"id":356},"_3-路由get-post-put-delete",[358],{"type":19,"tag":32,"props":359,"children":360},{},[361],{"type":24,"value":362},"3. 路由：GET \u002F POST \u002F PUT \u002F DELETE",{"type":19,"tag":20,"props":364,"children":365},{},[366],{"type":24,"value":367},"路由就是“URL + HTTP 方法”。",{"type":19,"tag":125,"props":369,"children":371},{"code":370,"language":149,"meta":7,"className":150,"style":7},"@app.get(\"\u002Fhealth\")\ndef health():\n    return {\"status\": \"ok\"}\n\n\n@app.post(\"\u002Fitems\")\ndef create_item():\n    return {\"message\": \"created\"}\n\n\n@app.put(\"\u002Fitems\u002F{item_id}\")\ndef update_item(item_id: int):\n    return {\"item_id\": item_id, \"message\": \"updated\"}\n\n\n@app.delete(\"\u002Fitems\u002F{item_id}\")\ndef delete_item(item_id: int):\n    return {\"item_id\": item_id, \"message\": \"deleted\"}\n",[372],{"type":19,"tag":83,"props":373,"children":374},{"__ignoreMap":7},[375,383,391,399,406,413,421,429,437,445,453,462,471,480,488,496,505,514],{"type":19,"tag":156,"props":376,"children":377},{"class":158,"line":159},[378],{"type":19,"tag":156,"props":379,"children":380},{},[381],{"type":24,"value":382},"@app.get(\"\u002Fhealth\")\n",{"type":19,"tag":156,"props":384,"children":385},{"class":158,"line":168},[386],{"type":19,"tag":156,"props":387,"children":388},{},[389],{"type":24,"value":390},"def health():\n",{"type":19,"tag":156,"props":392,"children":393},{"class":158,"line":178},[394],{"type":19,"tag":156,"props":395,"children":396},{},[397],{"type":24,"value":398},"    return {\"status\": \"ok\"}\n",{"type":19,"tag":156,"props":400,"children":401},{"class":158,"line":187},[402],{"type":19,"tag":156,"props":403,"children":404},{"emptyLinePlaceholder":172},[405],{"type":24,"value":175},{"type":19,"tag":156,"props":407,"children":408},{"class":158,"line":195},[409],{"type":19,"tag":156,"props":410,"children":411},{"emptyLinePlaceholder":172},[412],{"type":24,"value":175},{"type":19,"tag":156,"props":414,"children":415},{"class":158,"line":203},[416],{"type":19,"tag":156,"props":417,"children":418},{},[419],{"type":24,"value":420},"@app.post(\"\u002Fitems\")\n",{"type":19,"tag":156,"props":422,"children":423},{"class":158,"line":212},[424],{"type":19,"tag":156,"props":425,"children":426},{},[427],{"type":24,"value":428},"def create_item():\n",{"type":19,"tag":156,"props":430,"children":431},{"class":158,"line":221},[432],{"type":19,"tag":156,"props":433,"children":434},{},[435],{"type":24,"value":436},"    return {\"message\": \"created\"}\n",{"type":19,"tag":156,"props":438,"children":440},{"class":158,"line":439},9,[441],{"type":19,"tag":156,"props":442,"children":443},{"emptyLinePlaceholder":172},[444],{"type":24,"value":175},{"type":19,"tag":156,"props":446,"children":448},{"class":158,"line":447},10,[449],{"type":19,"tag":156,"props":450,"children":451},{"emptyLinePlaceholder":172},[452],{"type":24,"value":175},{"type":19,"tag":156,"props":454,"children":456},{"class":158,"line":455},11,[457],{"type":19,"tag":156,"props":458,"children":459},{},[460],{"type":24,"value":461},"@app.put(\"\u002Fitems\u002F{item_id}\")\n",{"type":19,"tag":156,"props":463,"children":465},{"class":158,"line":464},12,[466],{"type":19,"tag":156,"props":467,"children":468},{},[469],{"type":24,"value":470},"def update_item(item_id: int):\n",{"type":19,"tag":156,"props":472,"children":474},{"class":158,"line":473},13,[475],{"type":19,"tag":156,"props":476,"children":477},{},[478],{"type":24,"value":479},"    return {\"item_id\": item_id, \"message\": \"updated\"}\n",{"type":19,"tag":156,"props":481,"children":483},{"class":158,"line":482},14,[484],{"type":19,"tag":156,"props":485,"children":486},{"emptyLinePlaceholder":172},[487],{"type":24,"value":175},{"type":19,"tag":156,"props":489,"children":491},{"class":158,"line":490},15,[492],{"type":19,"tag":156,"props":493,"children":494},{"emptyLinePlaceholder":172},[495],{"type":24,"value":175},{"type":19,"tag":156,"props":497,"children":499},{"class":158,"line":498},16,[500],{"type":19,"tag":156,"props":501,"children":502},{},[503],{"type":24,"value":504},"@app.delete(\"\u002Fitems\u002F{item_id}\")\n",{"type":19,"tag":156,"props":506,"children":508},{"class":158,"line":507},17,[509],{"type":19,"tag":156,"props":510,"children":511},{},[512],{"type":24,"value":513},"def delete_item(item_id: int):\n",{"type":19,"tag":156,"props":515,"children":517},{"class":158,"line":516},18,[518],{"type":19,"tag":156,"props":519,"children":520},{},[521],{"type":24,"value":522},"    return {\"item_id\": item_id, \"message\": \"deleted\"}\n",{"type":19,"tag":20,"props":524,"children":525},{},[526],{"type":24,"value":527},"常见习惯：",{"type":19,"tag":43,"props":529,"children":530},{},[531,542,553,572],{"type":19,"tag":47,"props":532,"children":533},{},[534,540],{"type":19,"tag":83,"props":535,"children":537},{"className":536},[],[538],{"type":24,"value":539},"GET",{"type":24,"value":541},"：查询",{"type":19,"tag":47,"props":543,"children":544},{},[545,551],{"type":19,"tag":83,"props":546,"children":548},{"className":547},[],[549],{"type":24,"value":550},"POST",{"type":24,"value":552},"：创建或执行动作",{"type":19,"tag":47,"props":554,"children":555},{},[556,562,564,570],{"type":19,"tag":83,"props":557,"children":559},{"className":558},[],[560],{"type":24,"value":561},"PUT",{"type":24,"value":563}," \u002F ",{"type":19,"tag":83,"props":565,"children":567},{"className":566},[],[568],{"type":24,"value":569},"PATCH",{"type":24,"value":571},"：更新",{"type":19,"tag":47,"props":573,"children":574},{},[575,581],{"type":19,"tag":83,"props":576,"children":578},{"className":577},[],[579],{"type":24,"value":580},"DELETE",{"type":24,"value":582},"：删除",{"type":19,"tag":27,"props":584,"children":586},{"id":585},"_4-参数路径参数查询参数请求体",[587],{"type":19,"tag":32,"props":588,"children":589},{},[590],{"type":24,"value":591},"4. 参数：路径参数、查询参数、请求体",{"type":19,"tag":20,"props":593,"children":594},{},[595],{"type":24,"value":596},"路径参数来自 URL 中间(常用于查询单个 item)：",{"type":19,"tag":125,"props":598,"children":600},{"code":599,"language":149,"meta":7,"className":150,"style":7},"@app.get(\"\u002Fitems\u002F{item_id}\")\ndef get_item(item_id: int):\n    return {\"item_id\": item_id}\n",[601],{"type":19,"tag":83,"props":602,"children":603},{"__ignoreMap":7},[604,612,620],{"type":19,"tag":156,"props":605,"children":606},{"class":158,"line":159},[607],{"type":19,"tag":156,"props":608,"children":609},{},[610],{"type":24,"value":611},"@app.get(\"\u002Fitems\u002F{item_id}\")\n",{"type":19,"tag":156,"props":613,"children":614},{"class":158,"line":168},[615],{"type":19,"tag":156,"props":616,"children":617},{},[618],{"type":24,"value":619},"def get_item(item_id: int):\n",{"type":19,"tag":156,"props":621,"children":622},{"class":158,"line":178},[623],{"type":19,"tag":156,"props":624,"children":625},{},[626],{"type":24,"value":627},"    return {\"item_id\": item_id}\n",{"type":19,"tag":20,"props":629,"children":630},{},[631],{"type":24,"value":319},{"type":19,"tag":125,"props":633,"children":635},{"code":634,"language":24,"meta":7,"className":323,"style":7},"\u002Fitems\u002F123\n",[636],{"type":19,"tag":83,"props":637,"children":638},{"__ignoreMap":7},[639],{"type":19,"tag":156,"props":640,"children":641},{"class":158,"line":159},[642],{"type":19,"tag":156,"props":643,"children":644},{},[645],{"type":24,"value":634},{"type":19,"tag":20,"props":647,"children":648},{},[649,651,657,659,665,667,673],{"type":24,"value":650},"FastAPI 会自动把 ",{"type":19,"tag":83,"props":652,"children":654},{"className":653},[],[655],{"type":24,"value":656},"\"123\"",{"type":24,"value":658}," 转成 ",{"type":19,"tag":83,"props":660,"children":662},{"className":661},[],[663],{"type":24,"value":664},"int",{"type":24,"value":666},"。如果传 ",{"type":19,"tag":83,"props":668,"children":670},{"className":669},[],[671],{"type":24,"value":672},"\u002Fitems\u002Fabc",{"type":24,"value":674},"，会自动报参数错误。",{"type":19,"tag":20,"props":676,"children":677},{},[678,680,686],{"type":24,"value":679},"查询参数来自 ",{"type":19,"tag":83,"props":681,"children":683},{"className":682},[],[684],{"type":24,"value":685},"?",{"type":24,"value":687}," 后面(常用于查询 item 列表)：",{"type":19,"tag":125,"props":689,"children":691},{"code":690,"language":149,"meta":7,"className":150,"style":7},"@app.get(\"\u002Fsearch\")\ndef search(q: str, limit: int = 10):\n    return {\"q\": q, \"limit\": limit}\n",[692],{"type":19,"tag":83,"props":693,"children":694},{"__ignoreMap":7},[695,703,711],{"type":19,"tag":156,"props":696,"children":697},{"class":158,"line":159},[698],{"type":19,"tag":156,"props":699,"children":700},{},[701],{"type":24,"value":702},"@app.get(\"\u002Fsearch\")\n",{"type":19,"tag":156,"props":704,"children":705},{"class":158,"line":168},[706],{"type":19,"tag":156,"props":707,"children":708},{},[709],{"type":24,"value":710},"def search(q: str, limit: int = 10):\n",{"type":19,"tag":156,"props":712,"children":713},{"class":158,"line":178},[714],{"type":19,"tag":156,"props":715,"children":716},{},[717],{"type":24,"value":718},"    return {\"q\": q, \"limit\": limit}\n",{"type":19,"tag":20,"props":720,"children":721},{},[722],{"type":24,"value":319},{"type":19,"tag":125,"props":724,"children":726},{"code":725,"language":24,"meta":7,"className":323,"style":7},"\u002Fsearch?q=aspirin&limit=5\n",[727],{"type":19,"tag":83,"props":728,"children":729},{"__ignoreMap":7},[730],{"type":19,"tag":156,"props":731,"children":732},{"class":158,"line":159},[733],{"type":19,"tag":156,"props":734,"children":735},{},[736],{"type":24,"value":725},{"type":19,"tag":20,"props":738,"children":739},{},[740,742,747,749,756],{"type":24,"value":741},"请求体一般用于 ",{"type":19,"tag":83,"props":743,"children":745},{"className":744},[],[746],{"type":24,"value":550},{"type":24,"value":748},"，用 Pydantic 模型声明。官方文档也强调，Pydantic 模型会被 FastAPI 识别为 request body。参考：",{"type":19,"tag":100,"props":750,"children":753},{"href":751,"rel":752},"https:\u002F\u002Ffastapi.tiangolo.com\u002Ftutorial\u002Fbody\u002F",[104],[754],{"type":24,"value":755},"FastAPI Request Body",{"type":24,"value":109},{"type":19,"tag":125,"props":758,"children":760},{"code":759,"language":149,"meta":7,"className":150,"style":7},"from pydantic import BaseModel\n\n\nclass MoleculeRequest(BaseModel):\n    smiles: str\n    name: str | None = None\n\n\n@app.post(\"\u002Fmolecules\")\ndef create_molecule(data: MoleculeRequest):\n    return {\n        \"smiles\": data.smiles,\n        \"name\": data.name,\n    }\n",[761],{"type":19,"tag":83,"props":762,"children":763},{"__ignoreMap":7},[764,772,779,786,794,802,810,817,824,832,840,848,856,864],{"type":19,"tag":156,"props":765,"children":766},{"class":158,"line":159},[767],{"type":19,"tag":156,"props":768,"children":769},{},[770],{"type":24,"value":771},"from pydantic import BaseModel\n",{"type":19,"tag":156,"props":773,"children":774},{"class":158,"line":168},[775],{"type":19,"tag":156,"props":776,"children":777},{"emptyLinePlaceholder":172},[778],{"type":24,"value":175},{"type":19,"tag":156,"props":780,"children":781},{"class":158,"line":178},[782],{"type":19,"tag":156,"props":783,"children":784},{"emptyLinePlaceholder":172},[785],{"type":24,"value":175},{"type":19,"tag":156,"props":787,"children":788},{"class":158,"line":187},[789],{"type":19,"tag":156,"props":790,"children":791},{},[792],{"type":24,"value":793},"class MoleculeRequest(BaseModel):\n",{"type":19,"tag":156,"props":795,"children":796},{"class":158,"line":195},[797],{"type":19,"tag":156,"props":798,"children":799},{},[800],{"type":24,"value":801},"    smiles: str\n",{"type":19,"tag":156,"props":803,"children":804},{"class":158,"line":203},[805],{"type":19,"tag":156,"props":806,"children":807},{},[808],{"type":24,"value":809},"    name: str | None = None\n",{"type":19,"tag":156,"props":811,"children":812},{"class":158,"line":212},[813],{"type":19,"tag":156,"props":814,"children":815},{"emptyLinePlaceholder":172},[816],{"type":24,"value":175},{"type":19,"tag":156,"props":818,"children":819},{"class":158,"line":221},[820],{"type":19,"tag":156,"props":821,"children":822},{"emptyLinePlaceholder":172},[823],{"type":24,"value":175},{"type":19,"tag":156,"props":825,"children":826},{"class":158,"line":439},[827],{"type":19,"tag":156,"props":828,"children":829},{},[830],{"type":24,"value":831},"@app.post(\"\u002Fmolecules\")\n",{"type":19,"tag":156,"props":833,"children":834},{"class":158,"line":447},[835],{"type":19,"tag":156,"props":836,"children":837},{},[838],{"type":24,"value":839},"def create_molecule(data: MoleculeRequest):\n",{"type":19,"tag":156,"props":841,"children":842},{"class":158,"line":455},[843],{"type":19,"tag":156,"props":844,"children":845},{},[846],{"type":24,"value":847},"    return {\n",{"type":19,"tag":156,"props":849,"children":850},{"class":158,"line":464},[851],{"type":19,"tag":156,"props":852,"children":853},{},[854],{"type":24,"value":855},"        \"smiles\": data.smiles,\n",{"type":19,"tag":156,"props":857,"children":858},{"class":158,"line":473},[859],{"type":19,"tag":156,"props":860,"children":861},{},[862],{"type":24,"value":863},"        \"name\": data.name,\n",{"type":19,"tag":156,"props":865,"children":866},{"class":158,"line":482},[867],{"type":19,"tag":156,"props":868,"children":869},{},[870],{"type":24,"value":871},"    }\n",{"type":19,"tag":20,"props":873,"children":874},{},[875],{"type":24,"value":876},"请求 JSON：",{"type":19,"tag":125,"props":878,"children":882},{"code":879,"language":880,"meta":7,"className":881,"style":7},"{\n  \"smiles\": \"CCO\",\n  \"name\": \"ethanol\"\n}\n","json","language-json shiki shiki-themes github-dark",[883],{"type":19,"tag":83,"props":884,"children":885},{"__ignoreMap":7},[886,895,918,935],{"type":19,"tag":156,"props":887,"children":888},{"class":158,"line":159},[889],{"type":19,"tag":156,"props":890,"children":892},{"style":891},"--shiki-default:#E1E4E8",[893],{"type":24,"value":894},"{\n",{"type":19,"tag":156,"props":896,"children":897},{"class":158,"line":168},[898,903,908,913],{"type":19,"tag":156,"props":899,"children":900},{"style":259},[901],{"type":24,"value":902},"  \"smiles\"",{"type":19,"tag":156,"props":904,"children":905},{"style":891},[906],{"type":24,"value":907},": ",{"type":19,"tag":156,"props":909,"children":910},{"style":253},[911],{"type":24,"value":912},"\"CCO\"",{"type":19,"tag":156,"props":914,"children":915},{"style":891},[916],{"type":24,"value":917},",\n",{"type":19,"tag":156,"props":919,"children":920},{"class":158,"line":178},[921,926,930],{"type":19,"tag":156,"props":922,"children":923},{"style":259},[924],{"type":24,"value":925},"  \"name\"",{"type":19,"tag":156,"props":927,"children":928},{"style":891},[929],{"type":24,"value":907},{"type":19,"tag":156,"props":931,"children":932},{"style":253},[933],{"type":24,"value":934},"\"ethanol\"\n",{"type":19,"tag":156,"props":936,"children":937},{"class":158,"line":187},[938],{"type":19,"tag":156,"props":939,"children":940},{"style":891},[941],{"type":24,"value":942},"}\n",{"type":19,"tag":27,"props":944,"children":946},{"id":945},"_5-返回-json",[947],{"type":19,"tag":32,"props":948,"children":949},{},[950],{"type":24,"value":951},"5. 返回 JSON",{"type":19,"tag":20,"props":953,"children":954},{},[955,957,963,965,971],{"type":24,"value":956},"你直接返回 ",{"type":19,"tag":83,"props":958,"children":960},{"className":959},[],[961],{"type":24,"value":962},"dict",{"type":24,"value":964},"、",{"type":19,"tag":83,"props":966,"children":968},{"className":967},[],[969],{"type":24,"value":970},"list",{"type":24,"value":972},"、Pydantic model，FastAPI 会自动转成 JSON：",{"type":19,"tag":125,"props":974,"children":976},{"code":975,"language":149,"meta":7,"className":150,"style":7},"@app.get(\"\u002Fmolecules\")\ndef list_molecules():\n    return [\n        {\"name\": \"ethanol\", \"smiles\": \"CCO\"},\n        {\"name\": \"aspirin\", \"smiles\": \"CC(=O)Oc1ccccc1C(=O)O\"},\n    ]\n",[977],{"type":19,"tag":83,"props":978,"children":979},{"__ignoreMap":7},[980,988,996,1004,1012,1020],{"type":19,"tag":156,"props":981,"children":982},{"class":158,"line":159},[983],{"type":19,"tag":156,"props":984,"children":985},{},[986],{"type":24,"value":987},"@app.get(\"\u002Fmolecules\")\n",{"type":19,"tag":156,"props":989,"children":990},{"class":158,"line":168},[991],{"type":19,"tag":156,"props":992,"children":993},{},[994],{"type":24,"value":995},"def list_molecules():\n",{"type":19,"tag":156,"props":997,"children":998},{"class":158,"line":178},[999],{"type":19,"tag":156,"props":1000,"children":1001},{},[1002],{"type":24,"value":1003},"    return [\n",{"type":19,"tag":156,"props":1005,"children":1006},{"class":158,"line":187},[1007],{"type":19,"tag":156,"props":1008,"children":1009},{},[1010],{"type":24,"value":1011},"        {\"name\": \"ethanol\", \"smiles\": \"CCO\"},\n",{"type":19,"tag":156,"props":1013,"children":1014},{"class":158,"line":195},[1015],{"type":19,"tag":156,"props":1016,"children":1017},{},[1018],{"type":24,"value":1019},"        {\"name\": \"aspirin\", \"smiles\": \"CC(=O)Oc1ccccc1C(=O)O\"},\n",{"type":19,"tag":156,"props":1021,"children":1022},{"class":158,"line":203},[1023],{"type":19,"tag":156,"props":1024,"children":1025},{},[1026],{"type":24,"value":1027},"    ]\n",{"type":19,"tag":27,"props":1029,"children":1031},{"id":1030},"_6-主动返回错误",[1032],{"type":19,"tag":32,"props":1033,"children":1034},{},[1035],{"type":24,"value":1036},"6. 主动返回错误",{"type":19,"tag":20,"props":1038,"children":1039},{},[1040,1042,1048,1050,1056],{"type":24,"value":1041},"接口里不要用普通 ",{"type":19,"tag":83,"props":1043,"children":1045},{"className":1044},[],[1046],{"type":24,"value":1047},"return {\"error\": ...}",{"type":24,"value":1049}," 混过去，应该用 ",{"type":19,"tag":83,"props":1051,"children":1053},{"className":1052},[],[1054],{"type":24,"value":1055},"HTTPException",{"type":24,"value":145},{"type":19,"tag":125,"props":1058,"children":1060},{"code":1059,"language":149,"meta":7,"className":150,"style":7},"from fastapi import HTTPException\n\n\n@app.get(\"\u002Fmolecules\u002F{molecule_id}\")\ndef get_molecule(molecule_id: int):\n    if molecule_id \u003C= 0:\n        raise HTTPException(status_code=400, detail=\"molecule_id must be positive\")\n\n    return {\"id\": molecule_id}\n",[1061],{"type":19,"tag":83,"props":1062,"children":1063},{"__ignoreMap":7},[1064,1072,1079,1086,1094,1102,1110,1118,1125],{"type":19,"tag":156,"props":1065,"children":1066},{"class":158,"line":159},[1067],{"type":19,"tag":156,"props":1068,"children":1069},{},[1070],{"type":24,"value":1071},"from fastapi import HTTPException\n",{"type":19,"tag":156,"props":1073,"children":1074},{"class":158,"line":168},[1075],{"type":19,"tag":156,"props":1076,"children":1077},{"emptyLinePlaceholder":172},[1078],{"type":24,"value":175},{"type":19,"tag":156,"props":1080,"children":1081},{"class":158,"line":178},[1082],{"type":19,"tag":156,"props":1083,"children":1084},{"emptyLinePlaceholder":172},[1085],{"type":24,"value":175},{"type":19,"tag":156,"props":1087,"children":1088},{"class":158,"line":187},[1089],{"type":19,"tag":156,"props":1090,"children":1091},{},[1092],{"type":24,"value":1093},"@app.get(\"\u002Fmolecules\u002F{molecule_id}\")\n",{"type":19,"tag":156,"props":1095,"children":1096},{"class":158,"line":195},[1097],{"type":19,"tag":156,"props":1098,"children":1099},{},[1100],{"type":24,"value":1101},"def get_molecule(molecule_id: int):\n",{"type":19,"tag":156,"props":1103,"children":1104},{"class":158,"line":203},[1105],{"type":19,"tag":156,"props":1106,"children":1107},{},[1108],{"type":24,"value":1109},"    if molecule_id \u003C= 0:\n",{"type":19,"tag":156,"props":1111,"children":1112},{"class":158,"line":212},[1113],{"type":19,"tag":156,"props":1114,"children":1115},{},[1116],{"type":24,"value":1117},"        raise HTTPException(status_code=400, detail=\"molecule_id must be positive\")\n",{"type":19,"tag":156,"props":1119,"children":1120},{"class":158,"line":221},[1121],{"type":19,"tag":156,"props":1122,"children":1123},{"emptyLinePlaceholder":172},[1124],{"type":24,"value":175},{"type":19,"tag":156,"props":1126,"children":1127},{"class":158,"line":439},[1128],{"type":19,"tag":156,"props":1129,"children":1130},{},[1131],{"type":24,"value":1132},"    return {\"id\": molecule_id}\n",{"type":19,"tag":20,"props":1134,"children":1135},{},[1136],{"type":24,"value":1137},"常见状态码：",{"type":19,"tag":43,"props":1139,"children":1140},{},[1141,1152,1163,1174,1185,1196,1207],{"type":19,"tag":47,"props":1142,"children":1143},{},[1144,1150],{"type":19,"tag":83,"props":1145,"children":1147},{"className":1146},[],[1148],{"type":24,"value":1149},"200",{"type":24,"value":1151},"：成功",{"type":19,"tag":47,"props":1153,"children":1154},{},[1155,1161],{"type":19,"tag":83,"props":1156,"children":1158},{"className":1157},[],[1159],{"type":24,"value":1160},"201",{"type":24,"value":1162},"：创建成功",{"type":19,"tag":47,"props":1164,"children":1165},{},[1166,1172],{"type":19,"tag":83,"props":1167,"children":1169},{"className":1168},[],[1170],{"type":24,"value":1171},"400",{"type":24,"value":1173},"：请求参数不合法",{"type":19,"tag":47,"props":1175,"children":1176},{},[1177,1183],{"type":19,"tag":83,"props":1178,"children":1180},{"className":1179},[],[1181],{"type":24,"value":1182},"401",{"type":24,"value":1184},"：未登录",{"type":19,"tag":47,"props":1186,"children":1187},{},[1188,1194],{"type":19,"tag":83,"props":1189,"children":1191},{"className":1190},[],[1192],{"type":24,"value":1193},"403",{"type":24,"value":1195},"：无权限",{"type":19,"tag":47,"props":1197,"children":1198},{},[1199,1205],{"type":19,"tag":83,"props":1200,"children":1202},{"className":1201},[],[1203],{"type":24,"value":1204},"404",{"type":24,"value":1206},"：资源不存在",{"type":19,"tag":47,"props":1208,"children":1209},{},[1210,1216],{"type":19,"tag":83,"props":1211,"children":1213},{"className":1212},[],[1214],{"type":24,"value":1215},"500",{"type":24,"value":1217},"：服务端错误",{"type":19,"tag":27,"props":1219,"children":1221},{"id":1220},"_7-async-和普通-def",[1222],{"type":19,"tag":32,"props":1223,"children":1224},{},[1225],{"type":24,"value":1226},"7. async 和普通 def",{"type":19,"tag":20,"props":1228,"children":1229},{},[1230],{"type":24,"value":1231},"两种都能写：",{"type":19,"tag":125,"props":1233,"children":1235},{"code":1234,"language":149,"meta":7,"className":150,"style":7},"@app.get(\"\u002Fsync\")\ndef sync_api():\n    return {\"mode\": \"sync\"}\n\n\n@app.get(\"\u002Fasync\")\nasync def async_api():\n    return {\"mode\": \"async\"}\n",[1236],{"type":19,"tag":83,"props":1237,"children":1238},{"__ignoreMap":7},[1239,1247,1255,1263,1270,1277,1285,1293],{"type":19,"tag":156,"props":1240,"children":1241},{"class":158,"line":159},[1242],{"type":19,"tag":156,"props":1243,"children":1244},{},[1245],{"type":24,"value":1246},"@app.get(\"\u002Fsync\")\n",{"type":19,"tag":156,"props":1248,"children":1249},{"class":158,"line":168},[1250],{"type":19,"tag":156,"props":1251,"children":1252},{},[1253],{"type":24,"value":1254},"def sync_api():\n",{"type":19,"tag":156,"props":1256,"children":1257},{"class":158,"line":178},[1258],{"type":19,"tag":156,"props":1259,"children":1260},{},[1261],{"type":24,"value":1262},"    return {\"mode\": \"sync\"}\n",{"type":19,"tag":156,"props":1264,"children":1265},{"class":158,"line":187},[1266],{"type":19,"tag":156,"props":1267,"children":1268},{"emptyLinePlaceholder":172},[1269],{"type":24,"value":175},{"type":19,"tag":156,"props":1271,"children":1272},{"class":158,"line":195},[1273],{"type":19,"tag":156,"props":1274,"children":1275},{"emptyLinePlaceholder":172},[1276],{"type":24,"value":175},{"type":19,"tag":156,"props":1278,"children":1279},{"class":158,"line":203},[1280],{"type":19,"tag":156,"props":1281,"children":1282},{},[1283],{"type":24,"value":1284},"@app.get(\"\u002Fasync\")\n",{"type":19,"tag":156,"props":1286,"children":1287},{"class":158,"line":212},[1288],{"type":19,"tag":156,"props":1289,"children":1290},{},[1291],{"type":24,"value":1292},"async def async_api():\n",{"type":19,"tag":156,"props":1294,"children":1295},{"class":158,"line":221},[1296],{"type":19,"tag":156,"props":1297,"children":1298},{},[1299],{"type":24,"value":1300},"    return {\"mode\": \"async\"}\n",{"type":19,"tag":20,"props":1302,"children":1303},{},[1304],{"type":24,"value":1305},"简单理解：",{"type":19,"tag":43,"props":1307,"children":1308},{},[1309,1320],{"type":19,"tag":47,"props":1310,"children":1311},{},[1312,1314],{"type":24,"value":1313},"普通计算、调用同步库：用 ",{"type":19,"tag":83,"props":1315,"children":1317},{"className":1316},[],[1318],{"type":24,"value":1319},"def",{"type":19,"tag":47,"props":1321,"children":1322},{},[1323,1325],{"type":24,"value":1324},"调数据库、HTTP 请求、文件 IO，并且库支持 async：用 ",{"type":19,"tag":83,"props":1326,"children":1328},{"className":1327},[],[1329],{"type":24,"value":1330},"async def",{"type":19,"tag":20,"props":1332,"children":1333},{},[1334,1336,1341,1343,1349],{"type":24,"value":1335},"初学阶段先用 ",{"type":19,"tag":83,"props":1337,"children":1339},{"className":1338},[],[1340],{"type":24,"value":1319},{"type":24,"value":1342}," 就够了，别为了“看起来高级”乱用 ",{"type":19,"tag":83,"props":1344,"children":1346},{"className":1345},[],[1347],{"type":24,"value":1348},"async",{"type":24,"value":109},{"type":19,"tag":27,"props":1351,"children":1353},{"id":1352},"一个完整基础例子",[1354],{"type":19,"tag":32,"props":1355,"children":1356},{},[1357],{"type":24,"value":1352},{"type":19,"tag":125,"props":1359,"children":1361},{"code":1360,"language":149,"meta":7,"className":150,"style":7},"from fastapi import FastAPI, HTTPException\nfrom pydantic import BaseModel, Field\n\napp = FastAPI(title=\"Drug Discovery API\")\n\n\nclass SmilesRequest(BaseModel):\n    smiles: str = Field(min_length=1)\n\n\n@app.get(\"\u002Fhealth\")\ndef health():\n    return {\"status\": \"ok\"}\n\n\n@app.get(\"\u002Fmolecules\u002F{molecule_id}\")\ndef get_molecule(molecule_id: int):\n    if molecule_id \u003C= 0:\n        raise HTTPException(status_code=400, detail=\"molecule_id must be positive\")\n\n    return {\n        \"id\": molecule_id,\n        \"name\": \"ethanol\",\n        \"smiles\": \"CCO\",\n    }\n\n\n@app.get(\"\u002Fsearch\")\ndef search_molecules(q: str, limit: int = 10):\n    return {\n        \"query\": q,\n        \"limit\": limit,\n        \"results\": [],\n    }\n\n\n@app.post(\"\u002Fsmiles\u002Fvalidate\")\ndef validate_smiles(data: SmilesRequest):\n    is_valid = data.smiles.strip() != \"\"\n\n    return {\n        \"smiles\": data.smiles,\n        \"is_valid\": is_valid,\n    }\n",[1362],{"type":19,"tag":83,"props":1363,"children":1364},{"__ignoreMap":7},[1365,1373,1381,1388,1396,1403,1410,1418,1426,1433,1440,1447,1454,1461,1468,1475,1482,1489,1496,1504,1512,1520,1529,1538,1547,1555,1563,1571,1579,1588,1596,1605,1614,1623,1631,1639,1647,1656,1665,1674,1682,1690,1698,1707],{"type":19,"tag":156,"props":1366,"children":1367},{"class":158,"line":159},[1368],{"type":19,"tag":156,"props":1369,"children":1370},{},[1371],{"type":24,"value":1372},"from fastapi import FastAPI, HTTPException\n",{"type":19,"tag":156,"props":1374,"children":1375},{"class":158,"line":168},[1376],{"type":19,"tag":156,"props":1377,"children":1378},{},[1379],{"type":24,"value":1380},"from pydantic import BaseModel, Field\n",{"type":19,"tag":156,"props":1382,"children":1383},{"class":158,"line":178},[1384],{"type":19,"tag":156,"props":1385,"children":1386},{"emptyLinePlaceholder":172},[1387],{"type":24,"value":175},{"type":19,"tag":156,"props":1389,"children":1390},{"class":158,"line":187},[1391],{"type":19,"tag":156,"props":1392,"children":1393},{},[1394],{"type":24,"value":1395},"app = FastAPI(title=\"Drug Discovery API\")\n",{"type":19,"tag":156,"props":1397,"children":1398},{"class":158,"line":195},[1399],{"type":19,"tag":156,"props":1400,"children":1401},{"emptyLinePlaceholder":172},[1402],{"type":24,"value":175},{"type":19,"tag":156,"props":1404,"children":1405},{"class":158,"line":203},[1406],{"type":19,"tag":156,"props":1407,"children":1408},{"emptyLinePlaceholder":172},[1409],{"type":24,"value":175},{"type":19,"tag":156,"props":1411,"children":1412},{"class":158,"line":212},[1413],{"type":19,"tag":156,"props":1414,"children":1415},{},[1416],{"type":24,"value":1417},"class SmilesRequest(BaseModel):\n",{"type":19,"tag":156,"props":1419,"children":1420},{"class":158,"line":221},[1421],{"type":19,"tag":156,"props":1422,"children":1423},{},[1424],{"type":24,"value":1425},"    smiles: str = Field(min_length=1)\n",{"type":19,"tag":156,"props":1427,"children":1428},{"class":158,"line":439},[1429],{"type":19,"tag":156,"props":1430,"children":1431},{"emptyLinePlaceholder":172},[1432],{"type":24,"value":175},{"type":19,"tag":156,"props":1434,"children":1435},{"class":158,"line":447},[1436],{"type":19,"tag":156,"props":1437,"children":1438},{"emptyLinePlaceholder":172},[1439],{"type":24,"value":175},{"type":19,"tag":156,"props":1441,"children":1442},{"class":158,"line":455},[1443],{"type":19,"tag":156,"props":1444,"children":1445},{},[1446],{"type":24,"value":382},{"type":19,"tag":156,"props":1448,"children":1449},{"class":158,"line":464},[1450],{"type":19,"tag":156,"props":1451,"children":1452},{},[1453],{"type":24,"value":390},{"type":19,"tag":156,"props":1455,"children":1456},{"class":158,"line":473},[1457],{"type":19,"tag":156,"props":1458,"children":1459},{},[1460],{"type":24,"value":398},{"type":19,"tag":156,"props":1462,"children":1463},{"class":158,"line":482},[1464],{"type":19,"tag":156,"props":1465,"children":1466},{"emptyLinePlaceholder":172},[1467],{"type":24,"value":175},{"type":19,"tag":156,"props":1469,"children":1470},{"class":158,"line":490},[1471],{"type":19,"tag":156,"props":1472,"children":1473},{"emptyLinePlaceholder":172},[1474],{"type":24,"value":175},{"type":19,"tag":156,"props":1476,"children":1477},{"class":158,"line":498},[1478],{"type":19,"tag":156,"props":1479,"children":1480},{},[1481],{"type":24,"value":1093},{"type":19,"tag":156,"props":1483,"children":1484},{"class":158,"line":507},[1485],{"type":19,"tag":156,"props":1486,"children":1487},{},[1488],{"type":24,"value":1101},{"type":19,"tag":156,"props":1490,"children":1491},{"class":158,"line":516},[1492],{"type":19,"tag":156,"props":1493,"children":1494},{},[1495],{"type":24,"value":1109},{"type":19,"tag":156,"props":1497,"children":1499},{"class":158,"line":1498},19,[1500],{"type":19,"tag":156,"props":1501,"children":1502},{},[1503],{"type":24,"value":1117},{"type":19,"tag":156,"props":1505,"children":1507},{"class":158,"line":1506},20,[1508],{"type":19,"tag":156,"props":1509,"children":1510},{"emptyLinePlaceholder":172},[1511],{"type":24,"value":175},{"type":19,"tag":156,"props":1513,"children":1515},{"class":158,"line":1514},21,[1516],{"type":19,"tag":156,"props":1517,"children":1518},{},[1519],{"type":24,"value":847},{"type":19,"tag":156,"props":1521,"children":1523},{"class":158,"line":1522},22,[1524],{"type":19,"tag":156,"props":1525,"children":1526},{},[1527],{"type":24,"value":1528},"        \"id\": molecule_id,\n",{"type":19,"tag":156,"props":1530,"children":1532},{"class":158,"line":1531},23,[1533],{"type":19,"tag":156,"props":1534,"children":1535},{},[1536],{"type":24,"value":1537},"        \"name\": \"ethanol\",\n",{"type":19,"tag":156,"props":1539,"children":1541},{"class":158,"line":1540},24,[1542],{"type":19,"tag":156,"props":1543,"children":1544},{},[1545],{"type":24,"value":1546},"        \"smiles\": \"CCO\",\n",{"type":19,"tag":156,"props":1548,"children":1550},{"class":158,"line":1549},25,[1551],{"type":19,"tag":156,"props":1552,"children":1553},{},[1554],{"type":24,"value":871},{"type":19,"tag":156,"props":1556,"children":1558},{"class":158,"line":1557},26,[1559],{"type":19,"tag":156,"props":1560,"children":1561},{"emptyLinePlaceholder":172},[1562],{"type":24,"value":175},{"type":19,"tag":156,"props":1564,"children":1566},{"class":158,"line":1565},27,[1567],{"type":19,"tag":156,"props":1568,"children":1569},{"emptyLinePlaceholder":172},[1570],{"type":24,"value":175},{"type":19,"tag":156,"props":1572,"children":1574},{"class":158,"line":1573},28,[1575],{"type":19,"tag":156,"props":1576,"children":1577},{},[1578],{"type":24,"value":702},{"type":19,"tag":156,"props":1580,"children":1582},{"class":158,"line":1581},29,[1583],{"type":19,"tag":156,"props":1584,"children":1585},{},[1586],{"type":24,"value":1587},"def search_molecules(q: str, limit: int = 10):\n",{"type":19,"tag":156,"props":1589,"children":1591},{"class":158,"line":1590},30,[1592],{"type":19,"tag":156,"props":1593,"children":1594},{},[1595],{"type":24,"value":847},{"type":19,"tag":156,"props":1597,"children":1599},{"class":158,"line":1598},31,[1600],{"type":19,"tag":156,"props":1601,"children":1602},{},[1603],{"type":24,"value":1604},"        \"query\": q,\n",{"type":19,"tag":156,"props":1606,"children":1608},{"class":158,"line":1607},32,[1609],{"type":19,"tag":156,"props":1610,"children":1611},{},[1612],{"type":24,"value":1613},"        \"limit\": limit,\n",{"type":19,"tag":156,"props":1615,"children":1617},{"class":158,"line":1616},33,[1618],{"type":19,"tag":156,"props":1619,"children":1620},{},[1621],{"type":24,"value":1622},"        \"results\": [],\n",{"type":19,"tag":156,"props":1624,"children":1626},{"class":158,"line":1625},34,[1627],{"type":19,"tag":156,"props":1628,"children":1629},{},[1630],{"type":24,"value":871},{"type":19,"tag":156,"props":1632,"children":1634},{"class":158,"line":1633},35,[1635],{"type":19,"tag":156,"props":1636,"children":1637},{"emptyLinePlaceholder":172},[1638],{"type":24,"value":175},{"type":19,"tag":156,"props":1640,"children":1642},{"class":158,"line":1641},36,[1643],{"type":19,"tag":156,"props":1644,"children":1645},{"emptyLinePlaceholder":172},[1646],{"type":24,"value":175},{"type":19,"tag":156,"props":1648,"children":1650},{"class":158,"line":1649},37,[1651],{"type":19,"tag":156,"props":1652,"children":1653},{},[1654],{"type":24,"value":1655},"@app.post(\"\u002Fsmiles\u002Fvalidate\")\n",{"type":19,"tag":156,"props":1657,"children":1659},{"class":158,"line":1658},38,[1660],{"type":19,"tag":156,"props":1661,"children":1662},{},[1663],{"type":24,"value":1664},"def validate_smiles(data: SmilesRequest):\n",{"type":19,"tag":156,"props":1666,"children":1668},{"class":158,"line":1667},39,[1669],{"type":19,"tag":156,"props":1670,"children":1671},{},[1672],{"type":24,"value":1673},"    is_valid = data.smiles.strip() != \"\"\n",{"type":19,"tag":156,"props":1675,"children":1677},{"class":158,"line":1676},40,[1678],{"type":19,"tag":156,"props":1679,"children":1680},{"emptyLinePlaceholder":172},[1681],{"type":24,"value":175},{"type":19,"tag":156,"props":1683,"children":1685},{"class":158,"line":1684},41,[1686],{"type":19,"tag":156,"props":1687,"children":1688},{},[1689],{"type":24,"value":847},{"type":19,"tag":156,"props":1691,"children":1693},{"class":158,"line":1692},42,[1694],{"type":19,"tag":156,"props":1695,"children":1696},{},[1697],{"type":24,"value":855},{"type":19,"tag":156,"props":1699,"children":1701},{"class":158,"line":1700},43,[1702],{"type":19,"tag":156,"props":1703,"children":1704},{},[1705],{"type":24,"value":1706},"        \"is_valid\": is_valid,\n",{"type":19,"tag":156,"props":1708,"children":1710},{"class":158,"line":1709},44,[1711],{"type":19,"tag":156,"props":1712,"children":1713},{},[1714],{"type":24,"value":871},{"type":19,"tag":20,"props":1716,"children":1717},{},[1718],{"type":24,"value":1719},"你现在只需要掌握这条主线：",{"type":19,"tag":125,"props":1721,"children":1723},{"code":1722,"language":24,"meta":7,"className":323,"style":7},"定义 app\n-> 写路由\n-> 声明参数\n-> 用 Pydantic 接 JSON\n-> 返回 dict\n-> 用 HTTPException 报错\n-> 去 \u002Fdocs 测试\n",[1724],{"type":19,"tag":83,"props":1725,"children":1726},{"__ignoreMap":7},[1727,1735,1743,1751,1759,1767,1775],{"type":19,"tag":156,"props":1728,"children":1729},{"class":158,"line":159},[1730],{"type":19,"tag":156,"props":1731,"children":1732},{},[1733],{"type":24,"value":1734},"定义 app\n",{"type":19,"tag":156,"props":1736,"children":1737},{"class":158,"line":168},[1738],{"type":19,"tag":156,"props":1739,"children":1740},{},[1741],{"type":24,"value":1742},"-> 写路由\n",{"type":19,"tag":156,"props":1744,"children":1745},{"class":158,"line":178},[1746],{"type":19,"tag":156,"props":1747,"children":1748},{},[1749],{"type":24,"value":1750},"-> 声明参数\n",{"type":19,"tag":156,"props":1752,"children":1753},{"class":158,"line":187},[1754],{"type":19,"tag":156,"props":1755,"children":1756},{},[1757],{"type":24,"value":1758},"-> 用 Pydantic 接 JSON\n",{"type":19,"tag":156,"props":1760,"children":1761},{"class":158,"line":195},[1762],{"type":19,"tag":156,"props":1763,"children":1764},{},[1765],{"type":24,"value":1766},"-> 返回 dict\n",{"type":19,"tag":156,"props":1768,"children":1769},{"class":158,"line":203},[1770],{"type":19,"tag":156,"props":1771,"children":1772},{},[1773],{"type":24,"value":1774},"-> 用 HTTPException 报错\n",{"type":19,"tag":156,"props":1776,"children":1777},{"class":158,"line":212},[1778],{"type":19,"tag":156,"props":1779,"children":1780},{},[1781],{"type":24,"value":1782},"-> 去 \u002Fdocs 测试\n",{"type":19,"tag":1784,"props":1785,"children":1786},"style",{},[1787],{"type":24,"value":1788},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":168,"depth":168,"links":1790},[1791,1792,1793,1794,1795,1796,1797,1798],{"id":29,"depth":178,"text":36},{"id":112,"depth":178,"text":118},{"id":356,"depth":178,"text":362},{"id":585,"depth":178,"text":591},{"id":945,"depth":178,"text":951},{"id":1030,"depth":178,"text":1036},{"id":1220,"depth":178,"text":1226},{"id":1352,"depth":178,"text":1352},"markdown","content:articles:backend:FastAPI.md","content","articles\u002Fbackend\u002FFastAPI.md","articles\u002Fbackend\u002FFastAPI","md",1779811687793]