{"id":111293,"date":"2026-09-30T21:40:58","date_gmt":"2026-09-30T13:40:58","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/111293.html"},"modified":"2026-09-30T21:40:58","modified_gmt":"2026-09-30T13:40:58","slug":"django-vue%e7%94%b5%e5%95%86%e9%a1%b9%e7%9b%ae%e7%ac%ac005%e8%ae%b2%ef%bc%9a%e5%90%8e%e7%ab%af%e9%aa%a8%e6%9e%b6%ef%bd%9cdjango%e5%88%9d%e5%a7%8b%e5%8c%96%e3%80%81%e9%85%8d%e7%bd%ae%e5%88%86","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/111293.html","title":{"rendered":"Django + Vue\u7535\u5546\u9879\u76ee\u7b2c005\u8bb2\uff1a\u540e\u7aef\u9aa8\u67b6\uff5cDjango\u521d\u59cb\u5316\u3001\u914d\u7f6e\u5206\u5c42\u4e0eDRF\u63a5\u5165"},"content":{"rendered":"<p>\u672c\u8bb2\u662fM0\u91cc\u7a0b\u7891\u7684\u6536\u5b98\u3002\u7b2c4\u8bb2\u524d\u7aef\u80fd\u8dd1&#xff0c;\u7b2c5\u8bb2\u540e\u7aef\u80fd\u8dd1&#xff0c;\u4e0b\u4e00\u8bb2\u5f00\u59cb\u5c31\u662f\u300c\u4e1a\u52a1\u4ee3\u7801\u300d\u4e86\u3002<br \/>\n\u26a0\ufe0f M0\u6210\u5c31\u89e3\u9501&#xff1a;\u8dd1\u901apython manage.py runserver&#xff0c;\u6d4f\u89c8\u5668\u8bbf\u95ee\/api\/v1\/health\/\u8fd4\u56de{&#034;status&#034;: &#034;ok&#034;}\u3002<br \/>\n\u5efa\u8bae\u5148 \u70b9\u8d5e &#043; \u6536\u85cf &#043; \u5173\u6ce8&#xff0c;\u914d settings \u5206\u5c42\u65f6\u968f\u65f6\u56de\u67e5\u3002<\/p>\n<hr \/>\n<h3>\u4e00\u3001\u4e3a\u4ec0\u4e48\u7528Django\u800c\u4e0d\u662fFlask<\/h3>\n<p>\u5f88\u591a\u65b0\u4eba\u4f1a\u95ee&#xff1a;<\/p>\n<p>\u73b0\u5728\u4e0d\u90fd\u7528FastAPI\u4e86\u5417&#xff1f;Django\u4e0d\u8001\u5417&#xff1f;<\/p>\n<p>\u8fd9\u4e2a\u95ee\u9898\u6709\u56db\u5c42\u56de\u7b54\u3002<\/p>\n<p>\u7b2c\u4e00\u5c42&#xff1a;\u6559\u5b66\u66f2\u7ebf\u3002<br \/>\nDjango\u662f\u300c\u5168\u5bb6\u6876\u300d\u2014\u2014ORM\u3001Admin\u3001Auth\u3001\u8fc1\u79fb\u3001\u7f13\u5b58\u3001\u4fe1\u53f7\u3001\u4e2d\u95f4\u4ef6\u3001\u56fd\u9645\u5316\u5f00\u7bb1\u5373\u7528\u3002Flask \u7075\u6d3b\u4f46\u6563\u88c5&#xff0c;\u4f60\u6bcf\u505a\u4e00\u4e2a\u65b0\u6a21\u5757\u90fd\u8981\u9009\u300c\u8fd9\u4e2a\u9879\u76ee\u76ee\u5f55\u8be5\u957f\u4ec0\u4e48\u6837\u3001\u8fd9\u4e2aORM\u600e\u4e48\u7528\u3001\u8fd9\u4e2aAdmin\u600e\u4e48\u642d\u300d\u3002<\/p>\n<p>\u4e13\u680f\u5982\u679c\u7528Flask&#xff0c;\u5c31\u4f1a\u9677\u5165\u9009\u578b\u75b2\u52b3\u3002Django\u628a\u8fd9\u4e9b\u51b3\u7b56\u63d0\u524d\u505a\u4e86&#xff0c;\u4f60\u53ea\u9700\u8981\u8ddf\u7740\u5b66\u3002<\/p>\n<p>\u7b2c\u4e8c\u5c42&#xff1a;\u5c31\u4e1a\u9762\u3002<br \/>\n\u6253\u5f00\u62db\u8058\u8f6f\u4ef6\u641c\u300cPython\u540e\u7aef\u300d&#xff0c;Django\u51fa\u73b0\u9891\u6b21\u8fdc\u9ad8\u4e8eFastAPI\u3002FastAPI\u662f\u65b0\u8d8b\u52bf\u6ca1\u9519&#xff0c;\u4f46\u56fd\u5185\u5927\u90e8\u5206\u5b58\u91cf\u7cfb\u7edf\u662fDjango\u3002\u5b66\u5b8c\u80fd\u76f4\u63a5\u5bf9\u63a5\u4f01\u4e1a\u771f\u5b9e\u9879\u76ee\u3002<\/p>\n<p>\u7b2c\u4e09\u5c42&#xff1a;\u751f\u6001\u5b8c\u6574\u5ea6\u3002<br \/>\nDjango\u7684\u7b2c\u4e09\u65b9\u5305\u8986\u76d6\u4e86\u4f60\u80fd\u60f3\u5230\u7684\u6240\u6709\u573a\u666f&#xff1a;<\/p>\n<ul>\n<li>DRF&#xff08;API&#xff09;<\/li>\n<li>SimpleJWT&#xff08;\u9274\u6743&#xff09;<\/li>\n<li>Celery&#xff08;\u5f02\u6b65&#xff09;<\/li>\n<li>channels&#xff08;WebSocket&#xff09;<\/li>\n<li>Debug Toolbar&#xff08;\u8c03\u8bd5&#xff09;<\/li>\n<li>Django Admin&#xff08;\u540e\u53f0&#xff09;<\/li>\n<li>django-cors-headers&#xff08;CORS&#xff09;<\/li>\n<\/ul>\n<p>FastAPI\u751f\u6001\u4e5f\u5728\u957f&#xff0c;\u4f46\u5f88\u591a\u573a\u666f\u9700\u8981\u81ea\u5df1\u62fc\u3002<\/p>\n<p>\u7b2c\u56db\u5c42&#xff1a;\u6027\u80fd\u4e0d\u662f\u77ed\u677f\u3002<br \/>\nDjango\u5f15\u5165ASGI\u5f02\u6b65\u89c6\u56fe &#043; async ORM&#xff0c;\u5728I\/O\u5bc6\u96c6\u573a\u666f\u4e0eFastAPI\u6301\u5e73\u3002\u540e\u9762\u6211\u4eec\u4f1a\u7528Celery\u628aCPU\u5bc6\u96c6\u4efb\u52a1\u6254\u51fa\u4e3b\u7ebf\u7a0b\u3002<\/p>\n<p>&#x1f4a1; \u4ec0\u4e48\u65f6\u5019\u9009FastAPI&#xff1f;<br \/>\n\u7eaf\u5f02\u6b65 &#043; \u9ad8\u5e76\u53d1 &#043; \u5fae\u670d\u52a1\u573a\u666f&#xff08;\u6bd4\u5982\u7269\u8054\u7f51\u7f51\u5173\u3001\u5b9e\u65f6\u6570\u636e\u6d41&#xff09;&#xff0c;FastAPI\u66f4\u5408\u9002\u3002\u672c\u4e13\u680f\u662f\u7535\u5546B2C\u5355\u4f53\u5e94\u7528&#xff0c;Django\u66f4\u5339\u914d\u3002<\/p>\n<hr \/>\n<h3>\u4e8c\u3001\u521b\u5efa\u5de5\u7a0b<\/h3>\n<p>\u5207\u5230\u5bf9\u5e94\u7684\u7279\u6027\u5206\u652f&#xff1a;<\/p>\n<p><span class=\"token builtin class-name\">cd<\/span> ~\/workspace\/shopx<br \/>\n<span class=\"token function\">git<\/span> switch develop<br \/>\n<span class=\"token function\">git<\/span> pull<br \/>\n<span class=\"token function\">git<\/span> switch <span class=\"token parameter variable\">-c<\/span> feature\/lecture-005-backend-scaffold<\/p>\n<h4>\u521b\u5efa Django \u5de5\u7a0b<\/h4>\n<p>\u5728\u9879\u76ee\u6839\u76ee\u5f55\u521b\u5efabackend\/\u5b50\u76ee\u5f55\u4f5c\u4e3a\u540e\u7aef\u4ee3\u7801\u6839&#xff1a;<\/p>\n<p><span class=\"token function\">mkdir<\/span> backend<br \/>\n<span class=\"token builtin class-name\">cd<\/span> backend<\/p>\n<p>\u6fc0\u6d3b\u865a\u62df\u73af\u5883&#xff08;\u7b2c 2 \u8bb2\u5efa\u7684&#xff09;&#xff1a;<\/p>\n<p><span class=\"token builtin class-name\">source<\/span> <span class=\"token punctuation\">..<\/span>\/.venv\/bin\/activate<br \/>\n<span class=\"token comment\"># Windows WSL: \u540c\u6837\u547d\u4ee4<\/span><br \/>\n<span class=\"token comment\"># \u6ce8\u610f\u8def\u5f84\u662f ..\/.venv \u56e0\u4e3a\u6211\u4eec\u5728 backend \u5b50\u76ee\u5f55<\/span><\/p>\n<p>&#x1f4a1; \u4e5f\u53ef\u4ee5\u628a.venv\/\u653e\u5728backend\/\u5185\u90e8&#xff0c;\u8def\u5f84\u66f4\u77ed\u3002\u4f46\u672c\u4e13\u680f\u7528monorepo&#xff0c;.venv\/\u653e\u6839\u76ee\u5f55\u7edf\u4e00\u7ba1\u7406\u3002<\/p>\n<p>\u521b\u5efa Django \u5de5\u7a0b&#xff1a;<\/p>\n<p>django-admin startproject shopx <span class=\"token builtin class-name\">.<\/span><\/p>\n<p>\u672b\u5c3e\u7684 . \u5f88\u91cd\u8981\u2014\u2014\u5b83\u8868\u793a\u5728\u5f53\u524d\u76ee\u5f55&#xff08;backend\/&#xff09;\u521b\u5efa\u5de5\u7a0b&#xff0c;\u800c\u4e0d\u662f\u518d\u5d4c\u5957\u4e00\u5c42shopx\/shopx\/\u3002\u5982\u679c\u4f60\u5fd8\u4e86\u6253\u70b9&#xff0c;\u540e\u9762\u8def\u5f84\u4f1a\u5f88\u4e71\u3002<\/p>\n<p>\u751f\u6210\u7684\u76ee\u5f55&#xff1a;<\/p>\n<p>backend\/<br \/>\n\u251c\u2500\u2500 manage.py           # \u547d\u4ee4\u884c\u5165\u53e3<br \/>\n\u2514\u2500\u2500 shopx\/<br \/>\n    \u251c\u2500\u2500 __init__.py<br \/>\n    \u251c\u2500\u2500 asgi.py         # ASGI \u5165\u53e3&#xff08;\u5f02\u6b65&#xff09;<br \/>\n    \u251c\u2500\u2500 wsgi.py         # WSGI \u5165\u53e3&#xff08;\u540c\u6b65&#xff09;<br \/>\n    \u251c\u2500\u2500 settings.py     # \u914d\u7f6e\u6587\u4ef6&#xff08;\u672c\u8bb2\u8981\u62c6&#xff09;<br \/>\n    \u2514\u2500\u2500 urls.py         # \u6839\u8def\u7531<\/p>\n<h4>\u9a8c\u8bc1Django\u88c5\u597d<\/h4>\n<p>python manage.py runserver<br \/>\n<span class=\"token comment\"># Watching for file changes with StatReloader<\/span><br \/>\n<span class=\"token comment\"># Starting development server at http:\/\/127.0.0.1:8000\/<\/span><br \/>\n<span class=\"token comment\"># Quit the server with CONTROL-C.<\/span><\/p>\n<p>\u6d4f\u89c8\u5668\u8bbf\u95eehttp:\/\/127.0.0.1:8000\/&#xff0c;\u770b\u5230Django\u9ed8\u8ba4\u6b22\u8fce\u9875&#xff08;\u706b\u7bad\u56fe&#xff09;\u3002Ctrl&#043;C\u5173\u6389&#xff0c;\u6211\u4eec\u7ee7\u7eed\u6539\u914d\u7f6e\u3002<\/p>\n<hr \/>\n<h3>\u4e09\u3001\u7b2c\u4e00\u4e2aApp&#xff1a;health<\/h3>\n<p>Django\u7684\u300cApp\u300d\u662f\u4e00\u4e2a\u53ef\u72ec\u7acb\u590d\u7528\u7684\u529f\u80fd\u6a21\u5757\u3002\u5546\u57ce\u540e\u7aef\u6700\u7ec8\u4f1a\u670911\u4e2aapp&#xff08;users goods cart orders \u2026&#xff09;&#xff0c;\u4f46\u672c\u8bb2\u53ea\u5efa\u4e00\u4e2a\u6700\u7b80\u7684 health\u2014\u2014\u7528\u4e8e\u63a2\u6d3b\u63a5\u53e3\u3002<\/p>\n<h4>\u521b\u5efahealth app<\/h4>\n<p>python manage.py startapp health<\/p>\n<p>\u751f\u6210&#xff1a;<\/p>\n<p>health\/<br \/>\n\u251c\u2500\u2500 __init__.py<br \/>\n\u251c\u2500\u2500 admin.py<br \/>\n\u251c\u2500\u2500 apps.py<br \/>\n\u251c\u2500\u2500 migrations\/<br \/>\n\u2502   \u2514\u2500\u2500 __init__.py<br \/>\n\u251c\u2500\u2500 models.py<br \/>\n\u251c\u2500\u2500 tests.py<br \/>\n\u2514\u2500\u2500 views.py<\/p>\n<h4>\u6ce8\u518c\u5230INSTALLED_APPS<\/h4>\n<p>\u6253\u5f00shopx\/settings.py&#xff0c;\u627e\u5230INSTALLED_APPS&#xff0c;\u52a0\u4e0a&#xff1a;<\/p>\n<p>INSTALLED_APPS <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n    <span class=\"token string\">&#039;django.contrib.admin&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;django.contrib.auth&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;django.contrib.contenttypes&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;django.contrib.sessions&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;django.contrib.messages&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;django.contrib.staticfiles&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token comment\"># \u7b2c\u4e09\u65b9<\/span><br \/>\n    <span class=\"token string\">&#039;rest_framework&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;corsheaders&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token comment\"># \u672c\u9879\u76ee<\/span><br \/>\n    <span class=\"token string\">&#039;health&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">]<\/span><\/p>\n<h4>\u5199\u7b2c\u4e00\u4e2a APIView<\/h4>\n<p>\u7f16\u8f91 health\/views.py&#xff1a;<\/p>\n<p><span class=\"token keyword\">from<\/span> rest_framework<span class=\"token punctuation\">.<\/span>views <span class=\"token keyword\">import<\/span> APIView<br \/>\n<span class=\"token keyword\">from<\/span> rest_framework<span class=\"token punctuation\">.<\/span>response <span class=\"token keyword\">import<\/span> Response<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">HealthView<\/span><span class=\"token punctuation\">(<\/span>APIView<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u5065\u5eb7\u68c0\u67e5\u63a5\u53e3&#xff0c;\u4f9b\u524d\u7aef\u3001\u7b2c 92 \u8bb2\u7684 K8s \u63a2\u9488\u3001\u7b2c 100 \u8bb2\u7684\u90e8\u7f72\u811a\u672c\u4f7f\u7528\u3002&#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> request<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> Response<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;ok&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;service&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;shopx&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;version&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;0.1.0&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<h4>\u914d URL<\/h4>\n<p>\u65b0\u5efa health\/urls.py&#xff1a;<\/p>\n<p><span class=\"token keyword\">from<\/span> django<span class=\"token punctuation\">.<\/span>urls <span class=\"token keyword\">import<\/span> path<br \/>\n<span class=\"token keyword\">from<\/span> <span class=\"token punctuation\">.<\/span>views <span class=\"token keyword\">import<\/span> HealthView<\/p>\n<p>urlpatterns <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n    path<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;health\/&#039;<\/span><span class=\"token punctuation\">,<\/span> HealthView<span class=\"token punctuation\">.<\/span>as_view<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039;health&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">]<\/span><\/p>\n<p>\u7f16\u8f91 shopx\/urls.py&#xff08;\u6839\u8def\u7531&#xff09;&#xff1a;<\/p>\n<p><span class=\"token keyword\">from<\/span> django<span class=\"token punctuation\">.<\/span>contrib <span class=\"token keyword\">import<\/span> admin<br \/>\n<span class=\"token keyword\">from<\/span> django<span class=\"token punctuation\">.<\/span>urls <span class=\"token keyword\">import<\/span> path<span class=\"token punctuation\">,<\/span> include<\/p>\n<p>urlpatterns <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n    path<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;admin\/&#039;<\/span><span class=\"token punctuation\">,<\/span> admin<span class=\"token punctuation\">.<\/span>site<span class=\"token punctuation\">.<\/span>urls<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    path<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;api\/v1\/&#039;<\/span><span class=\"token punctuation\">,<\/span> include<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;health.urls&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">]<\/span><\/p>\n<p>\u6ce8\u610f&#xff1a;\u6240\u6709\u4e1a\u52a1\u63a5\u53e3\u90fd\u6302\u5728 \/api\/v1\/ \u4e0b\u3002v1 \u662f API \u7248\u672c\u53f7&#xff0c;\u7b2c 80 \u8bb2\u4f1a\u8bb2 API \u7248\u672c\u7ba1\u7406\u7684\u51e0\u79cd\u7b56\u7565\u3002<\/p>\n<hr \/>\n<h3>\u56db\u3001settings \u5206\u5c42&#xff08;\u6559\u5b66\u4e0a\u7684\u5173\u952e\u5de5\u7a0b\u5b9e\u8df5&#xff09;<\/h3>\n<p>\u9ed8\u8ba4\u7684 settings.py \u662f\u5355\u6587\u4ef6&#xff0c;\u6240\u6709\u914d\u7f6e&#xff08;\u6570\u636e\u5e93\u3001\u90ae\u4ef6\u3001\u7f13\u5b58\u3001\u7b2c\u4e09\u65b9\u3001\u8c03\u8bd5&#xff09;\u6df7\u5728\u4e00\u8d77\u3002\u751f\u4ea7\u7ea7 Django \u9879\u76ee\u5fc5\u987b\u5206\u5c42&#xff0c;\u5426\u5219\u6362\u73af\u5883\u65f6\u6539\u4e00\u5806\u5730\u65b9\u5bb9\u6613\u51fa\u9519\u3002<\/p>\n<h4>\u62c6\u5206\u6210 4 \u4e2a\u6587\u4ef6<\/h4>\n<p>\u628a settings.py \u5220\u6389&#xff0c;\u65b0\u5efa settings\/ \u76ee\u5f55&#xff1a;<\/p>\n<p><span class=\"token function\">rm<\/span> shopx\/settings.py<br \/>\n<span class=\"token function\">mkdir<\/span> shopx\/settings<br \/>\n<span class=\"token function\">touch<\/span> shopx\/settings\/__init__.py<\/p>\n<p>\u751f\u6210 4 \u4e2a\u6587\u4ef6&#xff1a;<\/p>\n<p>shopx\/<br \/>\n\u2514\u2500\u2500 settings\/<br \/>\n    \u251c\u2500\u2500 __init__.py<br \/>\n    \u251c\u2500\u2500 base.py      # \u516c\u5171\u914d\u7f6e&#xff08;\u6240\u6709\u73af\u5883\u5171\u4eab&#xff09;<br \/>\n    \u251c\u2500\u2500 dev.py       # \u5f00\u53d1\u73af\u5883<br \/>\n    \u251c\u2500\u2500 test.py      # \u6d4b\u8bd5\u73af\u5883<br \/>\n    \u2514\u2500\u2500 prod.py      # \u751f\u4ea7\u73af\u5883<\/p>\n<h4>base.py&#xff08;\u516c\u5171\u90e8\u5206&#xff09;<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\nShopX Django \u914d\u7f6e &#8211; \u57fa\u7840\u914d\u7f6e&#xff08;\u6240\u6709\u73af\u5883\u5171\u4eab&#xff09;<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> pathlib <span class=\"token keyword\">import<\/span> Path<br \/>\n<span class=\"token keyword\">from<\/span> decouple <span class=\"token keyword\">import<\/span> config<\/p>\n<p>BASE_DIR <span class=\"token operator\">&#061;<\/span> Path<span class=\"token punctuation\">(<\/span>__file__<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>resolve<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>parent<span class=\"token punctuation\">.<\/span>parent<span class=\"token punctuation\">.<\/span>parent<\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; \u6838\u5fc3\u5b89\u5168\u914d\u7f6e &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\nSECRET_KEY <span class=\"token operator\">&#061;<\/span> config<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;DJANGO_SECRET_KEY&#039;<\/span><span class=\"token punctuation\">)<\/span><br \/>\nDEBUG <span class=\"token operator\">&#061;<\/span> config<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;DJANGO_DEBUG&#039;<\/span><span class=\"token punctuation\">,<\/span> default<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span> cast<span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">)<\/span><br \/>\nALLOWED_HOSTS <span class=\"token operator\">&#061;<\/span> config<span class=\"token punctuation\">(<\/span><br \/>\n    <span class=\"token string\">&#039;DJANGO_ALLOWED_HOSTS&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    default<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039;*&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    cast<span class=\"token operator\">&#061;<\/span><span class=\"token keyword\">lambda<\/span> v<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span>s<span class=\"token punctuation\">.<\/span>strip<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">for<\/span> s <span class=\"token keyword\">in<\/span> v<span class=\"token punctuation\">.<\/span>split<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;,&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; \u5e94\u7528\u6ce8\u518c &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\nINSTALLED_APPS <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n    <span class=\"token string\">&#039;django.contrib.admin&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;django.contrib.auth&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;django.contrib.contenttypes&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;django.contrib.sessions&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;django.contrib.messages&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;django.contrib.staticfiles&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token comment\"># \u7b2c\u4e09\u65b9<\/span><br \/>\n    <span class=\"token string\">&#039;rest_framework&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;corsheaders&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token comment\"># \u672c\u9879\u76ee<\/span><br \/>\n    <span class=\"token string\">&#039;health&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">]<\/span><\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; \u4e2d\u95f4\u4ef6 &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\nMIDDLEWARE <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n    <span class=\"token comment\"># CORS\u5fc5\u987b\u5728CommonMiddleware\u4e4b\u524d<\/span><br \/>\n    <span class=\"token string\">&#039;corsheaders.middleware.CorsMiddleware&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;django.middleware.security.SecurityMiddleware&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;django.contrib.sessions.middleware.SessionMiddleware&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;django.middleware.common.CommonMiddleware&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;django.middleware.csrf.CsrfViewMiddleware&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;django.contrib.auth.middleware.AuthenticationMiddleware&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;django.contrib.messages.middleware.MessageMiddleware&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;django.middleware.clickjacking.XFrameOptionsMiddleware&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">]<\/span><\/p>\n<p>ROOT_URLCONF <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;shopx.urls&#039;<\/span><\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; \u6a21\u677f &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\nTEMPLATES <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string\">&#039;BACKEND&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;django.template.backends.django.DjangoTemplates&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#039;DIRS&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#039;APP_DIRS&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#039;OPTIONS&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#039;context_processors&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n                <span class=\"token string\">&#039;django.template.context_processors.debug&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#039;django.template.context_processors.request&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#039;django.contrib.auth.context_processors.auth&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#039;django.contrib.messages.context_processors.messages&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">]<\/span><\/p>\n<p>WSGI_APPLICATION <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;shopx.wsgi.application&#039;<\/span><br \/>\nASGI_APPLICATION <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;shopx.asgi.application&#039;<\/span><\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; \u6570\u636e\u5e93 &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\nDATABASES <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string\">&#039;default&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string\">&#039;ENGINE&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;django.db.backends.mysql&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#039;NAME&#039;<\/span><span class=\"token punctuation\">:<\/span> config<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;DB_NAME&#039;<\/span><span class=\"token punctuation\">,<\/span> default<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039;shopx&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#039;USER&#039;<\/span><span class=\"token punctuation\">:<\/span> config<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;DB_USER&#039;<\/span><span class=\"token punctuation\">,<\/span> default<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039;root&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#039;PASSWORD&#039;<\/span><span class=\"token punctuation\">:<\/span> config<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;DB_PASSWORD&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#039;HOST&#039;<\/span><span class=\"token punctuation\">:<\/span> config<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;DB_HOST&#039;<\/span><span class=\"token punctuation\">,<\/span> default<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039;127.0.0.1&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#039;PORT&#039;<\/span><span class=\"token punctuation\">:<\/span> config<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;DB_PORT&#039;<\/span><span class=\"token punctuation\">,<\/span> default<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#039;3306&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#039;OPTIONS&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#039;charset&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;utf8mb4&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#039;init_command&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;SET sql_mode&#061;&#039;STRICT_TRANS_TABLES&#039;&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; \u5bc6\u7801\u9a8c\u8bc1 &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\nAUTH_PASSWORD_VALIDATORS <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#039;NAME&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;django.contrib.auth.password_validation.UserAttributeSimilarityValidator&#039;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#039;NAME&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;django.contrib.auth.password_validation.MinimumLengthValidator&#039;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#039;NAME&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;django.contrib.auth.password_validation.CommonPasswordValidator&#039;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#039;NAME&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;django.contrib.auth.password_validation.NumericPasswordValidator&#039;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">]<\/span><\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; \u56fd\u9645\u5316 &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\nLANGUAGE_CODE <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;zh-hans&#039;<\/span><br \/>\nTIME_ZONE <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;Asia\/Shanghai&#039;<\/span><br \/>\nUSE_I18N <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">True<\/span><br \/>\nUSE_TZ <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">True<\/span><\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; \u9759\u6001\u6587\u4ef6 &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\nSTATIC_URL <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;static\/&#039;<\/span><br \/>\nSTATIC_ROOT <span class=\"token operator\">&#061;<\/span> BASE_DIR <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#039;staticfiles&#039;<\/span><\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; \u5a92\u4f53\u6587\u4ef6&#xff08;\u7528\u6237\u4e0a\u4f20&#xff09; &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\nMEDIA_URL <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;media\/&#039;<\/span><br \/>\nMEDIA_ROOT <span class=\"token operator\">&#061;<\/span> BASE_DIR <span class=\"token operator\">\/<\/span> <span class=\"token string\">&#039;media&#039;<\/span><\/p>\n<p>DEFAULT_AUTO_FIELD <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;django.db.models.BigAutoField&#039;<\/span><\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; DRF &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\nREST_FRAMEWORK <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string\">&#039;DEFAULT_PERMISSION_CLASSES&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;rest_framework.permissions.AllowAny&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;DEFAULT_AUTHENTICATION_CLASSES&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n        <span class=\"token string\">&#039;rest_framework.authentication.SessionAuthentication&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#039;rest_framework_simplejwt.authentication.JWTAuthentication&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;DEFAULT_RENDERER_CLASSES&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;rest_framework.renderers.JSONRenderer&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;DEFAULT_PARSER_CLASSES&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;rest_framework.parsers.JSONParser&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;DEFAULT_PAGINATION_CLASS&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;rest_framework.pagination.PageNumberPagination&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;PAGE_SIZE&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">20<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; CORS&#xff08;M0\u7ea7\u522b\u591f\u7528&#xff09;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\nCORS_ALLOWED_ORIGINS <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n    <span class=\"token string\">&#039;http:\/\/127.0.0.1:5173&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;http:\/\/localhost:5173&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">]<\/span><\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; \u5b58\u50a8 &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\nSTORAGES <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string\">&#034;default&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string\">&#034;BACKEND&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;django.core.files.storage.FileSystemStorage&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;staticfiles&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string\">&#034;BACKEND&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;django.contrib.staticfiles.storage.StaticFilesStorage&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u8fd9\u6bb5\u4ee3\u7801\u4f7f\u7528\u4e86python-decouple\u5e93&#xff0c;\u9700\u8981\u8fdb\u884c\u914d\u7f6e\u3002\u540e\u9762\u7b2c\u4e94\u8282\u4f1a\u5355\u72ec\u8bb2\u3002<\/p>\n<h4>dev.py<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u5f00\u53d1\u73af\u5883\u914d\u7f6e&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> <span class=\"token punctuation\">.<\/span>base <span class=\"token keyword\">import<\/span> <span class=\"token operator\">*<\/span><\/p>\n<p>DEBUG <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">True<\/span><br \/>\nALLOWED_HOSTS <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;*&#039;<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p><span class=\"token comment\"># \u63a7\u5236\u53f0\u90ae\u4ef6\u540e\u7aef&#xff0c;\u65b9\u4fbf\u5f00\u53d1\u671f\u770b\u90ae\u4ef6\u5185\u5bb9<\/span><br \/>\nEMAIL_BACKEND <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;django.core.mail.backends.console.EmailBackend&#039;<\/span><\/p>\n<h4>test.py<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u6d4b\u8bd5\u73af\u5883\u914d\u7f6e&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> <span class=\"token punctuation\">.<\/span>base <span class=\"token keyword\">import<\/span> <span class=\"token operator\">*<\/span><\/p>\n<p>DEBUG <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">False<\/span><br \/>\n<span class=\"token comment\"># \u7528\u5185\u5b58\u6570\u636e\u5e93\u8dd1\u6d4b\u8bd5&#xff0c;\u4e0d\u6c61\u67d3\u771f\u5b9e\u6570\u636e<\/span><br \/>\nDATABASES <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string\">&#039;default&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string\">&#039;ENGINE&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;django.db.backends.sqlite3&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#039;NAME&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;:memory:&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>prod.py<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u751f\u4ea7\u73af\u5883\u914d\u7f6e&#xff08;\u5360\u4f4d&#xff09;&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> <span class=\"token punctuation\">.<\/span>base <span class=\"token keyword\">import<\/span> <span class=\"token operator\">*<\/span><\/p>\n<p>DEBUG <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">False<\/span><br \/>\n<span class=\"token comment\"># ALLOWED_HOSTS\u5fc5\u987b\u5728.env\u91cc\u914d<\/span><\/p>\n<h4>\u5207\u6362\u73af\u5883<\/h4>\n<p>\u901a\u8fc7 DJANGO_SETTINGS_MODULE \u73af\u5883\u53d8\u91cf&#xff1a;<\/p>\n<p><span class=\"token comment\"># \u5f00\u53d1<\/span><br \/>\n<span class=\"token builtin class-name\">export<\/span> <span class=\"token assign-left variable\">DJANGO_SETTINGS_MODULE<\/span><span class=\"token operator\">&#061;<\/span>shopx.settings.dev<br \/>\npython manage.py runserver<\/p>\n<p><span class=\"token comment\"># \u6d4b\u8bd5<\/span><br \/>\n<span class=\"token builtin class-name\">export<\/span> <span class=\"token assign-left variable\">DJANGO_SETTINGS_MODULE<\/span><span class=\"token operator\">&#061;<\/span>shopx.settings.test<br \/>\npython manage.py <span class=\"token builtin class-name\">test<\/span><\/p>\n<p><span class=\"token comment\"># \u751f\u4ea7<\/span><br \/>\n<span class=\"token builtin class-name\">export<\/span> <span class=\"token assign-left variable\">DJANGO_SETTINGS_MODULE<\/span><span class=\"token operator\">&#061;<\/span>shopx.settings.prod<br \/>\ngunicorn shopx.wsgi:application<\/p>\n<h4>\u4e3a\u4ec0\u4e48\u4e0d\u76f4\u63a5\u7528django-environ&#xff1f;<\/h4>\n<p>\u5b83\u529f\u80fd\u66f4\u5f3a&#xff0c;\u4f46\u914d\u7f6e\u6587\u4ef6\u8981\u5199\u4e00\u5806env()\u8c03\u7528&#xff0c;\u5bf9\u96f6\u57fa\u7840\u8bfb\u8005\u4e0d\u53cb\u597d\u3002<\/p>\n<p>python-decouple\u914d\u5408.env\u6587\u4ef6\u8db3\u591f\u672c\u4e13\u680f\u7528&#xff0c;\u540e\u9762\u751f\u4ea7\u90e8\u7f72\u65f6\u518d\u8003\u8651\u8fc1\u79fb\u3002<\/p>\n<hr \/>\n<h3>\u4e94\u3001\u914d\u7f6epython-decouple<\/h3>\n<p>python-decouple\u662f\u4ece.env\u6587\u4ef6\u8bfb\u914d\u7f6e\u7684\u5c0f\u5de5\u5177\u3002\u6bd4os.environ\u591a\u4e86\u51e0\u4e2a\u80fd\u529b&#xff1a;<\/p>\n<ul>\n<li>\u81ea\u52a8\u5904\u7406bool int list\u7c7b\u578b\u8f6c\u6362<\/li>\n<li>\u9ed8\u8ba4\u503c<\/li>\n<li>.env\u4e0d\u5b58\u5728\u65f6\u62a5\u9519\u800c\u4e0d\u662f\u6084\u6084\u7528\u7a7a\u503c<\/li>\n<\/ul>\n<h4>\u9879\u76ee\u6839\u76ee\u5f55\u5efa .env<\/h4>\n<p>\u26a0\ufe0f \u5fc5\u987b\u653e\u5728shopx\/.gitignore\u5df2\u5ffd\u7565\u7684\u8def\u5f84\u4e0b\u3002\u672c\u4e13\u680f\u628a.env\u653e\u5728backend\/.env&#xff08;\u4e0d\u8fdb git&#xff09;\u3002<\/p>\n<p># Django<br \/>\nDJANGO_SECRET_KEY&#061;dev-secret-key-change-me-in-prod<br \/>\nDJANGO_DEBUG&#061;True<br \/>\nDJANGO_ALLOWED_HOSTS&#061;*<\/p>\n<p># MySQL&#xff08;\u5bc6\u7801\u8981\u6539&#xff09;<br \/>\nDB_NAME&#061;shopx<br \/>\nDB_USER&#061;root<br \/>\nDB_PASSWORD&#061;your_strong_password_here<br \/>\nDB_HOST&#061;127.0.0.1<br \/>\nDB_PORT&#061;3306<\/p>\n<p># Redis<br \/>\nREDIS_URL&#061;redis:\/\/127.0.0.1:6379\/0<\/p>\n<h4>\u521b\u5efa\u6570\u636e\u5e93<\/h4>\n<p>mysql <span class=\"token parameter variable\">-uroot<\/span> <span class=\"token parameter variable\">-p<\/span><\/p>\n<p><span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">DATABASE<\/span> shopx <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token keyword\">CHARACTER<\/span> <span class=\"token keyword\">SET<\/span> utf8mb4 <span class=\"token keyword\">COLLATE<\/span> utf8mb4_unicode_ci<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">SHOW<\/span> <span class=\"token keyword\">DATABASES<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">EXIT<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>&#x1f4a1; utf8mb4_unicode_ci\u662f\u66f4\u7cbe\u786e\u7684\u6392\u5e8f\u89c4\u5219&#xff08;\u6bd4utf8mb4_general_ci\u51c6\u786e\u4f46\u7a0d\u6162&#xff09;&#xff0c;\u9002\u5408\u9700\u8981\u4e2d\u6587\u6392\u5e8f\u7684\u7535\u5546\u573a\u666f\u3002<\/p>\n<h4>\u8dd1\u8fc1\u79fb<\/h4>\n<p>python manage.py migrate<\/p>\n<p>\u8f93\u51fa\u7c7b\u4f3c&#xff1a;<\/p>\n<p>Operations to perform:<br \/>\n  Apply all migrations: admin, auth, contenttypes, sessions<br \/>\nRunning migrations:<br \/>\n  Applying contenttypes.0001_initial&#8230; OK<br \/>\n  Applying auth.0001_initial&#8230; OK<br \/>\n  &#8230;<\/p>\n<p>\u8fc1\u79fb\u4f1a\u81ea\u52a8\u5efa\u597ddjango_*\u5f00\u5934\u7684\u5185\u7f6e\u8868&#xff08;admin\u3001auth\u3001sessions \u7b49&#xff09;\u3002<\/p>\n<h4>\u9a8c\u8bc1\u8868<\/h4>\n<p>mysql <span class=\"token parameter variable\">-uroot<\/span> <span class=\"token parameter variable\">-p<\/span> shopx <span class=\"token parameter variable\">-e<\/span> <span class=\"token string\">&#034;SHOW TABLES;&#034;<\/span><\/p>\n<p>\u5e94\u8be5\u770b\u5230 auth_user\u3001django_session\u3001django_migrations \u7b49\u8868\u3002<\/p>\n<hr \/>\n<h3>\u516d\u3001DRF\u914d\u7f6e\u8be6\u89e3<\/h3>\n<p>DRF&#xff08;Django REST Framework&#xff09;\u662fDjango\u751f\u6001\u91cc\u6700\u4e3b\u6d41\u7684REST API\u6846\u67b6\u3002\u672c\u8282\u628a\u5b83\u7684\u51e0\u4e2a\u5173\u952e\u914d\u7f6e\u8bb2\u900f\u3002<\/p>\n<h4>\u5168\u5c40\u914d\u7f6e\u9879<\/h4>\n<p>\u5df2\u7ecf\u5728base.py\u4e2d\u914d\u7f6e&#xff0c;\u8fd9\u91cc\u518d\u5f3a\u8c03\u51e0\u4e2a\u5173\u952e\u9879&#xff1a;<\/p>\n<p>REST_FRAMEWORK <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string\">&#039;DEFAULT_PERMISSION_CLASSES&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;rest_framework.permissions.AllowAny&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;DEFAULT_AUTHENTICATION_CLASSES&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n        <span class=\"token string\">&#039;rest_framework.authentication.SessionAuthentication&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#039;rest_framework_simplejwt.authentication.JWTAuthentication&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;DEFAULT_RENDERER_CLASSES&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;rest_framework.renderers.JSONRenderer&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;DEFAULT_PARSER_CLASSES&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;rest_framework.parsers.JSONParser&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;DEFAULT_PAGINATION_CLASS&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;rest_framework.pagination.PageNumberPagination&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;PAGE_SIZE&#039;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">20<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>\u5404\u9879\u542b\u4e49<\/h4>\n<ul>\n<li>DEFAULT_PERMISSION_CLASSES&#xff1a;\u9ed8\u8ba4\u6743\u9650\u3002M0\u9636\u6bb5\u5148\u7528AllowAny&#xff08;\u4efb\u4f55\u4eba\u90fd\u80fd\u8bbf\u95ee&#xff09;&#xff0c;\u540e\u9762\u4f1a\u6536\u7d27\u4e3aIsAuthenticated<\/li>\n<li>DEFAULT_AUTHENTICATION_CLASSES&#xff1a;\u9ed8\u8ba4\u8ba4\u8bc1\u65b9\u5f0f\u3002Session\u7528\u4e8eDjango Admin\u767b\u5f55&#xff0c;JWT\u7528\u4e8eAPI\u8c03\u7528<\/li>\n<li>DEFAULT_RENDERER_CLASSES&#xff1a;\u53ea\u8f93\u51faJSON&#xff08;\u4e0d\u8981HTML\u8c03\u8bd5\u9875\u9762&#xff09;<\/li>\n<li>DEFAULT_PARSER_CLASSES&#xff1a;\u53ea\u63a5\u53d7JSON\u5165\u53c2&#xff08;\u4e0d\u8981form-urlencoded&#xff09;<\/li>\n<li>DEFAULT_PAGINATION_CLASS&#xff1a;\u9ed8\u8ba4\u5206\u9875\u5668&#xff0c;\u5217\u8868\u63a5\u53e3\u81ea\u52a8\u5206\u9875&#xff0c;\u6bcf\u987520\u6761<\/li>\n<li>PAGE_SIZE&#xff1a;\u9ed8\u8ba4\u6bcf\u9875\u6761\u6570<\/li>\n<\/ul>\n<h4>DRF \u4e09\u4ef6\u5957<\/h4>\n<p>DRF\u628aWeb API\u62bd\u8c61\u6210\u4e09\u4e2a\u5c42\u6b21&#xff1a;<\/p>\n<li>Serializer&#xff08;\u5e8f\u5217\u5316\u5668&#xff09;\u2014\u2014 \u6570\u636e\u683c\u5f0f\u8f6c\u6362 &#043; \u6821\u9a8c<\/li>\n<li>View&#xff08;\u89c6\u56fe&#xff09;\u2014\u2014 \u4e1a\u52a1\u903b\u8f91&#xff0c;\u63a5\u6536\u8bf7\u6c42\u3001\u8fd4\u56de\u54cd\u5e94<\/li>\n<li>Router&#xff08;\u8def\u7531\u5668&#xff09;\u2014\u2014 URL\u8def\u7531&#xff08;\u81ea\u52a8\u751f\u62105\u4e2a\u7aef\u70b9&#xff09;<\/li>\n<p>\u672c\u8bb2\u53ea\u7528\u5230APIView&#xff0c;\u662f\u6700\u5e95\u5c42\u7684\u5199\u6cd5\u3002\u540e\u9762\u4f1a\u5347\u7ea7\u5230ViewSet &#043; Router&#xff0c;\u4ee3\u7801\u91cf\u51cf\u5c1170%\u3002<\/p>\n<hr \/>\n<h3>\u4e03\u3001CORS\u9884\u914d\u7f6e&#xff08;M0\u7ea7\u522b&#xff09;<\/h3>\n<p>\u6211\u4eec\u5728Vite\u91cc\u914d\u4e86devServer.proxy\u2014\u2014\u5f00\u53d1\u671f\u80fd\u89e3\u51b3\u8de8\u57df\u3002\u4f46\u751f\u4ea7\u73af\u5883&#xff08;\u524d\u7aef\u90e8\u7f72\u5230shopx.com\u3001\u540e\u7aef\u5728api.shopx.com&#xff09;\u5fc5\u987b\u9760\u771f\u6b63\u7684CORS\u5934\u3002<\/p>\n<h4>\u5b89\u88c5\u4e0e\u914d\u7f6e<\/h4>\n<p>django-cors-headers\u5728INSTALLED_APPS\u548cMIDDLEWARE\u90fd\u6ce8\u518c\u8fc7\u4e86&#xff08;\u89c1base.py&#xff09;\u3002CORS_ALLOWED_ORIGINS\u5217\u51fa\u4e86\u5141\u8bb8\u8de8\u57df\u7684\u524d\u7aef\u6e90\u3002<\/p>\n<h4>\u5de5\u4f5c\u539f\u7406<\/h4>\n<p>\u6d4f\u89c8\u5668\u770b\u5230http:\/\/shopx.com\u8c03http:\/\/api.shopx.com\/api\/v1\/health\/\u65f6&#xff1a;<\/p>\n<li>\u6d4f\u89c8\u5668\u53d1OPTIONS\u9884\u68c0\u8bf7\u6c42<\/li>\n<li>\u540e\u7aef\u68c0\u67e5Origin\u5934\u662f\u5426\u5728\u767d\u540d\u5355<\/li>\n<li>\u5728\u767d\u540d\u5355\u91cc \u2192 \u8fd4\u56deAccess-Control-Allow-Origin: http:\/\/shopx.com<\/li>\n<li>\u6d4f\u89c8\u5668\u653e\u884c\u771f\u5b9e\u8bf7\u6c42<\/li>\n<h4>M0\u7ea7\u522b\u914d\u7684\u5c31\u591f\u5f00\u53d1\u7528\u4e86<\/h4>\n<p>\u5b8c\u6574CORS\u539f\u7406&#xff08;\u542bCookie\u643a\u5e26\u3001\u590d\u6742\u8bf7\u6c42\u3001Origin\u6821\u9a8c\u539f\u7406&#xff09;\u3002<\/p>\n<hr \/>\n<h3>\u516b\u3001\u8dd1\u8d77\u6765\u9a8c\u8bc1<\/h3>\n<h4>\u542f\u52a8\u670d\u52a1<\/h4>\n<p><span class=\"token comment\"># \u786e\u8ba4\u865a\u62df\u73af\u5883\u5df2\u6fc0\u6d3b\u3001\u4f9d\u8d56\u5df2\u88c5<\/span><br \/>\n<span class=\"token builtin class-name\">export<\/span> <span class=\"token assign-left variable\">DJANGO_SETTINGS_MODULE<\/span><span class=\"token operator\">&#061;<\/span>shopx.settings.dev<br \/>\npython manage.py runserver <span class=\"token number\">0.0<\/span>.0.0:8000<\/p>\n<p>\u7ec8\u7aef\u8f93\u51fa&#xff1a;<\/p>\n<p>Watching for file changes with StatReloader<br \/>\nStarting development server at http:\/\/0.0.0.0:8000\/<br \/>\nQuit the server with CONTROL-C.<\/p>\n<h4>\u6d4b\u8bd5\u4e09\u4e2a\u7aef\u70b9<\/h4>\n<p>1. \u5065\u5eb7\u68c0\u67e5\u63a5\u53e3&#xff1a;<\/p>\n<p>\u6d4f\u89c8\u5668\u6253\u5f00 http:\/\/127.0.0.1:8000\/api\/v1\/health\/&#xff0c;\u5e94\u8be5\u770b\u5230&#xff1a;<\/p>\n<p><span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token string-property property\">&#034;status&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;ok&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token string-property property\">&#034;service&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;shopx&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n  <span class=\"token string-property property\">&#034;version&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;0.1.0&#034;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>2. Django Admin\u767b\u5f55\u9875&#xff1a;<\/p>\n<p>\u6d4f\u89c8\u5668\u6253\u5f00http:\/\/127.0.0.1:8000\/admin\/&#xff0c;\u770b\u5230\u767b\u5f55\u9875\u3002\u8d26\u53f7\u8fd8\u6ca1\u5efa&#xff0c;\u5148\u7528\u547d\u4ee4\u884c\u5efa\u4e00\u4e2asuperuser&#xff1a;<\/p>\n<p>python manage.py createsuperuser<br \/>\n<span class=\"token comment\"># \u8f93\u5165\u7528\u6237\u540d\u3001\u90ae\u7bb1\u3001\u5bc6\u7801<\/span><\/p>\n<p>\u7136\u540e\u7528\u8fd9\u4e2a\u8d26\u53f7\u767b\u5f55Admin&#xff0c;\u80fd\u770b\u5230health app\u5df2\u7ecf\u5728\u7ba1\u7406\u754c\u9762\u91cc&#xff08;\u867d\u7136\u6682\u65f6\u7a7a&#xff09;\u3002<\/p>\n<p>3. \u524d\u540e\u7aef\u8054\u8c03&#xff1a;<\/p>\n<p>\u7b2c4\u8bb2\u7684\u524d\u7aef\u53ea\u6e32\u67d3\u4e86\u9759\u6001\u9875\u9762&#xff0c;\u8fd8\u6ca1\u8c03\u8fc7\u540e\u7aef\u3002<\/p>\n<p>\u8fd9\u4e00\u8282\u6211\u4eec\u628aApp.vue\u6539\u4e00\u7248&#xff0c;\u8ba9\u5b83\u542f\u52a8\u65f6\u8bf7\u6c42\/api\/v1\/health\/&#xff0c;\u628a\u540e\u7aef\u8fd4\u56de\u7684\u7248\u672c\u53f7\u663e\u793a\u5728\u9875\u9762\u4e0a\u3002<\/p>\n<p>\u8fd9\u662f\u6574\u4e2a\u4e13\u680f\u7b2c\u4e00\u6b21\u524d\u540e\u7aef\u771f\u5b9e\u901a\u4fe1&#xff0c;\u4e5f\u662fM0\u91cc\u7a0b\u7891\u6700\u5173\u952e\u7684\u9a8c\u8bc1\u3002<\/p>\n<h5>3.1. \u4fee\u6539 frontend\/src\/App.vue<\/h5>\n<p>&lt;script setup lang&#061;&#034;ts&#034;&gt;<br \/>\nimport { ref, onMounted } from &#039;vue&#039;<\/p>\n<p>interface HealthResponse {<br \/>\n  status: string<br \/>\n  service: string<br \/>\n  version: string<br \/>\n}<\/p>\n<p>const year &#061; new Date().getFullYear()<br \/>\nconst health &#061; ref&lt;HealthResponse | null&gt;(null)<br \/>\nconst error &#061; ref&lt;string | null&gt;(null)<\/p>\n<p>onMounted(async () &#061;&gt; {<br \/>\n  try {<br \/>\n    \/\/ \u8d70 Vite proxy&#xff0c;\u5b9e\u9645\u8bf7\u6c42 http:\/\/127.0.0.1:8000\/api\/v1\/health\/<br \/>\n    const res &#061; await fetch(&#039;\/api\/v1\/health\/&#039;)<br \/>\n    if (!res.ok) throw new Error(&#096;HTTP ${res.status}&#096;)<br \/>\n    health.value &#061; await res.json()<br \/>\n  } catch (e) {<br \/>\n    error.value &#061; e instanceof Error ? e.message : String(e)<br \/>\n  }<br \/>\n})<br \/>\n&lt;\/script&gt;<\/p>\n<p>&lt;template&gt;<br \/>\n  &lt;div class&#061;&#034;hello&#034;&gt;<br \/>\n    &lt;div class&#061;&#034;brand&#034;&gt;ShopX&lt;\/div&gt;<br \/>\n    &lt;h1&gt;Hello ShopX&lt;\/h1&gt;<br \/>\n    &lt;p class&#061;&#034;subtitle&#034;&gt;\u4ece\u96f6\u5230\u4e0a\u7ebf \u00b7 \u5168\u6808\u7535\u5546\u9879\u76ee&lt;\/p&gt;<\/p>\n<p>    &lt;div v-if&#061;&#034;health&#034; class&#061;&#034;health ok&#034;&gt;<br \/>\n      \u2705 \u540e\u7aef\u8fde\u63a5\u6210\u529f \u00b7 {{ health.service }} v{{ health.version }}<br \/>\n    &lt;\/div&gt;<br \/>\n    &lt;div v-else-if&#061;&#034;error&#034; class&#061;&#034;health err&#034;&gt;<br \/>\n      \u274c \u540e\u7aef\u8fde\u63a5\u5931\u8d25&#xff1a;{{ error }}<br \/>\n    &lt;\/div&gt;<br \/>\n    &lt;div v-else class&#061;&#034;health loading&#034;&gt;<br \/>\n      \u23f3 \u6b63\u5728\u8fde\u63a5\u540e\u7aef&#8230;<br \/>\n    &lt;\/div&gt;<\/p>\n<p>    &lt;p class&#061;&#034;muted&#034;&gt;\u00a9 {{ year }} \u00b7 \u7b2c 5 \u8bb2\u91cc\u7a0b\u7891&lt;\/p&gt;<br \/>\n  &lt;\/div&gt;<br \/>\n&lt;\/template&gt;<\/p>\n<p>&lt;style scoped&gt;<br \/>\n.hello {<br \/>\n  min-height: 100vh;<br \/>\n  display: flex;<br \/>\n  flex-direction: column;<br \/>\n  align-items: center;<br \/>\n  justify-content: center;<br \/>\n  background: linear-gradient(135deg, #0f1b2d 0%, #1a2a44 100%);<br \/>\n  color: #ffffff;<br \/>\n  font-family: -apple-system, BlinkMacSystemFont, &#039;Segoe UI&#039;, &#039;PingFang SC&#039;, sans-serif;<br \/>\n}<br \/>\n.brand {<br \/>\n  font-size: 18px;<br \/>\n  letter-spacing: 6px;<br \/>\n  color: #ffb020;<br \/>\n  margin-bottom: 24px;<br \/>\n}<br \/>\nh1 {<br \/>\n  font-size: 64px;<br \/>\n  margin: 0 0 16px;<br \/>\n  font-weight: 500;<br \/>\n}<br \/>\n.subtitle {<br \/>\n  font-size: 18px;<br \/>\n  color: #cbd5e1;<br \/>\n  margin: 32px 0;<br \/>\n}<br \/>\n.health {<br \/>\n  padding: 10px 20px;<br \/>\n  border-radius: 8px;<br \/>\n  font-size: 15px;<br \/>\n  margin-bottom: 40px;<br \/>\n}<br \/>\n.health.ok {<br \/>\n  background: rgba(34, 197, 94, 0.15);<br \/>\n  color: #4ade80;<br \/>\n}<br \/>\n.health.err {<br \/>\n  background: rgba(239, 68, 68, 0.15);<br \/>\n  color: #f87171;<br \/>\n}<br \/>\n.health.loading {<br \/>\n  background: rgba(148, 163, 184, 0.15);<br \/>\n  color: #94a3b8;<br \/>\n}<br \/>\n.muted {<br \/>\n  color: #8a93a6;<br \/>\n  font-size: 14px;<br \/>\n}<br \/>\n&lt;\/style&gt;<\/p>\n<h5>3.2. \u786e\u8ba4\u4e24\u4e2a\u670d\u52a1\u90fd\u5728\u8dd1<\/h5>\n<p><span class=\"token comment\"># \u7ec8\u7aef 1&#xff1a;\u540e\u7aef<\/span><br \/>\n<span class=\"token builtin class-name\">cd<\/span> ~\/workspace\/shopx\/backend<br \/>\n<span class=\"token builtin class-name\">source<\/span> <span class=\"token punctuation\">..<\/span>\/.venv\/bin\/activate<br \/>\n<span class=\"token builtin class-name\">export<\/span> <span class=\"token assign-left variable\">DJANGO_SETTINGS_MODULE<\/span><span class=\"token operator\">&#061;<\/span>shopx.settings.dev<br \/>\npython manage.py runserver <span class=\"token number\">0.0<\/span>.0.0:8000<\/p>\n<p><span class=\"token comment\"># \u7ec8\u7aef 2&#xff1a;\u524d\u7aef<\/span><br \/>\n<span class=\"token builtin class-name\">cd<\/span> ~\/workspace\/shopx\/frontend<br \/>\n<span class=\"token function\">pnpm<\/span> dev<\/p>\n<h5>3.3. \u9a8c\u8bc1\u8054\u8c03<\/h5>\n<p>\u6d4f\u89c8\u5668\u6253\u5f00http:\/\/127.0.0.1:5173\/&#xff0c;\u4f60\u5e94\u8be5\u770b\u5230&#xff1a;<\/p>\n<p>ShopX<br \/>\nHello ShopX<br \/>\n\u4ece\u96f6\u5230\u4e0a\u7ebf \u00b7 \u5168\u6808\u7535\u5546\u9879\u76ee<br \/>\n\u2705 \u540e\u7aef\u8fde\u63a5\u6210\u529f \u00b7 shopx v0.1.0<br \/>\n\u00a9 2026 \u00b7 \u7b2c 5 \u8bb2\u91cc\u7a0b\u7891<\/p>\n<p>\u6253\u5f00\u5f00\u53d1\u8005\u5de5\u5177 \u2192 Network\u9762\u677f&#xff0c;\u80fd\u770b\u5230\u4e00\u6761health\/\u8bf7\u6c42&#xff1a;<\/p>\n<ul>\n<li>Request URL: http:\/\/127.0.0.1:5173\/api\/v1\/health\/<\/li>\n<li>Status: 200<\/li>\n<li>Response: {&#034;status&#034;:&#034;ok&#034;,&#034;service&#034;:&#034;shopx&#034;,&#034;version&#034;:&#034;0.1.0&#034;}<\/li>\n<\/ul>\n<p>\u8bf7\u6c42\u5730\u5740\u662f5173\u4e0d\u662f8000\u2014\u2014\u8fd9\u6b63\u662fVite proxy\u5728\u8d77\u4f5c\u7528\u3002Vite\u6536\u5230\/api\/v1\/health\/\u540e&#xff0c;\u8f6c\u53d1\u7ed9http:\/\/127.0.0.1:8000&#xff0c;\u6d4f\u89c8\u5668\u5b8c\u5168\u65e0\u611f&#xff0c;\u4e5f\u5c31\u6ca1\u6709\u8de8\u57df\u95ee\u9898\u3002<\/p>\n<h5>3.4. \u5982\u679c\u770b\u5230\u300c\u274c \u540e\u7aef\u8fde\u63a5\u5931\u8d25\u300d<\/h5>\n<p>\u6309\u987a\u5e8f\u6392\u67e5&#xff1a;<\/p>\n<table>\n<tr>\u73b0\u8c61\u539f\u56e0\u89e3\u51b3<\/tr>\n<tbody>\n<tr>\n<td>HTTP 404<\/td>\n<td>\u540e\u7aefURL\u6ca1\u6302\u4e0a<\/td>\n<td>\u68c0\u67e5shopx\/urls.py\u6709path(&#039;api\/v1\/&#039;, include(&#039;health.urls&#039;))<\/td>\n<\/tr>\n<tr>\n<td>Failed to fetch<\/td>\n<td>\u540e\u7aef\u6ca1\u8dd1&#xff0c;\u6216proxy\u6ca1\u914d<\/td>\n<td>\u786e\u8ba48000\u7aef\u53e3\u80fd\u8bbf\u95ee&#xff1b;\u68c0\u67e5vite.config.ts\u7684server.proxy<\/td>\n<\/tr>\n<tr>\n<td>CORS\u62a5\u9519<\/td>\n<td>\u8bf7\u6c42\u6ca1\u8d70proxy&#xff0c;\u76f4\u63a5\u6253\u52308000<\/td>\n<td>\u786e\u8ba4fetch\u5199\u7684\u662f\/api\/v1\/health\/&#xff0c;\u4e0d\u662fhttp:\/\/127.0.0.1:8000\/api\/v1\/health\/<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#x1f4a1; \u5173\u952e&#xff1a;\u524d\u7aef\u4ee3\u7801\u91cc\u6c38\u8fdc\u5199\u76f8\u5bf9\u8def\u5f84 \/api\/v1\/&#8230;&#xff0c;\u4e0d\u8981\u5199\u5b8c\u6574\u540e\u7aef\u5730\u5740\u3002\u5f00\u53d1\u671f\u9760Vite proxy&#xff0c;\u751f\u4ea7\u671f\u9760Nginx\u53cd\u4ee3&#xff0c;\u524d\u7aef\u4ee3\u7801\u4e0d\u7528\u6539\u3002<\/p>\n<h5>3.5. \u63d0\u4ea4\u8fd9\u4e00\u8282\u7684\u6539\u52a8<\/h5>\n<p><span class=\"token builtin class-name\">cd<\/span> ~\/workspace\/shopx<br \/>\n<span class=\"token function\">git<\/span> <span class=\"token function\">add<\/span> frontend\/src\/App.vue<br \/>\n<span class=\"token function\">git<\/span> commit <span class=\"token parameter variable\">-m<\/span> <span class=\"token string\">&#034;feat(frontend): \u7b2c 005 \u8bb2 App.vue \u63a5\u5165 health \u63a5\u53e3\u5b8c\u6210\u8054\u8c03&#034;<\/span><\/p>\n<p>&#8212;<\/p>\n<p><span class=\"token comment\">## \u4e5d\u3001\u751f\u6210requirements.txt\u9501\u7248\u672c<\/span><\/p>\n<p><span class=\"token variable\"><span class=\"token variable\">&#096;<\/span>pip freeze<span class=\"token variable\">&#096;<\/span><\/span> \u5bfc\u51fa\u6240\u6709\u4f9d\u8d56\u5230 <span class=\"token variable\"><span class=\"token variable\">&#096;<\/span>requirements.txt<span class=\"token variable\">&#096;<\/span><\/span>&#xff1a;<\/p>\n<p>&#096;&#096;&#096;bash<br \/>\npip freeze <span class=\"token operator\">&gt;<\/span> requirements.txt<\/p>\n<p>requirements.txt \u957f\u8fd9\u6837&#xff1a;<\/p>\n<p>Django&#061;&#061;6.1<br \/>\ndjangorestframework&#061;&#061;3.18.x<br \/>\ndjangorestframework-simplejwt&#061;&#061;5.5.x<br \/>\ndjango-cors-headers&#061;&#061;4.9.x<br \/>\npython-decouple&#061;&#061;3.8<br \/>\nmysqlclient&#061;&#061;2.2.x<br \/>\nredis&#061;&#061;6.2.x<br \/>\ncelery&#061;&#061;5.6.x<\/p>\n<p>&#x1f4a1; \u5c0f\u7248\u672c\u53f7&#xff08;x&#xff09;\u968f\u5b89\u5168\u8865\u4e01\u66f4\u65b0&#xff0c;\u4e0d\u5f71\u54cd\u6559\u7a0b\u5185\u5bb9\u3002\u4e4b\u524d\u5df2\u8bf4\u660e&#xff1a;\u672c\u4e13\u680f\u9501\u5b9a\u5927\u7248\u672c&#xff0c;\u5c0f\u7248\u672c\u8ddf\u968f\u6700\u65b0\u8865\u4e01\u3002<\/p>\n<h4>\u4e00\u952e\u8d77\u9879\u76ee\u811a\u672c<\/h4>\n<p>\u65b0\u5efabackend\/run_dev.sh&#xff1a;<\/p>\n<p><span class=\"token shebang important\">#!\/usr\/bin\/env bash<\/span><br \/>\n<span class=\"token builtin class-name\">set<\/span> <span class=\"token parameter variable\">-e<\/span><br \/>\n<span class=\"token builtin class-name\">cd<\/span> <span class=\"token string\">&#034;<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">dirname<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$0<\/span>&#034;<\/span><span class=\"token variable\">)<\/span><\/span>&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">export<\/span> <span class=\"token assign-left variable\">DJANGO_SETTINGS_MODULE<\/span><span class=\"token operator\">&#061;<\/span>shopx.settings.dev<br \/>\npython manage.py runserver <span class=\"token number\">0.0<\/span>.0.0:8000<\/p>\n<p><span class=\"token function\">chmod<\/span> &#043;x run_dev.sh<\/p>\n<p>\u4e0b\u6b21\u542f\u52a8\u76f4\u63a5bash run_dev.sh\u3002<\/p>\n<hr \/>\n<h3>\u5341\u3001\u63d0\u4ea4\u4e0e\u6253tag<\/h3>\n<p>\u6309\u7b2c3\u8bb2\u7684\u63d0\u4ea4\u89c4\u8303&#xff0c;\u672c\u8bb2\u81f3\u5c11\u4e24\u4e2acommit&#xff1a;<\/p>\n<p><span class=\"token builtin class-name\">cd<\/span> ~\/workspace\/shopx<\/p>\n<p><span class=\"token comment\"># \u7b2c\u4e00\u4e2acommit&#xff1a;Django\u5de5\u7a0b\u521d\u59cb\u5316 &#043; settings\u5206\u5c42<\/span><br \/>\n<span class=\"token function\">git<\/span> <span class=\"token function\">add<\/span> backend\/manage.py backend\/shopx backend\/requirements.txt<br \/>\n<span class=\"token function\">git<\/span> commit <span class=\"token parameter variable\">-m<\/span> <span class=\"token string\">&#034;feat(backend): \u7b2c 005 \u8bb2 \u521d\u59cb\u5316 Django \u5de5\u7a0b\u4e0e settings \u5206\u5c42&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u7b2c\u4e8c\u4e2acommit&#xff1a;health app &#043; DRF &#043; CORS\u914d\u7f6e<\/span><br \/>\n<span class=\"token function\">git<\/span> <span class=\"token function\">add<\/span> backend\/health backend\/.env.example backend\/run_dev.sh<br \/>\n<span class=\"token function\">git<\/span> commit <span class=\"token parameter variable\">-m<\/span> <span class=\"token string\">&#034;feat(backend): \u7b2c 005 \u8bb2 health \u63a5\u53e3\u4e0e DRF\/CORS \u63a5\u5165&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u63a8\u9001\u7279\u6027\u5206\u652f<\/span><br \/>\n<span class=\"token function\">git<\/span> push <span class=\"token parameter variable\">-u<\/span> origin feature\/lecture-005-backend-scaffold<\/p>\n<p>\u5408\u5e76\u5230develop&#xff1a;<\/p>\n<p><span class=\"token function\">git<\/span> switch develop<br \/>\n<span class=\"token function\">git<\/span> merge <span class=\"token parameter variable\">&#8211;squash<\/span> feature\/lecture-005-backend-scaffold<br \/>\n<span class=\"token function\">git<\/span> commit <span class=\"token parameter variable\">-m<\/span> <span class=\"token string\">&#034;feat(backend): \u7b2c 005 \u8bb2 Django 5 \u540e\u7aef\u9aa8\u67b6\u4e0e DRF \u63a5\u5165&#034;<\/span><br \/>\n<span class=\"token function\">git<\/span> tag lecture\/005<br \/>\n<span class=\"token function\">git<\/span> push origin develop<br \/>\n<span class=\"token function\">git<\/span> push origin lecture\/005<\/p>\n<p>\u5220\u6389feature\u5206\u652f<\/p>\n<p><span class=\"token function\">git<\/span> branch <span class=\"token parameter variable\">-d<\/span> feature\/lecture-004-frontend-scaffold<br \/>\n<span class=\"token comment\">#\u5220\u9664\u8fdc\u7a0b\u5206\u652f<\/span><br \/>\n<span class=\"token function\">git<\/span> push origin <span class=\"token parameter variable\">&#8211;delete<\/span> feature\/lecture-004-frontend-scaffold<\/p>\n<hr \/>\n<h3>\u5341\u4e00\u3001\u672c\u8bb2\u4f5c\u4e1a<\/h3>\n<li>\u8dd1\u901a\/api\/v1\/health\/<\/li>\n<li>\u521b\u5efasuperuser\u5e76\u767b\u5f55\/admin\/<\/li>\n<li>\u6545\u610f\u628a.env \u91cc\u7684 DB_PASSWORD\u6539\u9519&#xff0c;\u770b\u62a5\u9519\u4fe1\u606f&#xff0c;\u518d\u6539\u56de\u6765\u2014\u2014\u4f53\u9a8c\u4e00\u4e0b\u300c\u5bc6\u7801\u9519\u300d\u7684\u62a5\u9519\u957f\u4ec0\u4e48\u6837<\/li>\n<li>\u8bd5bash run_dev.sh\u4e00\u952e\u542f\u52a8<\/li>\n<li>\u5b8c\u6574\u8dd1\u4e00\u6b21\u300c\u524d5\u8bb2\u91cc\u7a0b\u7891\u300d\u81ea\u68c0&#xff1a;\n<ul>\n<li>\u6d4f\u89c8\u5668\u6253\u5f00 http:\/\/127.0.0.1:5173\/ \u770b\u5230Hello ShopX<\/li>\n<li>\u6d4f\u89c8\u5668\u6253\u5f00 http:\/\/127.0.0.1:8000\/api\/v1\/health\/ \u770b\u5230ok<\/li>\n<li>\u6d4f\u89c8\u5668\u5f00\u53d1\u8005\u5de5\u5177Network\u770b\u5230\u524d\u7aef\u6210\u529f\u8c03\u901a\u540e\u7aef<\/li>\n<\/ul>\n<\/li>\n<li>\u622a\u56fe\u4e09\u4e2a\u753b\u9762&#xff0c;\u5408\u6210\u4e00\u5f20\u300cM0\u91cc\u7a0b\u7891\u6210\u5c31\u300d\u56fe\u53d1\u8bc4\u8bba\u533a<\/li>\n<hr \/>\n<h3>\u5341\u4e8c\u3001\u5e38\u89c1\u62a5\u9519\u901f\u67e5\u8868<\/h3>\n<table>\n<tr>\u62a5\u9519\u539f\u56e0\u89e3\u51b3<\/tr>\n<tbody>\n<tr>\n<td>django-admin: command not found<\/td>\n<td>\u6ca1\u88c5Django\u6216\u6ca1\u6fc0\u6d3b\u865a\u62df\u73af\u5883<\/td>\n<td>pip install &#034;Django&gt;&#061;6.1,&lt;6.2&#034;&#xff0c;\u786e\u8ba4\u7ec8\u7aef\u524d\u7f00\u6709(shopx)<\/td>\n<\/tr>\n<tr>\n<td>mysqlclient\u88c5\u5931\u8d25&#xff1a;mysql_config not found<\/td>\n<td>macOS\u7f3amysql-client<\/td>\n<td>brew install mysql-client pkg-config&#xff0c;\u52a0export PKG_CONFIG_PATH&#061;&#034;\/opt\/homebrew\/opt\/mysql-client\/lib\/pkgconfig&#034;<\/td>\n<\/tr>\n<tr>\n<td>django.db.utils.OperationalError: (1045, &#034;Access denied&#034;)<\/td>\n<td>MySQL\u7528\u6237\u540d\/\u5bc6\u7801\u9519<\/td>\n<td>\u6539.env\u91cc\u7684DB_USER \/ DB_PASSWORD<\/td>\n<\/tr>\n<tr>\n<td>Unknown database &#039;shopx&#039;<\/td>\n<td>\u6570\u636e\u5e93\u6ca1\u5efa<\/td>\n<td>mysql -uroot -p -e &#034;CREATE DATABASE shopx DEFAULT CHARACTER SET utf8mb4;&#034;<\/td>\n<\/tr>\n<tr>\n<td>CORS\u62a5\u9519No &#039;Access-Control-Allow-Origin&#039; header<\/td>\n<td>\u524d\u7aef\u8bbf\u95ee\u540e\u7aef\u4f46CORS_ALLOWED_ORIGINS\u6ca1\u914d<\/td>\n<td>\u68c0\u67e5settings\/base.py\u91cc\u7684origins\u5217\u8868<\/td>\n<\/tr>\n<tr>\n<td>ModuleNotFoundError: No module named &#039;decouple&#039;<\/td>\n<td>python-decouple\u6ca1\u88c5<\/td>\n<td>pip install python-decouple<\/td>\n<\/tr>\n<tr>\n<td>ALLOWED_HOSTS\u62a5\u9519Invalid HTTP_HOST<\/td>\n<td>ALLOWED_HOSTS\u6ca1\u6536\u5f53\u524d\u8bbf\u95ee\u7684\u57df\u540d<\/td>\n<td>dev\u73af\u5883\u5141\u8bb8 [&#039;*&#039;]&#xff0c;prod\u5fc5\u987b\u660e\u786e\u5199\u57df\u540d<\/td>\n<\/tr>\n<tr>\n<td>ModuleNotFoundError: No module named &#039;health&#039;<\/td>\n<td>health app\u6ca1\u6ce8\u518c<\/td>\n<td>INSTALLED_APPS\u91cc\u52a0&#039;health&#039;<\/td>\n<\/tr>\n<tr>\n<td>\u542f\u52a8\u540e\u770b\u5230\u7684\u662fDjango\u6b22\u8fce\u9875\u800c\u4e0d\u662fJSON<\/td>\n<td>URL\u6ca1\u6302\u4e0a<\/td>\n<td>\u68c0\u67e5shopx\/urls.py\u662f\u5426\u6709path(&#039;api\/v1\/&#039;, include(&#039;health.urls&#039;))<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h3>\u5341\u4e09\u3001\u672f\u8bed\u81ea\u67e5\u62a5\u544a<\/h3>\n<ul>\n<li>\u2705 Django 6.1 \/ DRF 3.18.x \u7cbe\u786e\u7248\u672c<\/li>\n<li>\u2705 startproject shopx .\u672b\u5c3e\u7684\u70b9\u542b\u4e49\u5199\u6e05<\/li>\n<li>\u2705 INSTALLED_APPS \/ MIDDLEWARE\u5927\u5c0f\u5199\u6b63\u786e<\/li>\n<li>\u2705 MIDDLEWARE \u987a\u5e8f&#xff1a;CORS\u5fc5\u987b\u5728CommonMiddleware\u4e4b\u524d<\/li>\n<li>\u2705 utf8mb4&#xff08;\u4e0d\u662futf8&#xff09;\u5199\u5168<\/li>\n<li>\u2705 APIView \/ Response\u6765\u81earest_framework<\/li>\n<li>\u2705 python-decouple\u540d\u5b57\u5199\u5bf9&#xff08;\u4e0d\u662fpython_decouple&#xff09;<\/li>\n<li>\u2705 DJANGO_SETTINGS_MODULE\u73af\u5883\u53d8\u91cf\u540d\u5199\u5bf9<\/li>\n<li>\u2705 ALLOWED_HOSTS\u4e0d\u80fd\u7528*\u5728\u751f\u4ea7<\/li>\n<li>\u2705 mysqlclient\u88c5\u5931\u8d25\u539f\u56e0&#xff08;mysql_config not found&#xff09;\u5199\u5bf9<\/li>\n<li>\u2705 CORS\u662f\u300c\u8de8\u6e90\u8d44\u6e90\u5171\u4eab\u300d&#xff08;Cross-Origin Resource Sharing&#xff09;<\/li>\n<li>\u2705 pip freeze &gt; requirements.txt\u9501\u7248\u672c<\/li>\n<li>\u2705 WSGI\u540c\u6b65 \/ ASGI\u5f02\u6b65\u533a\u522b\u4e00\u53e5\u8bdd\u5199\u660e<\/li>\n<li>\u2705 API\u7248\u672c\u53f7\/api\/v1\/\u5199\u660e\u610f\u4e49<\/li>\n<\/ul>\n<p>\u81ea\u67e5\u901a\u8fc7\u3002\u65e0\u7981\u7528\u8bcd\u3002<\/p>\n<h3>\u6700\u540e&#xff1a;M0 \u91cc\u7a0b\u7891&#xff0c;\u4f60\u5df2\u89e3\u9501<\/h3>\n<p>\u5982\u679c\u4f60\u8ddf\u7740\u8dd1\u901a\u4e86health\u63a5\u53e3&#xff0c;\u8bc4\u8bba\u533a\u6253\u5361\u4e00\u53e5&#xff1a;<\/p>\n<p>\u7b2c005\u8bb2\u7b7e\u5230&#xff0c;M0\u91cc\u7a0b\u7891\u5df2\u89e3\u9501<\/p>\n<ul>\n<li>\u70b9\u8d5e&#xff1a;\u8ba9\u66f4\u591a\u6b63\u5728\u642d\u540e\u7aef\u7684\u4eba\u770b\u5230<\/li>\n<li>\u6536\u85cf&#xff1a;\u914dsettings\u5206\u5c42\u3001DRF\u914d\u7f6e\u65f6\u968f\u65f6\u56de\u67e5<\/li>\n<li>\u5173\u6ce8&#xff1a;\u8ffd\u66f4\u4e0d\u8ff7\u8def<\/li>\n<\/ul>\n<p>\u6211\u4eec\u7b2c6\u8bb2\u89c1\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u672c\u8bb2\u662fM0\u91cc\u7a0b\u7891\u7684\u6536\u5b98\u3002\u7b2c4\u8bb2\u524d\u7aef\u80fd\u8dd1&#xff0c;\u7b2c5\u8bb2\u540e\u7aef\u80fd\u8dd1&#xff0c;\u4e0b\u4e00\u8bb2\u5f00\u59cb\u5c31\u662f\u300c\u4e1a\u52a1\u4ee3\u7801\u300d\u4e86\u3002<br \/>\n\u26a0\ufe0f M0\u6210\u5c31\u89e3\u9501&#xff1a;\u8dd1\u901apython manage.py runserver&#xff0c;\u6d4f\u89c8\u5668\u8bbf\u95ee\/api\/v1\/health\/\u8fd4\u56de{\\&#8221;status\\&#8221;: \\&#8221;ok\\&#8221;}\u3002<br \/>\n\u5efa\u8bae\u5148 \u70b9\u8d5e  \u6536\u85cf  \u5173\u6ce8&#xff0c;\u914d settings \u5206\u5c42\u65f6\u968f\u65f6\u56de\u67e5\u3002\u4e00\u3001\u4e3a\u4ec0\u4e48\u7528Django\u800c\u4e0d\u662fFlask<br \/>\n\u5f88\u591a\u65b0\u4eba\u4f1a\u95ee&#xff1a;\u73b0\u5728\u4e0d\u90fd\u7528FastAPI\u4e86<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[890,81,625,292],"topic":[],"class_list":["post-111293","post","type-post","status-publish","format-standard","hentry","category-server","tag-django","tag-python","tag-vue-js","tag-292"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Django + Vue\u7535\u5546\u9879\u76ee\u7b2c005\u8bb2\uff1a\u540e\u7aef\u9aa8\u67b6\uff5cDjango\u521d\u59cb\u5316\u3001\u914d\u7f6e\u5206\u5c42\u4e0eDRF\u63a5\u5165 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/111293.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Django + Vue\u7535\u5546\u9879\u76ee\u7b2c005\u8bb2\uff1a\u540e\u7aef\u9aa8\u67b6\uff5cDjango\u521d\u59cb\u5316\u3001\u914d\u7f6e\u5206\u5c42\u4e0eDRF\u63a5\u5165 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u672c\u8bb2\u662fM0\u91cc\u7a0b\u7891\u7684\u6536\u5b98\u3002\u7b2c4\u8bb2\u524d\u7aef\u80fd\u8dd1&#xff0c;\u7b2c5\u8bb2\u540e\u7aef\u80fd\u8dd1&#xff0c;\u4e0b\u4e00\u8bb2\u5f00\u59cb\u5c31\u662f\u300c\u4e1a\u52a1\u4ee3\u7801\u300d\u4e86\u3002 \u26a0\ufe0f M0\u6210\u5c31\u89e3\u9501&#xff1a;\u8dd1\u901apython manage.py runserver&#xff0c;\u6d4f\u89c8\u5668\u8bbf\u95ee\/api\/v1\/health\/\u8fd4\u56de{&quot;status&quot;: &quot;ok&quot;}\u3002 \u5efa\u8bae\u5148 \u70b9\u8d5e \u6536\u85cf \u5173\u6ce8&#xff0c;\u914d settings \u5206\u5c42\u65f6\u968f\u65f6\u56de\u67e5\u3002\u4e00\u3001\u4e3a\u4ec0\u4e48\u7528Django\u800c\u4e0d\u662fFlask \u5f88\u591a\u65b0\u4eba\u4f1a\u95ee&#xff1a;\u73b0\u5728\u4e0d\u90fd\u7528FastAPI\u4e86\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/111293.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-30T13:40:58+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/111293.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/111293.html\",\"name\":\"Django + Vue\u7535\u5546\u9879\u76ee\u7b2c005\u8bb2\uff1a\u540e\u7aef\u9aa8\u67b6\uff5cDjango\u521d\u59cb\u5316\u3001\u914d\u7f6e\u5206\u5c42\u4e0eDRF\u63a5\u5165 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-09-30T13:40:58+00:00\",\"dateModified\":\"2026-09-30T13:40:58+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/111293.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/111293.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/111293.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Django + Vue\u7535\u5546\u9879\u76ee\u7b2c005\u8bb2\uff1a\u540e\u7aef\u9aa8\u67b6\uff5cDjango\u521d\u59cb\u5316\u3001\u914d\u7f6e\u5206\u5c42\u4e0eDRF\u63a5\u5165\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Django + Vue\u7535\u5546\u9879\u76ee\u7b2c005\u8bb2\uff1a\u540e\u7aef\u9aa8\u67b6\uff5cDjango\u521d\u59cb\u5316\u3001\u914d\u7f6e\u5206\u5c42\u4e0eDRF\u63a5\u5165 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/111293.html","og_locale":"zh_CN","og_type":"article","og_title":"Django + Vue\u7535\u5546\u9879\u76ee\u7b2c005\u8bb2\uff1a\u540e\u7aef\u9aa8\u67b6\uff5cDjango\u521d\u59cb\u5316\u3001\u914d\u7f6e\u5206\u5c42\u4e0eDRF\u63a5\u5165 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u672c\u8bb2\u662fM0\u91cc\u7a0b\u7891\u7684\u6536\u5b98\u3002\u7b2c4\u8bb2\u524d\u7aef\u80fd\u8dd1&#xff0c;\u7b2c5\u8bb2\u540e\u7aef\u80fd\u8dd1&#xff0c;\u4e0b\u4e00\u8bb2\u5f00\u59cb\u5c31\u662f\u300c\u4e1a\u52a1\u4ee3\u7801\u300d\u4e86\u3002 \u26a0\ufe0f M0\u6210\u5c31\u89e3\u9501&#xff1a;\u8dd1\u901apython manage.py runserver&#xff0c;\u6d4f\u89c8\u5668\u8bbf\u95ee\/api\/v1\/health\/\u8fd4\u56de{\"status\": \"ok\"}\u3002 \u5efa\u8bae\u5148 \u70b9\u8d5e \u6536\u85cf \u5173\u6ce8&#xff0c;\u914d settings \u5206\u5c42\u65f6\u968f\u65f6\u56de\u67e5\u3002\u4e00\u3001\u4e3a\u4ec0\u4e48\u7528Django\u800c\u4e0d\u662fFlask \u5f88\u591a\u65b0\u4eba\u4f1a\u95ee&#xff1a;\u73b0\u5728\u4e0d\u90fd\u7528FastAPI\u4e86","og_url":"https:\/\/www.wsisp.com\/helps\/111293.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-09-30T13:40:58+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"11 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/111293.html","url":"https:\/\/www.wsisp.com\/helps\/111293.html","name":"Django + Vue\u7535\u5546\u9879\u76ee\u7b2c005\u8bb2\uff1a\u540e\u7aef\u9aa8\u67b6\uff5cDjango\u521d\u59cb\u5316\u3001\u914d\u7f6e\u5206\u5c42\u4e0eDRF\u63a5\u5165 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-09-30T13:40:58+00:00","dateModified":"2026-09-30T13:40:58+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/111293.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/111293.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/111293.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"Django + Vue\u7535\u5546\u9879\u76ee\u7b2c005\u8bb2\uff1a\u540e\u7aef\u9aa8\u67b6\uff5cDjango\u521d\u59cb\u5316\u3001\u914d\u7f6e\u5206\u5c42\u4e0eDRF\u63a5\u5165"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/111293","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=111293"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/111293\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=111293"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=111293"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=111293"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=111293"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}