{"id":325,"date":"2026-07-08T15:21:26","date_gmt":"2026-07-08T07:21:26","guid":{"rendered":"https:\/\/numsimlab.com\/?p=325"},"modified":"2026-07-08T15:21:26","modified_gmt":"2026-07-08T07:21:26","slug":"python%e5%90%8e%e7%ab%af%e5%88%86%e5%b1%82%e6%9e%b6%e6%9e%84%e9%9b%b6%e5%9f%ba%e7%a1%80%e6%95%99%e7%a8%8b","status":"publish","type":"post","link":"https:\/\/numsimlab.com\/?p=325","title":{"rendered":"Python\u540e\u7aef\u5206\u5c42\u67b6\u6784\u96f6\u57fa\u7840\u6559\u7a0b"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Python\u540e\u7aef\u5206\u5c42\u67b6\u6784\u96f6\u57fa\u7840\u6559\u7a0b \u00b7 Python Backend Architecture Guide<\/title>\n<style>\n*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}\nhtml{scroll-behavior:smooth}\n:root{\n  --bg:#f8f9fa;--bg2:#fff;--ink:#1a1a2e;--muted:#6c7086;--rule:#e2e4eb;\n  --accent:#2563eb;--accent2:#16a34a;--accent3:#dc2626;--accent4:#d97706;--accent5:#7c3aed;\n  --card-bg:#fff;--code-bg:#f1f3f5;\n  --tag-g:#dcfce7;--tag-g-t:#166534;--tag-b:#dbeafe;--tag-b-t:#1e40af;\n  --tag-r:#fee2e2;--tag-r-t:#991b1b;--tag-y:#fef9c3;--tag-y-t:#713f12;--tag-p:#f3e8ff;--tag-p-t:#581c87;\n  --shadow:0 1px 3px rgba(0,0,0,.08);--radius:8px;--max-w:940px\n}\n[data-theme=\"dark\"]{\n  --bg:#0b0b1a;--bg2:#16162a;--ink:#e2e4f0;--muted:#7f8396;--rule:#26263e;\n  --accent:#60a5fa;--accent2:#4ade80;--accent3:#f87171;--accent4:#fbbf24;--accent5:#a78bfa;\n  --card-bg:#16162a;--code-bg:#1e1e36;\n  --tag-g:#14532d;--tag-g-t:#bbf7d0;--tag-b:#1e3a5f;--tag-b-t:#bfdbfe;\n  --tag-r:#7f1d1d;--tag-r-t:#fecaca;--tag-y:#713f12;--tag-y-t:#fef08a;\n  --tag-p:#3b1f6e;--tag-p-t:#e9d5ff;\n  --shadow:0 1px 3px rgba(0,0,0,.3)\n}\nbody{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Noto Sans SC\",\"PingFang SC\",\"Microsoft YaHei\",sans-serif;background:var(--bg);color:var(--ink);line-height:1.7;font-size:15px;transition:background .3s,color .3s}\nheader{position:fixed;top:0;left:0;right:0;z-index:100;background:var(--bg2);border-bottom:1px solid var(--rule);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);transition:background .3s}\n.header-inner{max-width:var(--max-w);margin:0 auto;display:flex;align-items:center;justify-content:space-between;padding:0 1.5rem;height:56px}\n.logo{font-weight:700;font-size:.95rem;color:var(--accent);display:flex;align-items:center;gap:.4rem}\n.controls{display:flex;align-items:center;gap:.5rem}\n.lang-switch{display:flex;border:1px solid var(--rule);border-radius:6px;overflow:hidden}\n.lang-switch button{background:0 0;border:none;color:var(--muted);padding:.3rem .7rem;font-size:.8rem;cursor:pointer;transition:all .2s;font-family:inherit}\n.lang-switch button.active{background:var(--accent);color:#fff}\n.lang-switch button:not(.active):hover{color:var(--ink);background:var(--rule)}\n.theme-toggle{background:0 0;border:1px solid var(--rule);border-radius:6px;color:var(--muted);width:34px;height:34px;font-size:1rem;cursor:pointer;display:flex;align-items:center;transition:all .2s}\n.theme-toggle:hover{color:var(--ink);background:var(--rule)}\nmain{max-width:var(--max-w);margin:0 auto;padding:80px 1.5rem 3rem}\n.lang-section{display:none}.lang-section.active{display:block}\nh1{font-size:1.9rem;font-weight:800;line-height:1.3;margin-bottom:.5rem;letter-spacing:-.02em}\nh1 .sub{display:block;font-size:.85rem;font-weight:400;color:var(--muted);margin-top:.25rem;letter-spacing:0}\nh2{font-size:1.35rem;font-weight:700;margin:2.5rem 0 1rem;padding-bottom:.5rem;border-bottom:2px solid var(--accent);letter-spacing:-.01em}\nh3{font-size:1.05rem;font-weight:600;margin:1.5rem 0 .6rem;color:var(--accent)}\nh4{font-size:.95rem;font-weight:600;margin:1rem 0 .4rem;color:var(--ink)}\np{margin-bottom:.8rem}\na{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}\n.hero{text-align:center;padding:2rem 0 1rem}\n.hero p{font-size:1rem;color:var(--muted);max-width:700px;margin:0 auto}\n.tag{display:inline-block;padding:.12rem .5rem;border-radius:4px;font-size:.72rem;font-weight:600;margin-right:.25rem;white-space:nowrap}\n.tag-g{background:var(--tag-g);color:var(--tag-g-t)}.tag-b{background:var(--tag-b);color:var(--tag-b-t)}\n.tag-r{background:var(--tag-r);color:var(--tag-r-t)}.tag-y{background:var(--tag-y);color:var(--tag-y-t)}\n.tag-p{background:var(--tag-p);color:var(--tag-p-t)}\n.card{background:var(--card);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;margin-bottom:1rem;box-shadow:var(--shadow)}\n.info-box{background:var(--bg);border-left:4px solid var(--accent);padding:.9rem 1.1rem;margin:1rem 0;border-radius:0 var(--radius) var(--radius) 0;font-size:.88rem}\n.info-box strong{color:var(--accent)}\n.info-box.warn{border-left-color:var(--accent4)}.info-box.warn strong{color:var(--accent4)}\n.info-box.danger{border-left-color:var(--accent3)}.info-box.danger strong{color:var(--accent3)}\n.toc{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.15rem 1.4rem;margin-bottom:2rem;box-shadow:var(--shadow)}\n.toc h3{margin:0 0 .5rem;font-size:.9rem;color:var(--muted);text-transform:uppercase;letter-spacing:.05em}\n.toc ol{padding-left:1.1rem;columns:2;column-gap:2rem}\n.toc li{margin-bottom:.25rem;font-size:.88rem}.toc a{color:var(--ink)}.toc a:hover{color:var(--accent);text-decoration:none}\npre.code-block{background:var(--code-bg);padding:.85rem 1rem;border-radius:var(--radius);overflow-x:auto;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;line-height:1.5;margin:.6rem 0;border:1px solid var(--rule)}\ncode,.inline-code{background:var(--code-bg);padding:.12rem .4rem;border-radius:4px;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.83rem;border:1px solid var(--rule)}\n.table-wrap{overflow-x:auto;margin:1.2rem 0}\ntable{width:100%;border-collapse:collapse;font-size:.82rem}\nthead th{background:var(--accent);color:#fff;padding:.6rem .5rem;text-align:center;font-weight:600;white-space:nowrap}\nthead th:first-child{border-radius:6px 0 0 0}thead th:last-child{border-radius:0 6px 0 0}\ntbody td{padding:.55rem .5rem;border-bottom:1px solid var(--rule);text-align:center;vertical-align:middle}\ntbody tr:nth-child(even){background:var(--bg)}\ntbody td:first-child{text-align:left;font-weight:600}\n.terminal{background:#1a1a2e;color:#a8e6cf;border-radius:var(--radius);padding:.9rem 1rem;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;line-height:1.6;margin:.6rem 0;overflow-x:auto;border:1px solid #333}\n.terminal .prompt{color:#60a5fa}.terminal .comment{color:#6c7086;font-style:italic}.terminal .output{color:#e2e4f0}\n[data-theme=\"dark\"] .terminal{background:#08081a}\n.steps{counter-reset:step;list-style:none;padding:0}\n.steps li{counter-increment:step;position:relative;padding:.85rem 1rem .85rem 2.8rem;margin-bottom:.5rem;border-left:2px solid var(--rule);border-radius:0 var(--radius) 0;background:var(--card-bg);box-shadow:var(--shadow)}\n.steps li::before{content:counter(step);position:absolute;left:-13px;top:.85rem;width:26px;height:26px;border-radius:50%;background:var(--accent);color:#fff;display:flex;align-items:center;justify-content:center;font-size:.78rem;font-weight:700}\n.steps li .cmd{display:block;background:var(--code-bg);padding:.4rem .7rem;border-radius:5px;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;margin:.3rem 0;overflow-x:auto;border:1px solid var(--rule)}\n.steps li .note{display:block;color:var(--muted);font-size:.82rem;margin-top:.2rem}\n.flow-diagram{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;margin:1.25rem 0;text-align:center}\n.flow-row{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:.35rem;margin:.4rem 0}\n.flow-item{display:inline-block;padding:.4rem .8rem;border-radius:6px;font-weight:600;font-size:.82rem;text-align:center;background:var(--accent);color:#fff;min-width:60px}\n.flow-item.green{background:var(--accent2)}.flow-item.red{background:var(--accent3)}.flow-item.yellow{background:var(--accent4);color:#1a1a2e}.flow-item.purple{background:var(--accent5)}\n.flow-arrow{color:var(--muted);font-size:1rem}\n.cmd-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:.75rem;margin:1rem 0}\n.cmd-card{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:.9rem;box-shadow:var(--shadow)}\n.cmd-card h4{margin:0 0 .35rem;font-size:.88rem;color:var(--accent)}\n.cmd-card .cmd{font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.8rem;background:var(--code-bg);padding:.3rem .5rem;border-radius:4px;display:block;margin-bottom:.3rem;border:1px solid var(--rule)}\n.cmd-card .desc{font-size:.8rem;color:var(--muted)}\n.two-col{display:grid;grid-template-columns:1fr 1fr;gap:1.25rem;margin:1.25rem 0}\n.col{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;box-shadow:var(--shadow)}\n.col h4{margin-top:0}\n.compare-box{display:grid;grid-template-columns:1fr 1fr;gap:1rem;margin:1rem 0}\n.compare-col{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1rem;box-shadow:var(--shadow)}\n.compare-col h4{margin:0 0 .4rem;font-size:.88rem}\n.compare-col.bad h4{color:var(--accent3)}\n.compare-col.good h4{color:var(--accent2)}\npre.example{background:var(--code-bg);padding:.6rem .8rem;border-radius:6px;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.78rem;line-height:1.5;margin:.4rem 0;border:1px solid var(--rule);color:var(--ink)}\nfooter{max-width:var(--max-w);margin:3rem auto 0;padding:2rem 1.5rem 3rem;border-top:1px solid var(--rule);text-align:center;font-size:.82rem;color:var(--muted)}\nfooter .links{display:flex;justify-content:center;gap:1.5rem;flex-wrap;margin-bottom:.8rem}\nfooter .links a{color:var(--muted)}footer .links a:hover{color:var(--accent)}\n@media(max-width:640px){\n  h1{font-size:1.4rem}.toc ol{columns:1}.header-inner{padding:0 1rem}main{padding:72px 1rem 2rem}\n  .steps li{padding-left:2.4rem}.steps li::before{left:-11px;width:22px;height:22px;font-size:.7rem}\n  .two-col{grid-template-columns:1fr}.cmd-grid{grid-template-columns:1fr}.compare-box{grid-template-columns:1fr}\n}\n<\/style>\n<\/head>\n<body>\n<header>\n  <div class=\"header-inner\">\n    <div class=\"logo\"><span>\ud83c\udfd7\ufe0f<\/span> Python Backend Arch Guide<\/div>\n    <div class=\"controls\">\n      <div class=\"lang-switch\">\n        <button class=\"active\" onclick=\"setLang('zh')\" id=\"btn-zh\">\u4e2d\u6587<\/button>\n        <button onclick=\"setLang('en')\" id=\"btn-en\">English<\/button>\n      <\/div>\n      <button class=\"theme-toggle\" onclick=\"toggleTheme()\" title=\"\u5207\u6362\u660e\u6697\u4e3b\u9898\">&#9788;<\/button>\n    <\/div>\n  <\/div>\n<\/header>\n<main>\n<!-- \u4e2d\u6587\u6559\u7a0b -->\n<div class=\"lang-section active\" id=\"lang-zh\">\n<div class=\"hero\">\n  <h1>Python\u540e\u7aef\u5206\u5c42\u67b6\u6784\u96f6\u57fa\u7840\u6559\u7a0b<\/h1>\n  <p>\u770b\u61c2\u5206\u5c42\u804c\u8d23\u3001\u67b6\u6784\u8bbe\u8ba1\u601d\u8def\u3001\u4e3b\u6d41Python\u540e\u7aef\u6846\u67b6\u67b6\u6784\u3001\u5b8c\u6574\u9879\u76ee\u76ee\u5f55\u793a\u4f8b<\/p>\n<\/div>\n<div class=\"toc\">\n  <h3>\u76ee\u5f55<\/h3>\n  <ol>\n    <li><a href=\"#zh-1\">\u4e00\u3001\u4e3a\u4ec0\u4e48\u540e\u7aef\u8981\u5206\u5c42\uff1f\u4e0d\u5206\u5c42\u6709\u4ec0\u4e48\u5751<\/a><\/li>\n    <li><a href=\"#zh-2\">\u4e8c\u3001\u6807\u51c6\u56db\u5c42\u67b6\u6784\uff1a\u6bcf\u5c42\u4f5c\u7528\u4e0e\u804c\u8d23<\/a><\/li>\n    <li><a href=\"#zh-3\">\u4e09\u3001\u6570\u636e\u6d41\u8f6c\u5b8c\u6574\u6d41\u7a0b\uff08\u8bf7\u6c42\u5168\u94fe\u8def\uff09<\/a><\/li>\n    <li><a href=\"#zh-4\">\u56db\u3001\u96f6\u57fa\u7840\u67b6\u6784\u8bbe\u8ba1\u901a\u7528\u6b65\u9aa4<\/a><\/li>\n    <li><a href=\"#zh-5\">\u4e94\u3001\u4e3b\u6d41Python\u540e\u7aef\u6846\u67b6\u67b6\u6784\u5bf9\u6bd4<\/a><\/li>\n    <li><a href=\"#zh-6\">\u516d\u3001\u6807\u51c6\u5206\u5c42\u9879\u76ee\u5b8c\u6574\u76ee\u5f55\u7ed3\u6784<\/a><\/li>\n    <li><a href=\"#zh-7\">\u4e03\u3001\u5206\u5c42\u4ee3\u7801\u6781\u7b80\u793a\u4f8b\uff08FastAPI\uff09<\/a><\/li>\n    <li><a href=\"#zh-8\">\u516b\u3001\u5206\u5c42\u67b6\u6784\u6838\u5fc3\u539f\u5219\uff08\u907f\u5751\uff09<\/a><\/li>\n    <li><a href=\"#zh-9\">\u4e5d\u3001\u5c0f\u578b\/\u4e2d\u578b\/\u5927\u578b\u9879\u76ee\u67b6\u6784\u53d6\u820d<\/a><\/li>\n    <li><a href=\"#zh-10\">\u5341\u3001\u603b\u7ed3\u901f\u67e5\u8868<\/a><\/li>\n  <\/ol>\n<\/div>\n<h2 id=\"zh-1\">\u4e00\u3001\u4e3a\u4ec0\u4e48\u540e\u7aef\u8981\u5206\u5c42\uff1f\u4e0d\u5206\u5c42\u6709\u4ec0\u4e48\u5751<\/h2>\n<p>\u5206\u5c42\u672c\u8d28\u662f<strong>\u5355\u4e00\u804c\u8d23\u3001\u89e3\u8026<\/strong>\uff1a\u628a\u63a5\u6536\u8bf7\u6c42\u3001\u4e1a\u52a1\u903b\u8f91\u3001\u6570\u636e\u5e93\u64cd\u4f5c\u3001\u6570\u636e\u6a21\u578b\u62c6\u5f00\uff0c\u4e00\u6bb5\u4ee3\u7801\u53ea\u505a\u4e00\u4ef6\u4e8b\u3002<\/p>\n<div class=\"compare-box\">\n  <div class=\"compare-col bad\">\n    <h4>\u274c \u4e0d\u5206\u5c42\uff08\u9762\u6761\u4ee3\u7801\uff09<\/h4>\n    <ul>\n      <li>\u8def\u7531\u91cc\u76f4\u63a5\u5199SQL\u3001\u5199\u590d\u6742\u4e1a\u52a1<\/li>\n      <li>\u6539\u6570\u636e\u5e93\u903b\u8f91\u8981\u52a8\u6240\u6709\u63a5\u53e3<\/li>\n      <li>\u4ee3\u7801\u91cd\u590d\uff0c\u590d\u5236\u7c98\u8d34\u6cdb\u6ee5<\/li>\n      <li>\u65e0\u6cd5\u5355\u5143\u6d4b\u8bd5\uff0c\u7275\u4e00\u53d1\u52a8\u5168\u8eab<\/li>\n      <li>\u65b0\u4eba\u770b\u4e0d\u61c2\uff0c\u7ef4\u62a4\u6210\u672c\u6781\u9ad8<\/li>\n    <\/ul>\n  <\/div>\n  <div class=\"compare-col good\">\n    <h4>\u2705 \u5206\u5c42\u67b6\u6784\uff08\u89c4\u8303\u9879\u76ee\uff09<\/h4>\n    <ul>\n      <li>\u6bcf\u5c42\u804c\u8d23\u56fa\u5b9a\uff0c\u4e92\u4e0d\u5e72\u6270<\/li>\n      <li>\u6362\u6570\u636e\u5e93\u53ea\u6539\u6570\u636e\u5c42\uff0c\u4e0d\u78b0\u63a5\u53e3<\/li>\n      <li>\u4e1a\u52a1\u590d\u7528\u7edf\u4e00\u62bd\u79bb\u5230Service<\/li>\n      <li>\u6bcf\u5c42\u53ef\u5355\u72ec\u5355\u5143\u6d4b\u8bd5<\/li>\n      <li>\u6613\u6269\u5c55\u3001\u6613\u6392\u67e5\u3001\u65b0\u4eba\u6613\u4e0a\u624b<\/li>\n    <\/ul>\n  <\/div>\n<\/div>\n<div class=\"info-box\">\n  <strong>\u4e00\u53e5\u8bdd\u6838\u5fc3\u601d\u60f3\uff1a<\/strong>Controller\u53ea\u7ba1\u63a5\u6536\u53c2\u6570\u3001Service\u53ea\u7ba1\u4e1a\u52a1\u3001Repository\u53ea\u7ba1\u6570\u636e\u5e93\u3001Model\u5b9a\u4e49\u6570\u636e\u7ed3\u6784\u3002\n<\/div>\n<h2 id=\"zh-2\">\u4e8c\u3001\u6807\u51c6\u56db\u5c42\u67b6\u6784\uff1a\u6bcf\u5c42\u4f5c\u7528\u4e0e\u804c\u8d23<\/h2>\n<div class=\"flow-diagram\">\n  <div class=\"flow-row\">\n    <span class=\"flow-item green\">Controller \u63a7\u5236\u5c42<\/span>\n    <span class=\"flow-arrow\">\u2192<\/span>\n    <span class=\"flow-item yellow\">Service \u4e1a\u52a1\u5c42<\/span>\n    <span class=\"flow-arrow\">\u2192<\/span>\n    <span class=\"flow-item purple\">Repository \u6570\u636e\u8bbf\u95ee\u5c42<\/span>\n    <span class=\"flow-arrow\">\u2192<\/span>\n    <span class=\"flow-item blue\">Model \u6a21\u578b\u5c42<\/span>\n  <\/div>\n  <p style=\"margin-top:0.5rem;color:var(--muted);\">\u8bf7\u6c42\u81ea\u4e0a\u800c\u4e0b\uff0c\u6570\u636e\u81ea\u4e0b\u800c\u4e0a\u8fd4\u56de<\/p>\n<\/div>\n<div class=\"two-col\">\n  <div class=\"col\">\n    <h4>1. Controller \u63a7\u5236\u5c42 \/ \u8def\u7531\u5c42<\/h4>\n    <p>\u5bf9\u5e94FastAPI\/Flask\u7684\u63a5\u53e3\u8def\u7531\u6587\u4ef6<\/p>\n    <p><strong>\u53ea\u505a4\u4ef6\u4e8b\uff1a<\/strong><\/p>\n    <ul>\n      <li>\u63a5\u6536HTTP\u8bf7\u6c42\uff08\u8def\u5f84\u53c2\u6570\u3001\u67e5\u8be2\u53c2\u6570\u3001\u8bf7\u6c42\u4f53\uff09<\/li>\n      <li>\u53c2\u6570\u6821\u9a8c\uff08Pydantic\u6a21\u578b\uff09<\/li>\n      <li>\u8c03\u7528\u5bf9\u5e94Service\u4e1a\u52a1\u65b9\u6cd5<\/li>\n      <li>\u7edf\u4e00\u5c01\u88c5\u8fd4\u56de\u7ed3\u679c\u3001\u6355\u83b7\u5168\u5c40\u5f02\u5e38<\/li>\n    <\/ul>\n    <p><strong>\u7981\u6b62\uff1a<\/strong>\u5199SQL\u3001\u590d\u6742\u5224\u65ad\u3001\u6570\u636e\u5e93\u64cd\u4f5c<\/p>\n  <\/div>\n  <div class=\"col\">\n    <h4>2. Service \u4e1a\u52a1\u5c42\uff08\u6838\u5fc3\uff09<\/h4>\n    <p>\u9879\u76ee\u6240\u6709\u4e1a\u52a1\u903b\u8f91\u5b58\u653e\u5904\uff0c\u5206\u5c42\u6700\u5173\u952e\u4e00\u5c42<\/p>\n    <p><strong>\u804c\u8d23\uff1a<\/strong><\/p>\n    <ul>\n      <li>\u5904\u7406\u4e1a\u52a1\u89c4\u5219\u3001\u4e8b\u52a1\u3001\u591a\u8868\u8054\u52a8<\/li>\n      <li>\u8c03\u7528Repository\u5b8c\u6210\u6570\u636e\u589e\u5220\u6539\u67e5<\/li>\n      <li>\u7b2c\u4e09\u65b9\u8c03\u7528\uff08Redis\u3001MQ\u3001\u7b2c\u4e09\u65b9API\uff09<\/li>\n      <li>\u4e1a\u52a1\u6821\u9a8c\uff08\u5e93\u5b58\u3001\u6743\u9650\u3001\u72b6\u6001\u5224\u65ad\uff09<\/li>\n    <\/ul>\n    <p><strong>\u7981\u6b62\uff1a<\/strong>\u76f4\u63a5\u64cd\u4f5c\u6570\u636e\u5e93\u3001\u8bfb\u53d6Request\u5bf9\u8c61<\/p>\n  <\/div>\n<\/div>\n<div class=\"two-col\">\n  <div class=\"col\">\n    <h4>3. Repository \u6570\u636e\u8bbf\u95ee\u5c42\uff08DAO\uff09<\/h4>\n    <p>\u6570\u636e\u5e93\u64cd\u4f5c\u7edf\u4e00\u5c01\u88c5\uff0c\u9694\u79bbORM\u4e0e\u4e1a\u52a1<\/p>\n    <p><strong>\u804c\u8d23\uff1a<\/strong><\/p>\n    <ul>\n      <li>\u5c01\u88c5\u5355\u8868\/\u591a\u8868CRUD\u8bed\u53e5\u3001ORM\u67e5\u8be2<\/li>\n      <li>\u4ec5\u63d0\u4f9b\u6570\u636e\u8bfb\u5199\u80fd\u529b\uff0c\u4e0d\u542b\u4e1a\u52a1\u5224\u65ad<\/li>\n      <li>\u7edf\u4e00\u6570\u636e\u5e93\u64cd\u4f5c\u5165\u53e3<\/li>\n    <\/ul>\n    <p><strong>\u7981\u6b62\uff1a<\/strong>\u4e1a\u52a1\u5224\u65ad\u3001\u590d\u6742\u6d41\u7a0b\u3001\u4e8b\u52a1\u903b\u8f91<\/p>\n  <\/div>\n  <div class=\"col\">\n    <h4>4. Model \u6a21\u578b\u5c42<\/h4>\n    <p>\u4e24\u7c7b\u6a21\u578b\u5206\u5f00\u5b58\u653e\uff1a<\/p>\n    <ul>\n      <li>\u6570\u636e\u5e93ORM\u6a21\u578b\uff08SQLAlchemy\u5b9e\u4f53\uff0c\u6620\u5c04\u6570\u636e\u8868\uff09<\/li>\n      <li>\u6570\u636e\u4f20\u8f93DTO\uff08Pydantic\uff0c\u5165\u53c2\/\u51fa\u53c2\u6821\u9a8c\uff09<\/li>\n    <\/ul>\n    <p><strong>\u804c\u8d23\uff1a<\/strong>\u5b9a\u4e49\u5b57\u6bb5\u3001\u7c7b\u578b\u3001\u7ea6\u675f\u3001\u5173\u8054\u5173\u7cfb<\/p>\n  <\/div>\n<\/div>\n<div class=\"card\">\n  <h4>\u989d\u5916\u901a\u7528\u516c\u5171\u5c42\uff08utils\/common\uff09<\/h4>\n  <p><span class=\"tag-b\">utils<\/span> \u5de5\u5177\u51fd\u6570\uff1a\u52a0\u5bc6\u3001\u65e5\u671f\u3001\u6587\u4ef6\u3001\u901a\u7528\u8ba1\u7b97<\/p>\n  <p><span class=\"tag-g\">config<\/span> \u914d\u7f6e\u6587\u4ef6\uff1a\u6570\u636e\u5e93\u3001Redis\u3001\u73af\u5883\u53d8\u91cf\uff08YAML\uff09<\/p>\n  <p><span class=\"tag-y\">middleware<\/span> \u4e2d\u95f4\u4ef6\uff1a\u9274\u6743\u3001\u65e5\u5fd7\u3001\u8de8\u57df\u3001\u8bf7\u6c42\u8017\u65f6<\/p>\n  <p><span class=\"tag-p\">exception<\/span> \u5168\u5c40\u81ea\u5b9a\u4e49\u5f02\u5e38\u3001\u9519\u8bef\u7801<\/p>\n<\/div>\n<h2 id=\"zh-3\">\u4e09\u3001\u6570\u636e\u6d41\u8f6c\u5b8c\u6574\u6d41\u7a0b\uff08\u7528\u6237\u521b\u5efa\u8ba2\u5355\u793a\u4f8b\uff09<\/h2>\n<ol class=\"steps\">\n  <li>\u524d\u7aefPOST \/order\/create \u643a\u5e26\u5546\u54c1ID\u3001\u7528\u6237ID<\/li>\n  <li>Controller\u63a5\u6536\u8bf7\u6c42\uff0cPydantic\u6821\u9a8c\u53c2\u6570\u5408\u6cd5\u6027<\/li>\n  <li>Controller\u8c03\u7528OrderService.create_order(user_id, goods_id)<\/li>\n  <li>Service\u5f00\u542f\u6570\u636e\u5e93\u4e8b\u52a1\uff1a\n    <ul style=\"margin-left:1rem;margin-top:0.2rem;\">\n      <li>\u8c03\u7528GoodsRepository\u67e5\u8be2\u5546\u54c1\u5e93\u5b58<\/li>\n      <li>\u4e1a\u52a1\u5224\u65ad\uff1a\u5e93\u5b58\u4e0d\u8db3\u76f4\u63a5\u629b\u51fa\u5f02\u5e38<\/li>\n      <li>\u8c03\u7528OrderRepository\u65b0\u589e\u8ba2\u5355<\/li>\n      <li>\u8c03\u7528GoodsRepository\u6263\u51cf\u5e93\u5b58<\/li>\n      <li>\u4e8b\u52a1\u63d0\u4ea4\uff0c\u5931\u8d25\u81ea\u52a8\u56de\u6eda<\/li>\n    <\/ul>\n  <\/li>\n  <li>Repository\u901a\u8fc7ORM Model\u64cd\u4f5c\u6570\u636e\u8868\uff0c\u8fd4\u56de\u6570\u636e<\/li>\n  <li>\u6570\u636e\u9010\u5c42\u56de\u4f20\u7ed9Controller\uff0c\u7edf\u4e00JSON\u8fd4\u56de\u524d\u7aef<\/li>\n<\/ol>\n<h2 id=\"zh-4\">\u56db\u3001\u96f6\u57fa\u7840\u67b6\u6784\u8bbe\u8ba1\u901a\u7528\u6b65\u9aa4<\/h2>\n<ol class=\"steps\">\n  <li>\u68b3\u7406\u4e1a\u52a1\u6a21\u5757\uff1a\u7528\u6237\u3001\u5546\u54c1\u3001\u8ba2\u5355\u3001\u652f\u4ed8\u7b49\uff0c\u62c6\u5206\u72ec\u7acb\u4e1a\u52a1\u57df<\/li>\n  <li>\u62c6\u5206\u6570\u636e\u8868\uff0c\u8bbe\u8ba1ORM Model\u5b57\u6bb5\u4e0e\u5173\u8054\u5173\u7cfb<\/li>\n  <li>\u5212\u5206\u63a5\u53e3\uff0c\u786e\u5b9a\u6bcf\u4e2a\u63a5\u53e3\u5165\u53c2\u3001\u51fa\u53c2\uff08DTO\u6a21\u578b\uff09<\/li>\n  <li>\u6309\u56db\u5c42\u67b6\u6784\u5206\u914d\u4ee3\u7801\u6587\u4ef6\uff1a\u6bcf\u4e2a\u6a21\u5757\u5355\u72ec\u4e00\u5957Controller\/Service\/Repository<\/li>\n  <li>\u62bd\u53d6\u516c\u5171\u5de5\u5177\u3001\u5168\u5c40\u5f02\u5e38\u3001\u4e2d\u95f4\u4ef6\u3001\u914d\u7f6e<\/li>\n  <li>\u89c4\u8303\u8c03\u7528\u89c4\u5219\uff1aController\u2192Service\u2192Repository\uff0c\u7981\u6b62\u8de8\u5c42\u53cd\u5411\u8c03\u7528<\/li>\n  <li>\u7f16\u5199\u5355\u5143\u6d4b\u8bd5\uff1aService\u5c42\u4f18\u5148\u6d4b\u8bd5\uff0c\u65e0\u9700\u542f\u52a8\u63a5\u53e3<\/li>\n<\/ol>\n<div class=\"info-box warn\">\n  <strong>\u7ea2\u7ebf\u89c4\u5219\uff1a<\/strong>\u7981\u6b62Controller\u76f4\u63a5\u8c03\u7528Repository\uff0c\u5fc5\u987b\u7ecf\u8fc7Service\u4e2d\u8f6c\u3002\n<\/div>\n<h2 id=\"zh-5\">\u4e94\u3001\u4e3b\u6d41Python\u540e\u7aef\u6846\u67b6\u67b6\u6784\u5bf9\u6bd4<\/h2>\n<div class=\"table-wrap\">\n<table>\n  <thead>\n    <tr><th>\u6846\u67b6<\/th><th>\u67b6\u6784\u98ce\u683c<\/th><th>\u5206\u5c42\u9002\u914d<\/th><th>\u9002\u7528\u9879\u76ee<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>FastAPI<\/td>\n      <td>\u6807\u51c6MVC\/\u56db\u5c42\u5206\u5c42<\/td>\n      <td>\u539f\u751f\u652f\u6301Pydantic\u3001\u4f9d\u8d56\u6ce8\u5165\uff0c\u5206\u5c42\u6700\u53cb\u597d<\/td>\n      <td>\u4e2d\u5c0f\u578b\u3001\u9ad8\u6027\u80fdAPI\u3001\u5fae\u670d\u52a1<\/td>\n    <\/tr>\n    <tr>\n      <td>Flask<\/td>\n      <td>\u5fae\u5185\u6838\uff0c\u65e0\u5f3a\u5236\u67b6\u6784<\/td>\n      <td>\u9700\u8981\u624b\u52a8\u62c6\u5206\u5206\u5c42\uff0c\u65e0\u5185\u7f6eDTO<\/td>\n      <td>\u5c0f\u578b\u5de5\u5177\u3001\u7b80\u5355\u540e\u53f0\u3001\u4e2a\u4eba\u9879\u76ee<\/td>\n    <\/tr>\n    <tr>\n      <td>Django<\/td>\n      <td>MVT\uff08\u81ea\u5e26\u5206\u5c42\uff09<\/td>\n      <td>Model(ORM)+View(Controller)+Template\uff0c\u81ea\u5e26Admin<\/td>\n      <td>\u5927\u578b\u5b8c\u6574\u540e\u53f0\u3001\u7ba1\u7406\u7cfb\u7edf\u3001CMS<\/td>\n    <\/tr>\n    <tr>\n      <td>Tornado<\/td>\n      <td>\u5f02\u6b65\u539f\u751f<\/td>\n      <td>\u65e0\u89c4\u8303\u5206\u5c42\uff0c\u9002\u5408\u8001\u5f02\u6b65\u9879\u76ee<\/td>\n      <td>\u9ad8\u5e76\u53d1\u957f\u8fde\u63a5\u3001\u8001\u65e7\u670d\u52a1<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n<\/div>\n<div class=\"card\">\n  <h4>\u67b6\u6784\u540d\u8bcd\u5bf9\u5e94\u6362\u7b97\uff08\u5feb\u901f\u7406\u89e3\uff09<\/h4>\n  <p>MVC\uff1aModel(\u6570\u636e) + View(\u9875\u9762\/\u8fd4\u56de) + Controller(\u8def\u7531)<\/p>\n  <p>\u56db\u5c42 = MVC \u5347\u7ea7\u62c6\u5206\uff1aController+Service(\u62c6\u5206\u539fView)+DAO(Repository)+Model<\/p>\n  <p>Django MVT\uff1aModel=ORM\uff0cView=Controller\uff0cTemplate=\u524d\u7aef\u9875\u9762<\/p>\n<\/div>\n<h2 id=\"zh-6\">\u516d\u3001\u6807\u51c6\u5206\u5c42\u9879\u76ee\u5b8c\u6574\u76ee\u5f55\u7ed3\u6784\uff08FastAPI\u793a\u4f8b\uff09<\/h2>\n<pre class=\"code-block\">project_root\/\n\u251c\u2500\u2500 config\/                # \u5168\u5c40\u914d\u7f6eyaml\n\u2502   \u2514\u2500\u2500 app.yml\n\u251c\u2500\u2500 core\/                  # \u6838\u5fc3\u516c\u5171\u7ec4\u4ef6\n\u2502   \u251c\u2500\u2500 exception.py       # \u5168\u5c40\u5f02\u5e38\u3001\u9519\u8bef\u7801\n\u2502   \u251c\u2500\u2500 middleware.py      # \u8de8\u57df\u3001\u9274\u6743\u4e2d\u95f4\u4ef6\n\u2502   \u2514\u2500\u2500 dependencies.py    # \u4f9d\u8d56\u6ce8\u5165\uff08\u767b\u5f55\u6821\u9a8c\uff09\n\u251c\u2500\u2500 utils\/                 # \u901a\u7528\u5de5\u5177\n\u2502   \u251c\u2500\u2500 crypto.py\n\u2502   \u2514\u2500\u2500 date_util.py\n\u251c\u2500\u2500 api\/                   # Controller\u63a7\u5236\u5c42\uff08\u8def\u7531\uff09\n\u2502   \u251c\u2500\u2500 user.py\n\u2502   \u251c\u2500\u2500 order.py\n\u2502   \u2514\u2500\u2500 goods.py\n\u251c\u2500\u2500 service\/                # Service\u4e1a\u52a1\u5c42\n\u2502   \u251c\u2500\u2500 user_service.py\n\u2502   \u251c\u2500\u2500 order_service.py\n\u2502   \u2514\u2500\u2500 goods_service.py\n\u251c\u2500\u2500 repository\/            # Repository\u6570\u636e\u5c42\n\u2502   \u251c\u2500\u2500 user_repo.py\n\u2502   \u251c\u2500\u2500 order_repo.py\n\u2502   \u2514\u2500\u2500 goods_repo.py\n\u251c\u2500\u2500 model\/                 # \u6a21\u578b\u5c42\n\u2502   \u251c\u2500\u2500 db\/                # ORM\u6570\u636e\u5e93\u6a21\u578b\n\u2502   \u2502   \u251c\u2500\u2500 user.py\n\u2502   \u2502   \u2514\u2500\u2500 order.py\n\u2502   \u2514\u2500\u2500 dto\/               # Pydantic\u5165\u53c2\u51fa\u53c2\n\u2502       \u251c\u2500\u2500 user_dto.py\n\u2502       \u2514\u2500\u2500 order_dto.py\n\u251c\u2500\u2500 db\/                    # \u6570\u636e\u5e93\u8fde\u63a5\u3001\u4f1a\u8bdd\n\u2502   \u2514\u2500\u2500 session.py\n\u251c\u2500\u2500 main.py                # \u9879\u76ee\u5165\u53e3\n\u2514\u2500\u2500 requirements.txt\n<\/pre>\n<h2 id=\"zh-7\">\u4e03\u3001\u5206\u5c42\u4ee3\u7801\u6781\u7b80\u793a\u4f8b\uff08\u521b\u5efa\u8ba2\u5355\uff09<\/h2>\n<h3>1. model\/db\/order.py ORM\u6a21\u578b<\/h3>\n<pre class=\"code-block\">from sqlalchemy import Column, Integer, String\nfrom db.session import Base\n\nclass Order(Base):\n    __tablename__ = \"t_order\"\n    id = Column(Integer, primary_key=True, autoincrement=True)\n    user_id = Column(Integer)\n    goods_id = Column(Integer)\n    status = Column(String)\n<\/pre>\n<h3>2. model\/dto\/order_dto \u5165\u53c2\u6821\u9a8c<\/h3>\n<pre class=\"code-block\">from pydantic import BaseModel\n\nclass OrderCreateDTO(BaseModel):\n    user_id: int\n    goods_id: int\n<\/pre>\n<h3>3. repository\/order_repo \u6570\u636e\u5c42<\/h3>\n<pre class=\"code-block\">from sqlalchemy.orm import Session\nfrom model.db.order import Order\n\nclass OrderRepo:\n    @staticmethod\n    def create(db: Session, user_id: int, goods_id: int):\n        new_order = Order(user_id=user_id, goods_id=goods_id, status=\"pending\")\n        db.add(new_order)\n        db.flush()\n        return new_order.id\n<\/pre>\n<h3>4. service\/order_service \u4e1a\u52a1\u5c42<\/h3>\n<pre class=\"code-block\">from sqlalchemy.orm import Session\nfrom repository.order_repo import OrderRepo\nfrom repository.goods_repo import GoodsRepo\nfrom core.exception import BusinessException\n\nclass OrderService:\n    @staticmethod\n    def create_order(db: Session, user_id: int, goods_id: int):\n        # \u4e1a\u52a1\u6821\u9a8c\uff1a\u67e5\u8be2\u5e93\u5b58\n        goods = GoodsRepo.get_by_id(db, goods_id)\n        if goods.stock <= 0:\n            raise BusinessException(\"\u5546\u54c1\u5e93\u5b58\u4e0d\u8db3\")\n        # \u4e8b\u52a1\u64cd\u4f5c\n        order_id = OrderRepo.create(db, user_id, goods_id)\n        GoodsRepo.sub_stock(db, goods_id, 1)\n        return order_id\n<\/pre>\n<h3>5. api\/order.py Controller\u8def\u7531\u5c42<\/h3>\n<pre class=\"code-block\">from fastapi import APIRouter, Depends\nfrom sqlalchemy.orm import Session\nfrom db.session import get_db\nfrom model.dto.order_dto import OrderCreateDTO\nfrom service.order_service import OrderService\n\nrouter = APIRouter(prefix=\"\/order\")\n\n@router.post(\"\/create\")\ndef create_order(dto: OrderCreateDTO, db: Session = Depends(get_db)):\n    order_id = OrderService.create_order(db, dto.user_id, dto.goods_id)\n    return {\"code\": 200, \"msg\": \"\u521b\u5efa\u6210\u529f\", \"data\": {\"order_id\": order_id}}\n<\/pre>\n<h2 id=\"zh-8\">\u516b\u3001\u5206\u5c42\u67b6\u6784\u6838\u5fc3\u539f\u5219\uff08\u907f\u5751\uff09<\/h2>\n<div class=\"card\">\n  <h4>1. \u5355\u5411\u4f9d\u8d56\u539f\u5219<\/h4>\n  <p>\u53ea\u80fd\u4e0a\u5c42\u8c03\u7528\u4e0b\u5c42\uff1aController \u2192 Service \u2192 Repository\uff0c\u7981\u6b62\u53cd\u5411\u8c03\u7528\uff08Service\u4e0d\u80fd\u5bfc\u5165Controller\uff09<\/p>\n<\/div>\n<div class=\"card\">\n  <h4>2. \u5355\u4e00\u804c\u8d23\u539f\u5219<\/h4>\n  <p>\u4e00\u4e2a\u6587\u4ef6\/\u7c7b\u53ea\u5e72\u5bf9\u5e94\u5206\u5c42\u7684\u4e8b\uff0c\u4e0d\u63ba\u6742\u5176\u4ed6\u5c42\u4ee3\u7801<\/p>\n<\/div>\n<div class=\"card\">\n  <h4>3. \u6570\u636e\u9694\u79bb\u539f\u5219<\/h4>\n  <p>Controller\u4e0d\u80fd\u76f4\u63a5\u64cd\u4f5cDB\uff1bRepository\u4e0d\u80fd\u5305\u542b\u4e1a\u52a1\u5224\u65ad<\/p>\n<\/div>\n<div class=\"card\">\n  <h4>4. \u590d\u7528\u4e0b\u6c89\u539f\u5219<\/h4>\n  <p>\u91cd\u590d\u4e1a\u52a1\u903b\u8f91\u7edf\u4e00\u4e0b\u6c89\u5230Service\uff1b\u91cd\u590d\u6570\u636e\u5e93\u64cd\u4f5c\u4e0b\u6c89\u5230Repository<\/p>\n<\/div>\n<div class=\"card\">\n  <h4>5. \u5206\u5c42\u9694\u79bb\u6d4b\u8bd5<\/h4>\n  <p>Service\u3001Repository\u53ef\u8131\u79bb\u63a5\u53e3\u5355\u72ec\u5355\u5143\u6d4b\u8bd5\uff0c\u65e0\u9700\u542f\u52a8web\u670d\u52a1<\/p>\n<\/div>\n<h2 id=\"zh-9\">\u4e5d\u3001\u5c0f\u578b\/\u4e2d\u578b\/\u5927\u578b\u9879\u76ee\u67b6\u6784\u53d6\u820d<\/h2>\n<div class=\"table-wrap\">\n<table>\n  <thead>\n    <tr><th>\u9879\u76ee\u89c4\u6a21<\/th><th>\u5206\u5c42\u7b80\u5316\u65b9\u6848<\/th><th>\u63a8\u8350\u6846\u67b6<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>\u5c0f\u578b\uff08\u722c\u866b\/\u7b80\u5355\u5de5\u5177\uff09<\/td>\n      <td>\u5408\u5e76Repository\u5230Service\uff0c\u4ec5Controller+Service+Model\u4e09\u5c42<\/td>\n      <td>Flask\/FastAPI<\/td>\n    <\/tr>\n    <tr>\n      <td>\u4e2d\u578b\u540e\u53f0\u4e1a\u52a1<\/td>\n      <td>\u6807\u51c6\u56db\u5c42\u5b8c\u6574\u5206\u5c42\uff0c\u6309\u6a21\u5757\u62c6\u5206\u6587\u4ef6<\/td>\n      <td>FastAPI<\/td>\n    <\/tr>\n    <tr>\n      <td>\u5927\u578b\u5fae\u670d\u52a1<\/td>\n      <td>\u56db\u5c42+\u9886\u57df\u62c6\u5206\uff0c\u5355\u72ec\u5fae\u670d\u52a1\uff0c\u589e\u52a0RPC\u3001\u6d88\u606f\u961f\u5217\u5c42<\/td>\n      <td>FastAPI + grpc<\/td>\n    <\/tr>\n    <tr>\n      <td>\u7ba1\u7406\u540e\u53f0\u7cfb\u7edf<\/td>\n      <td>Django MVT\u81ea\u5e26\u5206\u5c42\uff0c\u914d\u5957Admin\u540e\u53f0<\/td>\n      <td>Django<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n<\/div>\n<h2 id=\"zh-10\">\u5341\u3001\u603b\u7ed3\u901f\u67e5\u8868<\/h2>\n<div class=\"card\">\n  <h4>\u56db\u5c42\u5206\u5c42\u8bb0\u5fc6\u53e3\u8bc0<\/h4>\n  <p>1 Controller\uff1a\u6536\u53c2\u3001\u6821\u9a8c\u3001\u8c03\u4e1a\u52a1\u3001\u8fd4\u56de<\/p>\n  <p>2 Service\uff1a\u4e1a\u52a1\u903b\u8f91\u3001\u4e8b\u52a1\u3001\u7b2c\u4e09\u65b9\u8c03\u7528\uff08\u6838\u5fc3\uff09<\/p>\n  <p>3 Repository\uff1a\u7eaf\u6570\u636e\u5e93CRUD\uff0c\u65e0\u4e1a\u52a1<\/p>\n  <p>4 Model\uff1a\u6570\u636e\u8868ORM + \u8bf7\u6c42\u54cd\u5e94DTO<\/p>\n  <p><strong>\u8c03\u7528\u89c4\u5219\uff1a\u81ea\u4e0a\u800c\u4e0b\u5355\u5411\u8c03\u7528\uff0c\u7981\u6b62\u8de8\u5c42\u3001\u53cd\u5411\u5bfc\u5165<\/strong><\/p>\n<\/div>\n<div class=\"info-box\">\n  <strong>\u65b0\u624b\u5efa\u8bae\uff1a<\/strong>\u65b0\u9879\u76ee\u76f4\u63a5\u4f7f\u7528FastAPI\u6807\u51c6\u56db\u5c42\u67b6\u6784\uff0c\u76ee\u5f55\u6e05\u6670\u3001\u6613\u4e8e\u7ef4\u62a4\uff0c\u9002\u914d\u7edd\u5927\u591a\u6570\u4e1a\u52a1\u573a\u666f\u3002\n<\/div>\n<\/div>\n<!-- English Section -->\n<div class=\"lang-section\" id=\"lang-en\">\n<div class=\"hero\">\n  <h1>Python Backend Layered Architecture Guide for Beginners<\/h1>\n  <p>Understand layer responsibilities, architecture design workflow, mainstream Python web frameworks, full project structure<\/p>\n<\/div>\n<div class=\"toc\">\n  <h3>Table of Contents<\/h3>\n  <ol>\n    <li><a href=\"#en-1\">1 Why Layered Architecture & Cost of Spaghetti Code<\/a><\/li>\n    <li><a href=\"#en-2\">2 Standard 4-Tier Architecture Explained<\/a><\/li>\n    <li><a href=\"#en-3\">3 Full Request Data Flow<\/a><\/li>\n    <li><a href=\"#en-4\">4 Step-by-Step Architecture Design Process<\/a><\/li>\n    <li><a href=\"#en-5\">5 Popular Python Web Framework Architecture Compare<\/a><\/li>\n    <li><a href=\"#en-6\">6 Standard Project Folder Structure<\/a><\/li>\n    <li><a href=\"#en-7\">7 Minimal Layered Code Demo<\/a><\/li>\n    <li><a href=\"#en-8\">8 Core Architecture Rules & Anti-Patterns<\/a><\/li>\n    <li><a href=\"#en-9\">9 Architecture Adjustment by Project Size<\/a><\/li>\n    <li><a href=\"#en-10\">10 Quick Reference Summary<\/a><\/li>\n  <\/ol>\n<\/div>\n<h2 id=\"en-1\">1 Why Layered Architecture & Cost of Spaghetti Code<\/h2>\n<p>Layers follow <strong>Single Responsibility & Loose Coupling<\/strong>: split request handling, business logic, database operations and data models into separate modules.<\/p>\n<div class=\"compare-box\">\n  <div class=\"compare-col bad\">\n    <h4>\u274c No Layers (Spaghetti Code)<\/h4>\n    <ul>\n      <li>SQL & complex logic mixed inside routes<\/li>\n      <li>Database changes require editing all endpoints<\/li>\n      <li>Mass duplicate code, hard to reuse<\/li>\n      <li>Hard unit testing, fragile changes<\/li>\n    <\/ul>\n  <\/div>\n  <div class=\"compare-col good\">\n    <h4>\u2705 Layered Architecture<\/h4>\n    <ul>\n      <li>Clear independent responsibility per layer<\/li>\n      <li>Swap database only in repository layer<\/li>\n      <li>Centralized reusable business logic<\/li>\n      <li>Isolated unit testing per layer<\/li>\n    <\/ul>\n  <\/div>\n<\/div>\n<h2 id=\"en-2\">2 Standard 4-Tier Architecture Explained<\/h2>\n<div class=\"flow-diagram\">\n  <div class=\"flow-row\">\n    <span class=\"flow-item green\">Controller<\/span>\n    <span class=\"flow-arrow\">\u2192<\/span>\n    <span class=\"flow-item yellow\">Service<\/span>\n    <span class=\"flow-arrow\">\u2192<\/span>\n    <span class=\"flow-item purple\">Repository(DAO)<\/span>\n    <span class=\"flow-arrow\">\u2192<\/span>\n    <span class=\"flow-item blue\">Model<\/span>\n  <\/div>\n<\/div>\n<h3>Controller Layer (Routes)<\/h3>\n<p>Receive HTTP request, validate input DTO, call service, wrap JSON response. No SQL or business logic.<\/p>\n<h3>Service Layer (Core Business)<\/h3>\n<p>Business rules, database transactions, third-party API\/Redis\/MQ calls, business validation.<\/p>\n<h3>Repository \/ DAO Layer<\/h3>\n<p>Pure database CRUD with ORM, only data access, zero business judgment.<\/p>\n<h3>Model Layer<\/h3>\n<p>ORM DB models (map tables) + Pydantic DTOs (request\/response schema).<\/p>\n<h3>Common Auxiliary Modules<\/h3>\n<ul>\n  <li>config: env & yaml config<\/li>\n  <li>utils: helper functions<\/li>\n  <li>middleware: auth, cors, logging<\/li>\n  <li>exception: global custom error<\/li>\n<\/ul>\n<h2 id=\"en-3\">3 Full Request Flow Example (Create Order)<\/h2>\n<ol class=\"steps\">\n  <li>Frontend POST \/order\/create<\/li>\n  <li>Controller validate DTO input<\/li>\n  <li>Call OrderService.create_order()<\/li>\n  <li>Service handle transaction: check stock \u2192 create order \u2192 deduct stock<\/li>\n  <li>Service calls Repository to run ORM queries<\/li>\n  <li>Data returns layer by layer to HTTP response<\/li>\n<\/ol>\n<h2 id=\"en-4\">4 Step-by-Step Architecture Design<\/h2>\n<ol class=\"steps\">\n  <li>Split business domains: user, order, goods, payment<\/li>\n  <li>Design database tables & ORM models<\/li>\n  <li>Define API endpoints, request\/response DTOs<\/li>\n  <li>Create separate controller\/service\/repo per module<\/li>\n  <li>Extract shared utils, middleware, global exceptions<\/li>\n  <li>Enforce one-way top-down dependency<\/li>\n  <li>Write unit tests for service & repository<\/li>\n<\/ol>\n<h2 id=\"en-5\">5 Popular Python Web Framework Compare<\/h2>\n<div class=\"table-wrap\">\n<table>\n  <thead>\n    <tr><th>Framework<\/th><th>Architecture Style<\/th><th>Best For<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>FastAPI<\/td>\n      <td>Native 4-layer friendly, Pydantic built-in<\/td>\n      <td>API, microservice, high performance<\/td>\n    <\/tr>\n    <tr>\n      <td>Flask<\/td>\n      <td>Micro kernel, no enforced layers<\/td>\n      <td>Small script, simple internal tool<\/td>\n    <\/tr>\n    <tr>\n      <td>Django<\/td>\n      <td>MVT built-in full stack<\/td>\n      <td>Admin backend, CMS, complex system<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n<\/div>\n<h2 id=\"en-6\">6 Standard FastAPI Project Structure<\/h2>\n<pre class=\"code-block\">project\/\n\u251c\u2500\u2500 config\/\n\u251c\u2500\u2500 core\/ # middleware, exception\n\u251c\u2500\u2500 utils\/\n\u251c\u2500\u2500 api\/ # Controller routes\n\u251c\u2500\u2500 service\/ # business logic\n\u251c\u2500\u2500 repository\/ # database DAO\n\u251c\u2500\u2500 model\/\n\u2502   \u251c\u2500\u2500 db # ORM models\n\u2502   \u2514\u2500\u2500 dto # Pydantic schemas\n\u251c\u2500\u2500 db\/ # session\n\u2514\u2500\u2500 main.py\n<\/pre>\n<h2 id=\"en-7\">7 Minimal Layered Code Demo<\/h2>\n<pre class=\"code-block\"># model\/db order ORM\nclass Order(Base):\n    __tablename__ = \"t_order\"\n    id = Column(Integer, primary_key=True)\n\n# repository\nclass OrderRepo:\n    @staticmethod\n    def create(db, user_id, goods_id):\n        order = Order(user_id=user_id, goods_id=goods_id)\n        db.add(order)\n        return order.id\n\n# service\nclass OrderService:\n    @staticmethod\n    def create(db, user_id, goods_id):\n        goods = GoodsRepo.get(db, goods_id)\n        if goods.stock <= 0:\n            raise BusinessErr(\"stock empty\")\n        return OrderRepo.create(db, user_id)\n\n# api controller\n@router.post(\"\/create\")\ndef create(dto: OrderCreateDTO, db = Depends(get_db)):\n    oid = OrderService.create(db, dto.user_id, dto.goods_id)\n    return {\"data\": {\"order_id\": oid}}\n<\/pre>\n<h2 id=\"en-8\">8 Core Architecture Rules<\/h2>\n<ul>\n  <li>One-way dependency: Controller \u2192 Service \u2192 Repository only<\/li>\n  <li>Single responsibility per file\/class<\/li>\n  <li>No DB operation inside Controller<\/li>\n  <li>No business logic inside Repository<\/li>\n  <li>Reusable logic sink down to Service \/ Repository<\/li>\n<\/ul>\n<h2 id=\"en-9\">9 Architecture Adjustment by Project Size<\/h2>\n<ul>\n  <li>Small tool: Merge Repository into Service (3 layers only)<\/li>\n  <li>Medium backend: Full standard 4 layers (FastAPI recommended)<\/li>\n  <li>Large microservice: 4 layers + RPC \/ MQ separate service<\/li>\n  <li>Admin system: Django built-in MVT architecture<\/li>\n<\/ul>\n<h2 id=\"en-10\">10 Summary Cheat Sheet<\/h2>\n<p>Controller: receive request, validate input<\/p>\n<p>Service: core business, transaction<\/p>\n<p>Repository: pure database CRUD<\/p>\n<p>Model: ORM table + Pydantic DTO<\/p>\n<p>Rule: Top-down one-way calling only, no cross-layer reverse import<\/p>\n<\/div>\n<\/main>\n<footer>\n  <div class=\"links\">\n    <a href=\"https:\/\/fastapi.tiangolo.com\/\" target=\"_blank\" rel=\"noopener\">FastAPI Docs<\/a>\n    <a href=\"https:\/\/docs.djangoproject.com\/\" target=\"_blank\" rel=\"noopener\">Django Docs<\/a>\n    <a href=\"https:\/\/flask.palletsprojects.com\/\" target=\"_blank\" rel=\"noopener\">Flask Docs<\/a>\n  <\/div>\n  <p>Python Backend Layered Architecture Complete Guide<\/p>\n<\/footer>\n<script>\nfunction setLang(lang){\n  document.querySelectorAll('.lang-section').forEach(el=>el.classList.remove('active'));\n  document.getElementById('lang-'+lang).classList.add('active');\n  document.querySelectorAll('.lang-switch button').forEach(btn=>btn.classList.remove('active'));\n  document.getElementById('btn-'+lang).classList.add('active');\n  document.documentElement.lang = lang==='zh'?'zh-CN':'en';\n  const prefix = lang==='zh'?'zh':'en';\n  const newHash = window.location.hash.replace(\/^#(zh|en)-\/, prefix+\"-\");\n  if(newHash) window.location.hash = newHash;\n}\nfunction toggleTheme(){\n  const html = document.documentElement;\n  if(html.hasAttribute('data-theme')){\n    html.removeAttribute('data-theme');\n    localStorage.removeItem('theme');\n  }else{\n    html.setAttribute('data-theme','dark');\n    localStorage.setItem('dark');\n  }\n}\n(function(){\n  if(localStorage.getItem('theme')==='dark') document.documentElement.setAttribute('data-theme','dark');\n  const hash = window.location.hash;\n  if(hash){\n    const target = document.querySelector(hash);\n    if(target) setTimeout(()=>target.scrollIntoView({behavior:'smooth'}),100);\n  }\n})();\n<\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Python\u540e\u7aef\u5206\u5c42\u67b6\u6784\u96f6\u57fa\u7840\u6559\u7a0b \u00b7 Python Backend Architecture Guide \ud83c\udfd7 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,9],"tags":[],"class_list":["post-325","post","type-post","status-publish","format-standard","hentry","category-cad","category-ai"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/325","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=325"}],"version-history":[{"count":1,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/325\/revisions"}],"predecessor-version":[{"id":326,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/325\/revisions\/326"}],"wp:attachment":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=325"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=325"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=325"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}