
\u7cfb\u7edf\u662f win10,
\n\u6211\u73b0\u5728\u9047\u5230\u7684\u95ee\u9898,\u6211\u5728 invoke \u91cc\u6709\u4e2a check_alive \u7684\u51fd\u6570,\u91cc\u9762\u662f\u68c0\u67e5\n\u6211\u865a\u62df\u673a\u7684\u67d0\u4e2a\u7f51\u5740\u7f51\u9875\u80fd\u4e0d\u80fd\u8bbf\u95ee,\u5982\u679c\u4e0d\u80fd,\u90a3\u4e48\u8c03\u7528 vagrant reload \u91cd\u542f\u865a\u62df\u673a.
\n\u73b0\u5728\u9047\u5230\u4e86\u95ee\u9898, \u8c03\u7528 vagrant reload \u6709\u65f6\u5019\u4f1a\u5361\u5728\u90a3\u91cc.\n\u6240\u4ee5\u6211\u60f3\u60f3\u8981\u4e0d\u8981\u6dfb\u52a0\u4e00\u4e2a\u8d85\u65f6,\u7136\u540e\u6211\u8bd5\u4e86\u51e0\u79cd
\n\u4f7f\u7528 subprocess.popen,\u7136\u540e communicate \u90a3\u91cc\u52a0 timeout \u53c2\u6570,\u6ca1\u7528
\n\u4f7f\u7528 func_timeout \u5e93,\u4e5f\u6ca1\u6709\u7528.
\n\u4eca\u5929\u53c8\u51fa\u73b0\u4e86,\u6211\u5c1d\u8bd5\u4f7f\u7528 invoke \u7684 run,\u518d\u8bd5\u8bd5,\u4f60\u4eec\u6709\u6ca1\u6709\u4ec0\u4e48\u597d\u7684\u65b9\u6cd5,\u8fd9\u4e2a\u8c03\u7528\u5916\u90e8\u547d\u4ee4\u600e\u4e48\u8fd9\u4e48\u9ebb\u70e6\u5462?
\n", "last_modified": 1765258075, "replies": 24, "id": 1177771}, {"node": {"avatar_large": "https://cdn.v2ex.com/navatar/8613/985e/90_large.png?m=1648339948", "name": "python", "avatar_normal": "https://cdn.v2ex.com/navatar/8613/985e/90_normal.png?m=1648339948", "title": "Python", "url": "go/python", "topics": 16284, "footer": "", "header": "\u8fd9\u91cc\u8ba8\u8bba\u5404\u79cd Python \u8bed\u8a00\u7f16\u7a0b\u8bdd\u9898\uff0c\u4e5f\u5305\u62ec Django\uff0cTornado \u7b49\u6846\u67b6\u7684\u8ba8\u8bba\u3002\u8fd9\u91cc\u662f\u4e00\u4e2a\u80fd\u591f\u5e2e\u52a9\u4f60\u89e3\u51b3\u5b9e\u9645\u95ee\u9898\u7684\u5730\u65b9\u3002", "title_alternative": "Python", "avatar_mini": "https://cdn.v2ex.com/navatar/8613/985e/90_mini.png?m=1648339948", "stars": 10811, "aliases": [], "root": false, "id": 90, "parent_node_name": "programming"}, "member": {"id": 307012, "username": "guoguobaba", "url": "u/guoguobaba", "website": null, "twitter": null, "psn": null, "github": null, "btc": null, "location": null, "tagline": null, "bio": null, "avatar_mini": "https://cdn.v2ex.com/avatar/48a4/7fbb/307012_mini.png?m=1742526918", "avatar_normal": "https://cdn.v2ex.com/avatar/48a4/7fbb/307012_normal.png?m=1742526918", "avatar_large": "https://cdn.v2ex.com/avatar/48a4/7fbb/307012_large.png?m=1742526918", "avatar_xlarge": "https://cdn.v2ex.com/avatar/48a4/7fbb/307012_xlarge.png?m=1742526918", "avatar_xxlarge": "https://cdn.v2ex.com/avatar/48a4/7fbb/307012_xxlarge.png?m=1742526918", "avatar_xxxlarge": "https://cdn.v2ex.com/avatar/48a4/7fbb/307012_xxxlarge.png?m=1742526918", "created": 1523237980, "last_modified": 1742526918, "pro": 0}, "last_reply_by": "powersee", "last_touched": 1764847346, "title": "\u95ee\u4e2a\u6c49\u5b57\u5904\u7406\u7684\u95ee\u9898", "url": "t/1176823", "created": 1764814483, "deleted": 0, "content": "\u6709\u4e2a\u6587\u4ef6\uff0c\u5305\u542b'\u2edd' 11997 \u548c\u98df\u662f\u76f8\u540c\u7684\u5b57\uff0c\u4f46\u662f\u662f\u4e0d\u540c\u7684\u7f16\u7801\uff0c\r\n\r\n\u2edd (U+2EDD)\u548c \u98df (U+98DF)\u7684\u5173\u7cfb\u662f\uff1a\u5b83\u4eec\u662f\u540c\u4e00\u4e2a\u5b57\u7684\u4e0d\u540c\u89c6\u89c9\u8868\u73b0\u5f62\u5f0f\uff0c\u4f46 Unicode \u6307\u5b9a U+98DF \u4e3a\u6807\u51c6\u5f62\u5f0f\uff0cU+2EDD \u4e3a\u5176\u5f02\u4f53\u5f62\u5f0f\uff08\u7279\u522b\u662f\u4f5c\u4e3a\u90e8\u9996\u65f6\uff09\u3002\r\n\r\n\u95ee\u4e86\u4e00\u4e0b AI \uff0c\u90fd\u662f\u8ba9\u679a\u4e3e\u505a\u4e00\u4e2a map \uff0c\u6709\u6ca1\u6709\u7edf\u4e00\u7684\u8f6c\u5316\u8fd9\u6837\u6c49\u5b57\u7684\u65b9\u6848\uff0cunicodedata.normalize \u4e0d\u884c\u3002", "content_rendered": "\u6709\u4e2a\u6587\u4ef6\uff0c\u5305\u542b'\u2edd' 11997 \u548c\u98df\u662f\u76f8\u540c\u7684\u5b57\uff0c\u4f46\u662f\u662f\u4e0d\u540c\u7684\u7f16\u7801\uff0c
\n\u2edd (U+2EDD)\u548c \u98df (U+98DF)\u7684\u5173\u7cfb\u662f\uff1a\u5b83\u4eec\u662f\u540c\u4e00\u4e2a\u5b57\u7684\u4e0d\u540c\u89c6\u89c9\u8868\u73b0\u5f62\u5f0f\uff0c\u4f46 Unicode \u6307\u5b9a U+98DF \u4e3a\u6807\u51c6\u5f62\u5f0f\uff0cU+2EDD \u4e3a\u5176\u5f02\u4f53\u5f62\u5f0f\uff08\u7279\u522b\u662f\u4f5c\u4e3a\u90e8\u9996\u65f6\uff09\u3002
\n\u95ee\u4e86\u4e00\u4e0b AI \uff0c\u90fd\u662f\u8ba9\u679a\u4e3e\u505a\u4e00\u4e2a map \uff0c\u6709\u6ca1\u6709\u7edf\u4e00\u7684\u8f6c\u5316\u8fd9\u6837\u6c49\u5b57\u7684\u65b9\u6848\uff0cunicodedata.normalize \u4e0d\u884c\u3002
\n", "last_modified": 1764814483, "replies": 18, "id": 1176823}, {"node": {"avatar_large": "https://cdn.v2ex.com/navatar/8613/985e/90_large.png?m=1648339948", "name": "python", "avatar_normal": "https://cdn.v2ex.com/navatar/8613/985e/90_normal.png?m=1648339948", "title": "Python", "url": "go/python", "topics": 16284, "footer": "", "header": "\u8fd9\u91cc\u8ba8\u8bba\u5404\u79cd Python \u8bed\u8a00\u7f16\u7a0b\u8bdd\u9898\uff0c\u4e5f\u5305\u62ec Django\uff0cTornado \u7b49\u6846\u67b6\u7684\u8ba8\u8bba\u3002\u8fd9\u91cc\u662f\u4e00\u4e2a\u80fd\u591f\u5e2e\u52a9\u4f60\u89e3\u51b3\u5b9e\u9645\u95ee\u9898\u7684\u5730\u65b9\u3002", "title_alternative": "Python", "avatar_mini": "https://cdn.v2ex.com/navatar/8613/985e/90_mini.png?m=1648339948", "stars": 10811, "aliases": [], "root": false, "id": 90, "parent_node_name": "programming"}, "member": {"id": 438369, "username": "Leon6868", "url": "u/Leon6868", "website": "", "twitter": "", "psn": "", "github": "", "btc": "", "location": "", "tagline": "\u2611 LLM |\u2611 CSS | \u2611 All In Web \u8df5\u884c\u8005", "bio": "", "avatar_mini": "https://cdn.v2ex.com/avatar/14ed/48e6/438369_mini.png?m=1748955348", "avatar_normal": "https://cdn.v2ex.com/avatar/14ed/48e6/438369_normal.png?m=1748955348", "avatar_large": "https://cdn.v2ex.com/avatar/14ed/48e6/438369_large.png?m=1748955348", "created": 1566961594, "last_modified": 1748955348, "pro": 0}, "last_reply_by": "", "last_touched": 1764256051, "title": "\u6709\u54ea\u4e9b Python 3.14 Free-Threading \u591a\u7ebf\u7a0b\u6027\u80fd\u5206\u6790\u65b9\u6848\uff1f", "url": "t/1175519", "created": 1764256051, "deleted": 0, "content": "\u5982\u9898\uff0c\u6ca1\u627e\u5230\u5bf9\u4ee3\u7801\u5165\u4fb5\u5c0f\u3001\u80fd\u5904\u7406\u591a\u7ebf\u7a0b\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u8bf7\u95ee\u5927\u5bb6\u90fd\u662f\u600e\u4e48\u89e3\u51b3\u7684\u5462\uff1f", "content_rendered": "\u5982\u9898\uff0c\u6ca1\u627e\u5230\u5bf9\u4ee3\u7801\u5165\u4fb5\u5c0f\u3001\u80fd\u5904\u7406\u591a\u7ebf\u7a0b\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u8bf7\u95ee\u5927\u5bb6\u90fd\u662f\u600e\u4e48\u89e3\u51b3\u7684\u5462\uff1f
\n", "last_modified": 1764256051, "replies": 0, "id": 1175519}, {"node": {"avatar_large": "https://cdn.v2ex.com/navatar/8613/985e/90_large.png?m=1648339948", "name": "python", "avatar_normal": "https://cdn.v2ex.com/navatar/8613/985e/90_normal.png?m=1648339948", "title": "Python", "url": "go/python", "topics": 16284, "footer": "", "header": "\u8fd9\u91cc\u8ba8\u8bba\u5404\u79cd Python \u8bed\u8a00\u7f16\u7a0b\u8bdd\u9898\uff0c\u4e5f\u5305\u62ec Django\uff0cTornado \u7b49\u6846\u67b6\u7684\u8ba8\u8bba\u3002\u8fd9\u91cc\u662f\u4e00\u4e2a\u80fd\u591f\u5e2e\u52a9\u4f60\u89e3\u51b3\u5b9e\u9645\u95ee\u9898\u7684\u5730\u65b9\u3002", "title_alternative": "Python", "avatar_mini": "https://cdn.v2ex.com/navatar/8613/985e/90_mini.png?m=1648339948", "stars": 10811, "aliases": [], "root": false, "id": 90, "parent_node_name": "programming"}, "member": {"id": 577749, "username": "Daming798", "url": "u/Daming798", "website": "prismray.cn", "twitter": null, "psn": null, "github": null, "btc": null, "location": "", "tagline": "", "bio": "", "avatar_mini": "https://cdn.v2ex.com/avatar/b2b5/a321/577749_mini.png?m=1765431970", "avatar_normal": "https://cdn.v2ex.com/avatar/b2b5/a321/577749_normal.png?m=1765431970", "avatar_large": "https://cdn.v2ex.com/avatar/b2b5/a321/577749_large.png?m=1765431970", "avatar_xlarge": "https://cdn.v2ex.com/avatar/b2b5/a321/577749_xlarge.png?m=1765431970", "avatar_xxlarge": "https://cdn.v2ex.com/avatar/b2b5/a321/577749_xxlarge.png?m=1765431970", "created": 1649401818, "last_modified": 1765431970, "pro": 0}, "last_reply_by": "Daming798", "last_touched": 1764086326, "title": "\u62db\u52df\u4e00\u4f4d FastAPI \u5de5\u7a0b\u5e08\uff0c\u4f5c\u4e3a\u6280\u672f\u4f19\u4f34", "url": "t/1175211", "created": 1764143986, "deleted": 0, "content": "### \u6211\u4eec\u5728\u505a\u4ec0\u4e48\r\n\r\n\u6211\u4eec\u6b63\u9762\u5411\u4e2d\u5c0f\u4f01\u4e1a\u548c\u521d\u521b\u56e2\u961f\uff0c\u505a\u4e00\u6b3e\u4e13\u6ce8\u4e8e\u7528\u6237\u53cd\u9988\u7684\u7ba1\u7406\u5206\u6790\u5de5\u5177 \u2014\u2014 Feedalyze \u3002\r\n\r\n\u5b83\u80fd\u591a\u6e20\u9053\u7edf\u4e00\u6536\u96c6\u3001\u9ad8\u6548\u5904\u7406\u3001\u53ef\u89c6\u5316\u5206\u6790\u7528\u6237\u53cd\u9988\uff0c\u5e2e\u52a9\u4e2d\u5c0f\u4f01\u4e1a\u6d1e\u5bdf\u7528\u6237\u9700\u6c42\uff0c\u52a0\u901f\u4ea7\u54c1\u8fed\u4ee3\u3002\u5730\u5740\uff1a https://feedalyze.com/\r\n\r\nFeedalyze \u5bf9\u6807\u56fd\u5916\u7684 [UserVoice]( https://www.uservoice.com/product) + [Dovetail]( https://dovetail.com/) \uff0c\u5e0c\u671b\u6210\u4e3a\u56fd\u5185\u4f01\u4e1a\u9996\u9009\u7684\u7528\u6237\u53cd\u9988\u7ba1\u7406\u5206\u6790\u5e73\u53f0\u3002\r\n\r\n### \u89e3\u51b3\u7684\u95ee\u9898\r\n\r\n1 \u3001\u4ea7\u54c1\u5f00\u53d1\u8fed\u4ee3\u5e38\u9760\u731c\u6d4b\u6216\u7ecf\u9a8c\uff0c\u800c\u975e\u7528\u6237\u771f\u5b9e\u9700\u6c42\u3002\uff08\u5982\u679c\u53c2\u4e0e\u8fc7\u4e2d\u5c0f\u4f01\u4e1a\u4ea7\u54c1\u7814\u53d1\uff0c\u5c31\u80fd\u7406\u89e3\u8fd9\u70b9\uff09\r\n\r\n2 \u3001\u5728\u6536\u96c6\u3001\u5904\u7406\u548c\u5206\u6790\u7528\u6237\u53cd\u9988\uff0c\u8c03\u67e5\u7528\u6237\u9700\u6c42\u65f6\uff0c\u4f01\u4e1a\u6210\u672c\u9ad8\u6602\r\n\r\n3 \u3001\u96be\u4ee5\u53ca\u65f6\u6d1e\u5bdf\u7528\u6237\u9700\u6c42\uff0c\u5f71\u54cd\u4ea7\u54c1\u8fed\u4ee3\u901f\u5ea6\u548c\u51b3\u7b56\u6b63\u786e\u7387\r\n\r\n4 \u3001\u7f3a\u4e4f\u53ef\u91cf\u5316\u7684\u6570\u636e\u652f\u6491\uff0c\u4ea7\u54c1\u65b9\u5411\u5bb9\u6613\u504f\u79bb\u5e02\u573a\u9700\u6c42\u7b49\r\n\r\n### \u4e3a\u4ec0\u4e48\u503c\u5f97\u52a0\u5165\uff1f\r\n\r\n- \u76ee\u524d\u4ea7\u54c1\u548c demo \u672a\u4e0a\u7ebf\uff0c\u5df2\u6709 50 \u4f59\u4f4d\u8bd5\u7528\u8005\uff0c\u6570\u4f4d\u613f\u610f\u4ed8\u8d39\u7684\u4f01\u4e1a\u7528\u6237\u3002\r\n- \u5e02\u573a\u5de8\u5927\uff0c\u56fd\u5185\u505a\u6b64\u7c7b\u5de5\u5177\u7684\u5f88\u5c11\uff0c\u56fd\u5916\u4ea7\u54c1\u4e0d\u9002\u5e94\u672c\u571f\r\n- \u7c97\u653e\u65f6\u4ee3\u5df2\u8fc7\u53bb\uff0c\u4e14\u5927\u73af\u5883\u4e0d\u4f73\u7684\u60c5\u51b5\u4e0b\uff0c\u7528\u6237\u81f3\u4e0a\u7684\u7406\u5ff5\u6b63\u9010\u6b65\u6df1\u5165\u4f01\u4e1a\r\n- \u5ba2\u6237\u7fa4\u4f53\u6781\u4e3a\u5e7f\u6cdb\uff0c\u9664\u4e92\u8054\u7f51\u884c\u4e1a\u5916\uff0c\u8fd8\u9002\u5408\u5236\u9020\u4e1a\u3001\u96f6\u552e\u4e1a\u3001\u91d1\u878d\u4e1a\u3001\u533b\u836f\u4e1a\u7b49\u7b49\r\n- \u4f60\u5c06\u8d1f\u8d23\u6574\u4e2a\u540e\u7aef\u7684\u6280\u672f\u67b6\u6784\uff0c\u662f\u4ea7\u54c1\u7684\u6838\u5fc3\u6280\u672f\u521b\u5efa\u8005\r\n\r\n### \u4f60\u5c06\u8d1f\u8d23\r\n\r\n- 0-1 \u5229\u7528 FastAPI \u6784\u5efa\u4ea7\u54c1\u540e\u7aef\r\n- \u8d1f\u8d23\u4ea7\u54c1\u7684\u529f\u80fd\u5b9e\u73b0\uff0c\u8c03\u8bd5\u4e0e\u4f18\u5316\r\n- \u6280\u672f\u8def\u7ebf\u89c4\u5212\u53ca\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u7cfb\u7edf\u53ef\u6269\u5c55\u6027\u4e0e\u7a33\u5b9a\u6027\r\n\r\n### \u5e0c\u671b\u4f60\r\n\r\n- \u5728\u676d\u5dde\uff0c\u6709\u4e00\u5230\u4e09\u5e74\u4ee5\u4e0a\u7684 FastAPI \u5f00\u53d1\u7ecf\u9a8c\r\n- \u719f\u6089 PostgreSQL \u3001Redis \u7b49\u5e38\u7528\u6570\u636e\u5e93\r\n- \u826f\u597d\u7684\u7f16\u7a0b\u4e60\u60ef\uff0c\u6ce8\u91cd\u6548\u7387\uff0c\u4e3a\u4eba\u8bda\u5b9e\u5f00\u653e\r\n\r\n### \u6211\u4eec\u63d0\u4f9b\r\n\r\n- **\u5206\u7ea2\u671f\u6743\uff1a**1-3%\uff0c\u4ee5\u603b\u51c0\u5229\u6da6\uff0c\u6309\u6301\u6709\u6bd4\u4f8b\u6bcf\u5e74\u5e95\u5206\u7ea2\r\n- \u7ecf\u8425\uff1a\u4f60\u5c06\u53c2\u4e0e\u516c\u53f8\u7ecf\u8425\uff0c\u6709\u6295\u7968\u6743\r\n- \u9ad8\u5ea6\u81ea\u4e3b\u6743\uff0c\u8d1f\u8d23\u6574\u4e2a\u540e\u7aef\u6280\u672f\u65b9\u5411\r\n- \u85aa\u8d44\uff1a7k \u5de6\u53f3\uff0c\u534a\u5e74\u8c03\u6574\u4e00\u6b21\r\n- \u6210\u4e3a\u4ea7\u54c1\u7684\u6838\u5fc3\u521b\u5efa\u8005\r\n\r\n### \u6211\u4eec\u6682\u672a\u63d0\u4f9b\r\n\r\n- \u4f18\u6e25\u7684\u529e\u516c\u73af\u5883\r\n- \u6781\u4f73\u7684\u786c\u4ef6\u8bbe\u5907\uff08\u4f46\u591f\u7528\uff09\r\n\r\n### \u4f46\u6211\u4eec\u63d0\u4f9b\u66f4\u591a\r\n\r\n- \u4e00\u4e2a\u6301\u6709\u751f\u4ea7\u8d44\u6599\u7684\u673a\u4f1a\r\n- \u4e00\u4e2a\u98ce\u9669\u6781\u4f4e\u7684\u521b\u4e1a\u673a\u4f1a\r\n- \u4e00\u6b21\u521b\u4e1a\u6838\u5fc3\u6210\u5458\u7684\u5c65\u5386\r\n\r\n### \u5907\u6ce8\r\n\r\n- \u4e3a\u4ec0\u4e48\u662f\u5206\u7ea2\u671f\u6743\u800c\u4e0d\u662f\u80a1\u4efd\uff0c\u56e0\u4e3a\u6301\u80a1\u610f\u5473\u7740\u4f60\u4e5f\u8981\u627f\u62c5\u7ecf\u8425\u5931\u8d25\u548c\u4e8f\u635f\u7684\u98ce\u9669\u3002\u5982\u679c\u4f60\u6709\u52c7\u6c14\uff0c\u6211\u5f88\u4e50\u610f\u5c06\u5206\u7ea2\u671f\u6743\u8f6c\u4e3a\u80a1\u4efd\u3002\r\n- 7k \u7684\u85aa\u8d44\u592a\u5783\u573e\u4e86\u3002\u85aa\u8d44\u786e\u5b9e\u4e0d\u9ad8\uff0c\u4f46\u4f60\u62e5\u6709\u5206\u7ea2\u671f\u6743\uff0c\u8fd9\u8fd8\u53ef\u80fd\u662f\u4e00\u6b21\u957f\u8fdc\u89e3\u51b3\u7ecf\u6d4e\u95ee\u9898\u7684\u673a\u4f1a\u3002\u5982\u679c\u671f\u671b\u9ad8\u85aa\u804c\u4f4d\uff0c\u6216\u6709\u7ecf\u6d4e\u538b\u529b\uff0c\u8bf7\u5bfb\u627e\u5176\u5b83\u673a\u4f1a\u3002\r\n- \u4e3a\u4ec0\u4e48\u662f 1-3% \u7684\u603b\u51c0\u5229\u6da6\u4f5c\u4e3a\u5206\u7ea2\u671f\u6743\uff1f\u521b\u4e1a\u521d\u671f\u4f1a\u9047\u5230\u5f88\u591a\u98ce\u9669\uff0c\u4e09\u5e74\u5185\u6211\u4f1a\u5c06 50% \u7684\u51c0\u5229\u6da6\u4f5c\u4e3a\u907f\u9669\u8d44\u91d1\uff0c\u975e\u5230\u5fc5\u8981\u65f6\u523b\u4e0d\u4f1a\u52a8\u300227% \u4f5c\u4e3a\u7ecf\u8425\u8d44\u91d1\uff0c23% \u4f5c\u4e3a\u5168\u4f53\u6210\u5458\u5206\u7ea2\u6c60\uff0c\u6211\u81ea\u5df1\u7684\u5206\u7ea2\u6bd4\u4f8b\u5728 3-5%\u3002\u5982\u679c\u5230\u4e86\u65e0\u53ef\u633d\u56de\u7684\u90a3\u4e00\u5929\uff0c\u6211\u5c06\u628a\u907f\u9669\u8d44\u91d1\u6309\u6bd4\u4f8b\u5206\u914d\u7ed9\u6240\u6709\u6210\u5458\u3002\r\n- \u6709\u610f\u4e49\u7684\u5de5\u4f5c\u548c\u4eba\u9645\u5173\u7cfb\u3002\u6211\u6240\u8ffd\u6c42\u7684\u4e00\u662f\u6709\u610f\u4e49\u7684\u5de5\u4f5c\uff0c\u4e8c\u662f\u6709\u610f\u4e49\u7684\u3001\u6709\u4ef7\u503c\u7684\u56e2\u961f\u4eba\u9645\u5173\u7cfb\uff0c\u8fd9\u662f\u56e2\u961f\u7684\u57fa\u672c\u539f\u5219\u3002\r\n- \u56e2\u961f\u89c4\u6a21\uff1a\u672a\u6765\u5c06\u5c3d\u53ef\u80fd\u514b\u5236\u56e2\u961f\u4eba\u5458\u5728 20 \u4eba\u4ee5\u5185\u3002\r\n- \u521b\u4e1a\u8270\u8f9b\uff1a\u8fd9\u662f\u4e00\u6b21\u82e6\u903c\u7684\u521b\u4e1a\u4e4b\u65c5\uff0c\u9700\u8981\u4e3b\u52a8\u51fa\u51fb\uff0c\u8fce\u63a5\u6311\u6218\u3002\u5728\u6b64\u4e4b\u524d\uff0c\u8bf7\u505a\u597d\u5fc3\u7406\u51c6\u5907\u3002\r\n\r\n\u5982\u679c\u4f60\u5bf9\u8fd9\u4e2a\u673a\u4f1a\u611f\u5174\u8da3\uff0c\u6b22\u8fce\u52a0\u5fae\u4fe1\u4e00\u8d77\u804a\u804a\uff0c\u5403\u4e2a\u996d\u3002\u6dfb\u52a0\u65f6\u8bf7\u5907\u6ce8\uff1a\u59d3\u540d + FastAPI \r\n\r\n\u6211\u7684\u5fae\u4fe1\uff1aM-ing2020", "content_rendered": "\u6211\u4eec\u6b63\u9762\u5411\u4e2d\u5c0f\u4f01\u4e1a\u548c\u521d\u521b\u56e2\u961f\uff0c\u505a\u4e00\u6b3e\u4e13\u6ce8\u4e8e\u7528\u6237\u53cd\u9988\u7684\u7ba1\u7406\u5206\u6790\u5de5\u5177 \u2014\u2014 Feedalyze \u3002
\n\u5b83\u80fd\u591a\u6e20\u9053\u7edf\u4e00\u6536\u96c6\u3001\u9ad8\u6548\u5904\u7406\u3001\u53ef\u89c6\u5316\u5206\u6790\u7528\u6237\u53cd\u9988\uff0c\u5e2e\u52a9\u4e2d\u5c0f\u4f01\u4e1a\u6d1e\u5bdf\u7528\u6237\u9700\u6c42\uff0c\u52a0\u901f\u4ea7\u54c1\u8fed\u4ee3\u3002\u5730\u5740\uff1a https://feedalyze.com/
\nFeedalyze \u5bf9\u6807\u56fd\u5916\u7684 UserVoice + Dovetail \uff0c\u5e0c\u671b\u6210\u4e3a\u56fd\u5185\u4f01\u4e1a\u9996\u9009\u7684\u7528\u6237\u53cd\u9988\u7ba1\u7406\u5206\u6790\u5e73\u53f0\u3002
\n1 \u3001\u4ea7\u54c1\u5f00\u53d1\u8fed\u4ee3\u5e38\u9760\u731c\u6d4b\u6216\u7ecf\u9a8c\uff0c\u800c\u975e\u7528\u6237\u771f\u5b9e\u9700\u6c42\u3002\uff08\u5982\u679c\u53c2\u4e0e\u8fc7\u4e2d\u5c0f\u4f01\u4e1a\u4ea7\u54c1\u7814\u53d1\uff0c\u5c31\u80fd\u7406\u89e3\u8fd9\u70b9\uff09
\n2 \u3001\u5728\u6536\u96c6\u3001\u5904\u7406\u548c\u5206\u6790\u7528\u6237\u53cd\u9988\uff0c\u8c03\u67e5\u7528\u6237\u9700\u6c42\u65f6\uff0c\u4f01\u4e1a\u6210\u672c\u9ad8\u6602
\n3 \u3001\u96be\u4ee5\u53ca\u65f6\u6d1e\u5bdf\u7528\u6237\u9700\u6c42\uff0c\u5f71\u54cd\u4ea7\u54c1\u8fed\u4ee3\u901f\u5ea6\u548c\u51b3\u7b56\u6b63\u786e\u7387
\n4 \u3001\u7f3a\u4e4f\u53ef\u91cf\u5316\u7684\u6570\u636e\u652f\u6491\uff0c\u4ea7\u54c1\u65b9\u5411\u5bb9\u6613\u504f\u79bb\u5e02\u573a\u9700\u6c42\u7b49
\n\u5982\u679c\u4f60\u5bf9\u8fd9\u4e2a\u673a\u4f1a\u611f\u5174\u8da3\uff0c\u6b22\u8fce\u52a0\u5fae\u4fe1\u4e00\u8d77\u804a\u804a\uff0c\u5403\u4e2a\u996d\u3002\u6dfb\u52a0\u65f6\u8bf7\u5907\u6ce8\uff1a\u59d3\u540d + FastAPI
\n\u6211\u7684\u5fae\u4fe1\uff1aM-ing2020
\n", "last_modified": 1764144012, "replies": 2, "id": 1175211}, {"node": {"avatar_large": "https://cdn.v2ex.com/navatar/8613/985e/90_large.png?m=1648339948", "name": "python", "avatar_normal": "https://cdn.v2ex.com/navatar/8613/985e/90_normal.png?m=1648339948", "title": "Python", "url": "go/python", "topics": 16284, "footer": "", "header": "\u8fd9\u91cc\u8ba8\u8bba\u5404\u79cd Python \u8bed\u8a00\u7f16\u7a0b\u8bdd\u9898\uff0c\u4e5f\u5305\u62ec Django\uff0cTornado \u7b49\u6846\u67b6\u7684\u8ba8\u8bba\u3002\u8fd9\u91cc\u662f\u4e00\u4e2a\u80fd\u591f\u5e2e\u52a9\u4f60\u89e3\u51b3\u5b9e\u9645\u95ee\u9898\u7684\u5730\u65b9\u3002", "title_alternative": "Python", "avatar_mini": "https://cdn.v2ex.com/navatar/8613/985e/90_mini.png?m=1648339948", "stars": 10811, "aliases": [], "root": false, "id": 90, "parent_node_name": "programming"}, "member": {"id": 219837, "username": "arnoldnuo", "url": "u/arnoldnuo", "website": "", "twitter": "", "psn": "", "github": "123", "btc": "", "location": "", "tagline": "", "bio": "", "avatar_mini": "https://cdn.v2ex.com/avatar/e65a/afe1/219837_mini.png?m=1759371311", "avatar_normal": "https://cdn.v2ex.com/avatar/e65a/afe1/219837_normal.png?m=1759371311", "avatar_large": "https://cdn.v2ex.com/avatar/e65a/afe1/219837_large.png?m=1759371311", "created": 1489025220, "last_modified": 1759371311, "pro": 0}, "last_reply_by": "kingfighters", "last_touched": 1764237940, "title": "\u4e3a\u4ec0\u4e48 Python \u7684\u5305\u7ba1\u7406\u8fd9\u4e48\u96be\u7528\uff0c\u6bd4 node \u7684 npm \u96be\u7528\u4e00\u4e07\u500d\uff0c\u6bcf\u6b21\u8fdb\u5165\u9879\u76ee\u90fd\u8981\u624b\u52a8\u6267\u884c\u4e00\u4e0b conda activate xxx\uff0c\u96be\u9053\u5c31\u6ca1\u6709\u9ed8\u8ba4\u7684 Python \u9879\u76ee\u7ea7\u522b\u7684\u4f9d\u8d56\u5417\uff1f", "url": "t/1174867", "created": 1764040694, "deleted": 0, "content": "chatgpt \u4e5f\u6ca1\u7ed9\u4e00\u4e2a\u5b9e\u7528\u7684\u65b9\u6848\uff0c\u4f60\u4eec\u90fd\u662f\u600e\u4e48\u7ba1\u7406\u81ea\u5df1\u7684 python \u73af\u5883\u7684\uff1f", "content_rendered": "chatgpt \u4e5f\u6ca1\u7ed9\u4e00\u4e2a\u5b9e\u7528\u7684\u65b9\u6848\uff0c\u4f60\u4eec\u90fd\u662f\u600e\u4e48\u7ba1\u7406\u81ea\u5df1\u7684 python \u73af\u5883\u7684\uff1f
\n", "last_modified": 1764116236, "replies": 77, "id": 1174867}, {"node": {"avatar_large": "https://cdn.v2ex.com/navatar/8613/985e/90_large.png?m=1648339948", "name": "python", "avatar_normal": "https://cdn.v2ex.com/navatar/8613/985e/90_normal.png?m=1648339948", "title": "Python", "url": "go/python", "topics": 16284, "footer": "", "header": "\u8fd9\u91cc\u8ba8\u8bba\u5404\u79cd Python \u8bed\u8a00\u7f16\u7a0b\u8bdd\u9898\uff0c\u4e5f\u5305\u62ec Django\uff0cTornado \u7b49\u6846\u67b6\u7684\u8ba8\u8bba\u3002\u8fd9\u91cc\u662f\u4e00\u4e2a\u80fd\u591f\u5e2e\u52a9\u4f60\u89e3\u51b3\u5b9e\u9645\u95ee\u9898\u7684\u5730\u65b9\u3002", "title_alternative": "Python", "avatar_mini": "https://cdn.v2ex.com/navatar/8613/985e/90_mini.png?m=1648339948", "stars": 10811, "aliases": [], "root": false, "id": 90, "parent_node_name": "programming"}, "member": {"id": 394530, "username": "wxmomomowx", "url": "u/wxmomomowx", "website": "", "twitter": "", "psn": "", "github": "", "btc": "", "location": "", "tagline": "", "bio": "", "avatar_mini": "https://cdn.v2ex.com/gravatar/0f52ae06c426eec78cf5043021132462?s=24&d=retro", "avatar_normal": "https://cdn.v2ex.com/gravatar/0f52ae06c426eec78cf5043021132462?s=48&d=retro", "avatar_large": "https://cdn.v2ex.com/gravatar/0f52ae06c426eec78cf5043021132462?s=73&d=retro", "created": 1553295524, "last_modified": 1670194688, "pro": 0}, "last_reply_by": "wxmomomowx", "last_touched": 1763920307, "title": "\u7f51\u4e0a\u627e\u4e86\u4e2a\u6d41\u51fa\u7684 Python \u7a0b\u5e8f\uff0c\u60f3\u8fc7\u4e0b\u662f\u5426\u88ab\u6c61\u67d3\u4e86 \u90fd\u6709\u4ec0\u4e48\u63a8\u8350\u7684\u529e\u6cd5\u554a\uff1f", "url": "t/1174561", "created": 1763916707, "deleted": 0, "content": "\u7f51\u7ad9/\u7f51\u7edc\u7a0b\u5e8f\u6765\u7684\uff0c\u4f1a\u653e\u5c0f\u9e21\u8dd1\u8dd1\u770b\u3002\r\n\u6709\u4ec0\u4e48\u76d1\u63a7/\u626b\u63cf\u7a0b\u5e8f\u63a8\u8350\u5417\uff1f python \u8bed\u8a00", "content_rendered": "\u7f51\u7ad9/\u7f51\u7edc\u7a0b\u5e8f\u6765\u7684\uff0c\u4f1a\u653e\u5c0f\u9e21\u8dd1\u8dd1\u770b\u3002\u76ee\u524d\u662f fastapi+tortoise orm \uff0c\u8003\u5bdf\u4e86\u51e0\u4e2a
\ndjango admin \u6709\u70b9\u91cd
\nfastapi-admin\uff1a \u6298\u817e\u5f97\u5f88\u9ebb\u70e6\uff0c
\nfastadmin: \u8fd9\u4e2a\u662f\u6700\u7b80\u5355\u7684\uff0c\u4f46\u662f\u529f\u80fd\u6709\u70b9\u7b80\u964b\uff0c\u5f88\u591a\u524d\u7aef\u7684\u529f\u80fd\u6ca1\u6709\u5b9e\u73b0\u3002
\n", "last_modified": 1763344210, "replies": 4, "id": 1173180}, {"node": {"avatar_large": "https://cdn.v2ex.com/navatar/8613/985e/90_large.png?m=1648339948", "name": "python", "avatar_normal": "https://cdn.v2ex.com/navatar/8613/985e/90_normal.png?m=1648339948", "title": "Python", "url": "go/python", "topics": 16284, "footer": "", "header": "\u8fd9\u91cc\u8ba8\u8bba\u5404\u79cd Python \u8bed\u8a00\u7f16\u7a0b\u8bdd\u9898\uff0c\u4e5f\u5305\u62ec Django\uff0cTornado \u7b49\u6846\u67b6\u7684\u8ba8\u8bba\u3002\u8fd9\u91cc\u662f\u4e00\u4e2a\u80fd\u591f\u5e2e\u52a9\u4f60\u89e3\u51b3\u5b9e\u9645\u95ee\u9898\u7684\u5730\u65b9\u3002", "title_alternative": "Python", "avatar_mini": "https://cdn.v2ex.com/navatar/8613/985e/90_mini.png?m=1648339948", "stars": 10811, "aliases": [], "root": false, "id": 90, "parent_node_name": "programming"}, "member": {"id": 722493, "username": "dylyft", "url": "u/dylyft", "website": null, "twitter": null, "psn": null, "github": null, "btc": null, "location": null, "tagline": null, "bio": null, "avatar_mini": "https://cdn.v2ex.com/gravatar/8975f667291303f787181c55b320a651?s=24&d=retro", "avatar_normal": "https://cdn.v2ex.com/gravatar/8975f667291303f787181c55b320a651?s=48&d=retro", "avatar_large": "https://cdn.v2ex.com/gravatar/8975f667291303f787181c55b320a651?s=73&d=retro", "created": 1732773483, "last_modified": 1762742932, "pro": 0}, "last_reply_by": "frostming", "last_touched": 1762833668, "title": "\u5c0f\u767d\u6c42\u6559\u4e2a\u5faa\u73af\u5bfc\u5165\u7684\u95ee\u9898", "url": "t/1171662", "created": 1762745079, "deleted": 0, "content": "\u6700\u8fd1\u521a\u5f00\u59cb\u5b66 python \u548c fastapi, \u6309\u7167 fastapi \u6559\u7a0b\u5b66\u4e60\u65f6\u9047\u5230\u4e2a\u95ee\u9898, \u56e0\u4e3a\u4f7f\u7528 sqlmodel \u7684 relationship, \u5bfc\u81f4\u4e24\u4e2a\u6a21\u578b\u6587\u4ef6\u76f8\u4e92\u5bfc\u5165, \u7136\u540e\u62a5\u9519\u4e86, \u6839\u636e\u5b98\u65b9\u6587\u6863\u7684\u89e3\u51b3\u529e\u6cd5, \u4f7f\u7528 TYPE_CHECKING \u548c\u5b57\u7b26\u4e32\u7248\u672c\u7c7b\u578b\u540e\u6682\u65f6\u89e3\u51b3\u4e86\u62a5\u9519. \r\n\u4f46\u662f\u5f53\u63a5\u53e3\u901a\u8fc7 response_model \u6307\u5b9a\u4e86\u6570\u636e\u6a21\u578b(\u975e\u8868\u6a21\u578b)\u4f5c\u4e3a\u8fd4\u56de\u7c7b\u578b\u65f6, \u53c8\u51fa\u73b0\u4e86\u62a5\u9519, \u62a5\u9519\u63d0\u793a\u5982\u4e0b:\r\n```\r\n`TypeAdapter[typing.Annotated[app.models.teams.TeamPublicWithUser, FieldInfo(annotation=TeamPublicWithUser, required=True)]]` is not fully defined; you should define `typing.Annotated[app.models.teams.TeamPublicWithUser, FieldInfo(annotation=TeamPublicWithUser, required=True)]` and all referenced types, then call `.rebuild()` on the instance.\r\n```\r\n\u6c42\u5404\u4f4d\u5927\u4f6c\u5e2e\u5fd9\u770b\u770b, \u54ea\u91cc\u6709\u95ee\u9898.\r\npython \u7248\u672c\u7528\u7684\u662f 3.12, \u5177\u4f53\u4ee3\u7801\u5982\u4e0b \r\nmodels/users.py\r\n```\r\nfrom typing import TYPE_CHECKING, Any, Optional\r\n\r\nfrom sqlmodel import Field, Relationship, SQLModel\r\n\r\nif TYPE_CHECKING:\r\n from .teams import Team, TeamPublic\r\n\r\n\r\nclass UserBase(SQLModel):\r\n username: str = Field(index=True, max_length=255, unique=True)\r\n email: str | NOne= Field(default=None, index=True, max_length=255)\r\n is_active: bool = True\r\n is_superuser: bool = False\r\n full_name: str | NOne= Field(default=None, max_length=255)\r\n team_id: int | NOne= Field(default=None, foreign_key=\"team.id\")\r\n\r\n\r\nclass User(UserBase, table=True):\r\n id: int | NOne= Field(default=None, primary_key=True)\r\n hashed_password: str\r\n team: Optional[\"Team\"] = Relationship(back_populates=\"members\")\r\n\r\n\r\nclass UserPublic(UserBase):\r\n id: int\r\n\r\n\r\nclass UserPublicWithTeam(UserPublic):\r\n team: Optional[\"TeamPublic\"] = None\r\n```\r\nmodels/teams.py\r\n```\r\nfrom typing import TYPE_CHECKING, Any, List\r\n\r\nfrom sqlmodel import Field, Relationship, SQLModel\r\n\r\nif TYPE_CHECKING:\r\n from .users import User, UserPublic\r\n\r\n\r\nclass TeamBase(SQLModel):\r\n name: str = Field(max_length=255)\r\n\r\n\r\nclass Team(TeamBase, table=True):\r\n id: int | NOne= Field(default=None, primary_key=True)\r\n members: List[\"User\"] = Relationship(back_populates=\"team\")\r\n\r\n\r\nclass TeamPublic(TeamBase):\r\n id: int\r\n\r\n\r\nclass TeamPublicWithUser(TeamPublic):\r\n members: List[\"UserPublic\"] = []\r\n```\r\nrouter/users.py\r\n```\r\n# \u7528\u6237\u76f8\u5173\u63a5\u53e3\r\nfrom sqlmodel import and_, select\r\n\r\nfrom app.api.deps import SessionDep\r\nfrom app.models.users import (\r\n User,\r\n UserPublicWithTeam,\r\n)\r\nfrom app.new_router import new_router\r\n\r\nrouter = new_router(prefix=\"/users\", tags=[\"\u7528\u6237\u7ba1\u7406\"])\r\n\r\n\r\n@router.get(\"/{id}\", summary=\"\u83b7\u53d6\u7528\u6237\u8be6\u60c5\", response_model=UserPublicWithTeam)\r\nasync def get_user_api(db: SessionDep, id: int):\r\n user = db.exec(select(User).where(and_(User.id == id, User.is_active))).first()\r\n return user\r\n```\r\nrouter/teams.py\r\n```\r\n# \u56e2\u961f\u76f8\u5173\u63a5\u53e3\r\nfrom sqlmodel import select\r\n\r\nfrom app.api.deps import SessionDep\r\nfrom app.models.teams import (\r\n Team,\r\n TeamPublicWithUser,\r\n)\r\nfrom app.new_router import new_router\r\n\r\nrouter = new_router(prefix=\"/teams\", tags=[\"\u56e2\u961f\u7ba1\u7406\"])\r\n\r\n\r\n@router.get(\"/{id}\", summary=\"\u83b7\u53d6\u56e2\u961f\u8be6\u60c5\", response_model=TeamPublicWithUser)\r\nasync def get_team_api(db: SessionDep, id: int):\r\n team = db.exec(select(Team).where(Team.id == id)).first()\r\n return team\r\n```", "content_rendered": "\u6700\u8fd1\u521a\u5f00\u59cb\u5b66 python \u548c fastapi, \u6309\u7167 fastapi \u6559\u7a0b\u5b66\u4e60\u65f6\u9047\u5230\u4e2a\u95ee\u9898, \u56e0\u4e3a\u4f7f\u7528 sqlmodel \u7684 relationship, \u5bfc\u81f4\u4e24\u4e2a\u6a21\u578b\u6587\u4ef6\u76f8\u4e92\u5bfc\u5165, \u7136\u540e\u62a5\u9519\u4e86, \u6839\u636e\u5b98\u65b9\u6587\u6863\u7684\u89e3\u51b3\u529e\u6cd5, \u4f7f\u7528 TYPE_CHECKING \u548c\u5b57\u7b26\u4e32\u7248\u672c\u7c7b\u578b\u540e\u6682\u65f6\u89e3\u51b3\u4e86\u62a5\u9519.
\n\u4f46\u662f\u5f53\u63a5\u53e3\u901a\u8fc7 response_model \u6307\u5b9a\u4e86\u6570\u636e\u6a21\u578b(\u975e\u8868\u6a21\u578b)\u4f5c\u4e3a\u8fd4\u56de\u7c7b\u578b\u65f6, \u53c8\u51fa\u73b0\u4e86\u62a5\u9519, \u62a5\u9519\u63d0\u793a\u5982\u4e0b:
`TypeAdapter[typing.Annotated[app.models.teams.TeamPublicWithUser, FieldInfo(annotation=TeamPublicWithUser, required=True)]]` is not fully defined; you should define `typing.Annotated[app.models.teams.TeamPublicWithUser, FieldInfo(annotation=TeamPublicWithUser, required=True)]` and all referenced types, then call `.rebuild()` on the instance.\n\n\u6c42\u5404\u4f4d\u5927\u4f6c\u5e2e\u5fd9\u770b\u770b, \u54ea\u91cc\u6709\u95ee\u9898.\npython \u7248\u672c\u7528\u7684\u662f 3.12, \u5177\u4f53\u4ee3\u7801\u5982\u4e0b
\nmodels/users.py
from typing import TYPE_CHECKING, Any, Optional\n\nfrom sqlmodel import Field, Relationship, SQLModel\n\nif TYPE_CHECKING:\n from .teams import Team, TeamPublic\n\n\nclass UserBase(SQLModel):\n username: str = Field(index=True, max_length=255, unique=True)\n email: str | NOne= Field(default=None, index=True, max_length=255)\n is_active: bool = True\n is_superuser: bool = False\n full_name: str | NOne= Field(default=None, max_length=255)\n team_id: int | NOne= Field(default=None, foreign_key=\"team.id\")\n\n\nclass User(UserBase, table=True):\n id: int | NOne= Field(default=None, primary_key=True)\n hashed_password: str\n team: Optional[\"Team\"] = Relationship(back_populates=\"members\")\n\n\nclass UserPublic(UserBase):\n id: int\n\n\nclass UserPublicWithTeam(UserPublic):\n team: Optional[\"TeamPublic\"] = None\n\nmodels/teams.py
\nfrom typing import TYPE_CHECKING, Any, List\n\nfrom sqlmodel import Field, Relationship, SQLModel\n\nif TYPE_CHECKING:\n from .users import User, UserPublic\n\n\nclass TeamBase(SQLModel):\n name: str = Field(max_length=255)\n\n\nclass Team(TeamBase, table=True):\n id: int | NOne= Field(default=None, primary_key=True)\n members: List[\"User\"] = Relationship(back_populates=\"team\")\n\n\nclass TeamPublic(TeamBase):\n id: int\n\n\nclass TeamPublicWithUser(TeamPublic):\n members: List[\"UserPublic\"] = []\n\nrouter/users.py
\n# \u7528\u6237\u76f8\u5173\u63a5\u53e3\nfrom sqlmodel import and_, select\n\nfrom app.api.deps import SessionDep\nfrom app.models.users import (\n User,\n UserPublicWithTeam,\n)\nfrom app.new_router import new_router\n\nrouter = new_router(prefix=\"/users\", tags=[\"\u7528\u6237\u7ba1\u7406\"])\n\n\n@router.get(\"/{id}\", summary=\"\u83b7\u53d6\u7528\u6237\u8be6\u60c5\", response_model=UserPublicWithTeam)\nasync def get_user_api(db: SessionDep, id: int):\n user = db.exec(select(User).where(and_(User.id == id, User.is_active))).first()\n return user\n\nrouter/teams.py
\n# \u56e2\u961f\u76f8\u5173\u63a5\u53e3\nfrom sqlmodel import select\n\nfrom app.api.deps import SessionDep\nfrom app.models.teams import (\n Team,\n TeamPublicWithUser,\n)\nfrom app.new_router import new_router\n\nrouter = new_router(prefix=\"/teams\", tags=[\"\u56e2\u961f\u7ba1\u7406\"])\n\n\n@router.get(\"/{id}\", summary=\"\u83b7\u53d6\u56e2\u961f\u8be6\u60c5\", response_model=TeamPublicWithUser)\nasync def get_team_api(db: SessionDep, id: int):\n team = db.exec(select(Team).where(Team.id == id)).first()\n return team\n\n", "last_modified": 1762745079, "replies": 8, "id": 1171662}, {"node": {"avatar_large": "https://cdn.v2ex.com/navatar/8613/985e/90_large.png?m=1648339948", "name": "python", "avatar_normal": "https://cdn.v2ex.com/navatar/8613/985e/90_normal.png?m=1648339948", "title": "Python", "url": "go/python", "topics": 16284, "footer": "", "header": "\u8fd9\u91cc\u8ba8\u8bba\u5404\u79cd Python \u8bed\u8a00\u7f16\u7a0b\u8bdd\u9898\uff0c\u4e5f\u5305\u62ec Django\uff0cTornado \u7b49\u6846\u67b6\u7684\u8ba8\u8bba\u3002\u8fd9\u91cc\u662f\u4e00\u4e2a\u80fd\u591f\u5e2e\u52a9\u4f60\u89e3\u51b3\u5b9e\u9645\u95ee\u9898\u7684\u5730\u65b9\u3002", "title_alternative": "Python", "avatar_mini": "https://cdn.v2ex.com/navatar/8613/985e/90_mini.png?m=1648339948", "stars": 10811, "aliases": [], "root": false, "id": 90, "parent_node_name": "programming"}, "member": {"id": 114646, "username": "enrolls", "url": "u/enrolls", "website": "https://pylab.me", "twitter": "", "psn": "", "github": "harmonsir", "btc": "", "location": "", "tagline": "", "bio": "1. \u611f\u8c22\u4f60\u7684\u70b9\u51fb\u4e0e\u5173\u6ce8\u3002\u4e0d\u59a8\u770b\u770b\u4e2a\u4eba\u4e3b\u9875\u6709\u6ca1\u6709\u8ba9\u4f60\u611f\u5174\u8da3\u7684\r\n\r\n2. \u6682\u522bCoding\u754c \u2014\u2014 2023\u590f\r\n\r\n3. \u56fd\u5185\u7684pip\u955c\u50cf\u52a0\u901f\uff0c `pip install -i https://pip.pylab.me/ pip-fc`", "avatar_mini": "https://cdn.v2ex.com/avatar/5e2c/35af/114646_mini.png?m=1763529309", "avatar_normal": "https://cdn.v2ex.com/avatar/5e2c/35af/114646_normal.png?m=1763529309", "avatar_large": "https://cdn.v2ex.com/avatar/5e2c/35af/114646_large.png?m=1763529309", "avatar_xlarge": "https://cdn.v2ex.com/avatar/5e2c/35af/114646_xlarge.png?m=1763529309", "avatar_xxlarge": "https://cdn.v2ex.com/avatar/5e2c/35af/114646_xxlarge.png?m=1763529309", "avatar_xxxlarge": "https://cdn.v2ex.com/avatar/5e2c/35af/114646_xxxlarge.png?m=1763529309", "created": 1430504039, "last_modified": 1763529309, "pro": 0}, "last_reply_by": "enrolls", "last_touched": 1762433333, "title": "\u7528 Python \u5199\u4e86\u4e2a\u5f02\u6b65 MCP Filesystem\uff0c\u5c0f\u800c\u7b80\uff0c\u6b22\u8fce\u62cd\u7816", "url": "t/1171056", "created": 1762429733, "deleted": 0, "content": "\u4e3a\u4ec0\u4e48\u8fd8\u8981\u505a\u4e00\u4e2a MCP Filesystem \u7684 Python \u5b9e\u73b0\uff1f\r\n\r\n\u76ee\u524d MCP \u751f\u6001\u91cc\uff0c\u5f88\u591a\u80fd\u529b\u662f Node.js \u5b9e\u73b0\u7684\uff0cPython \u8fd9\u8fb9\u8981\u4e48\u53ea\u662f\u5c01\u88c5\u4e00\u5c42\uff0c\u8981\u4e48\u504f\u540c\u6b65\u963b\u585e\u3002\u5bf9\u90a3\u79cd\u201c\u6211\u5c31\u60f3\u5199\u4e2a async \u5c0f\u5de5\u5177\u201d\u7684\u573a\u666f\uff0c\u5176\u5b9e\u4e0d\u592a\u53cb\u597d\uff1a\r\n\r\n- \u6574\u6761\u94fe\u8def\u6700\u597d\u90fd\u662f **async I/O**\uff0c\u8ddf\u4e3b\u6d41\u751f\u6001\u5bf9\u9f50 \r\n- \u4e0d\u60f3\u4e3a\u4e86\u8fd9\u70b9\u80fd\u529b\u989d\u5916\u5f15\u4e00\u5806\u4f9d\u8d56 \r\n- \u8fd4\u56de\u7ed3\u6784\u8981\u89c4\u6574\uff0c**\u4eba\u80fd\u770b\u61c2\u8fd8\u4e0d\u591f\uff0cAI \u4e5f\u5f97\u8bfb\u5f97\u8212\u670d**\r\n\r\n\u6240\u4ee5\u5728\u81ea\u5df1\u7684 MCP \u5de5\u5177\u91cc\uff0c\u57fa\u4e8e\u5b98\u65b9\u534f\u8bae\u641e\u4e86\u4e00\u4e2a\u300c\u7cbe\u7b80\u7248\u300d\u5b9e\u73b0\uff0c\u4e3b\u8981\u7279\u70b9\uff1a\r\n\r\n- **\u5f02\u6b65 I/O \u5b9e\u73b0**\uff1a\u63a5\u53e3\u5168\u90e8\u662f `async`\uff0c\u65b9\u4fbf\u76f4\u63a5\u63a5\u5230\u73b0\u6709\u7684 async Web \u6846\u67b6 / \u4efb\u52a1\u7cfb\u7edf \r\n- **\u65e0\u7b2c\u4e09\u65b9\u4f9d\u8d56\uff08\u57fa\u7840\u64cd\u4f5c\uff09**\uff1a\u53ea\u7528\u6807\u51c6\u5e93\uff0c\u9002\u5408\u53d7\u9650\u73af\u5883\u6216\u8005\u7b80\u5355\u811a\u672c\u9879\u76ee \r\n- **\u7ed3\u6784\u4f53\u53cb\u597d**\uff1a\u8fd4\u56de\u4f53\u8bbe\u8ba1\u5f97\u6bd4\u8f83\u89c4\u6574\uff0c\u65b9\u4fbf\u540e\u9762\u518d\u5c01\u88c5\u6210 dataclass / Pydantic \u7b49 \r\n- **\u4ee3\u7801\u7b80\u5355\u6709\u6ce8\u91ca**\uff1a\u903b\u8f91\u523b\u610f\u5199\u5f97\u76f4\u767d\uff0c\u6ca1\u6709\u505a\u91cd\u5ea6\u4f18\u5316\uff0c\u66f4\u9002\u5408 fork \u4e0b\u6765\u6309\u81ea\u5df1\u9700\u6c42\u9b54\u6539\r\n\r\n\r\n\u53ef\u4ee5\u81ea\u884c TODO / \u4e8c\u6b21\u5f00\u53d1\u7684\u65b9\u5411\u5305\u62ec\uff1a\r\n\r\n- \u66f4\u4e25\u683c\u7684\u8bfb\u5199\u4fdd\u8bc1\u4e0e\u9519\u8bef\u5904\u7406\uff08\u91cd\u8bd5\u3001\u9650\u6d41\u3001\u5e42\u7b49\u7b49\uff09 \r\n- \u76ee\u5f55\u8fb9\u754c\u7b56\u7565\u8c03\u6574\uff1a \r\n - \u76ee\u524d\u901a\u8fc7 `DATA_DIR` \u505a\u76ee\u5f55\u6c99\u7bb1\uff0c\u9632\u6b62\u8d8a\u754c\u8bbf\u95ee\uff0c\u907f\u514d\u4e00\u4e0a\u6765\u5c31\u6478\u6574\u4e2a\u78c1\u76d8 \r\n - \u4e5f\u53ef\u4ee5\u6839\u636e\u4e1a\u52a1\u9700\u8981\u53bb\u6389\u6216\u66ff\u6362\u4e3a\u81ea\u5b9a\u4e49\u6839\u76ee\u5f55\u3001\u751a\u81f3\u5f00\u653e\u6574\u76d8\u8bbf\u95ee\r\n\r\n\r\nGithub \u9879\u76ee\u5730\u5740\uff1a\r\n\r\n[mcp-filesystem-python]( https://github.com/harmonsir/mcp-filesystem-python)\r\n\r\n\r\n\u6280\u672f\u542b\u91cf\u4e0d\u591a\uff0c\u7eaf\u7cb9\u6709\u76f8\u540c\u9700\u6c42\u7684\u4eba\u53ef\u4ee5\u4e0d\u7528\u518d\u601d\u8003\u592a\u591a\uff0c\u76f4\u63a5\u7528\uff0c\u4e5f\u53ef\u4ee5\u5f53\u4f5c\u7ec4\u4ef6\u62fc\u63a5\u5230\u5176\u4ed6\u5730\u65b9\u3002", "content_rendered": "\u4e3a\u4ec0\u4e48\u8fd8\u8981\u505a\u4e00\u4e2a MCP Filesystem \u7684 Python \u5b9e\u73b0\uff1f
\n\u76ee\u524d MCP \u751f\u6001\u91cc\uff0c\u5f88\u591a\u80fd\u529b\u662f Node.js \u5b9e\u73b0\u7684\uff0cPython \u8fd9\u8fb9\u8981\u4e48\u53ea\u662f\u5c01\u88c5\u4e00\u5c42\uff0c\u8981\u4e48\u504f\u540c\u6b65\u963b\u585e\u3002\u5bf9\u90a3\u79cd\u201c\u6211\u5c31\u60f3\u5199\u4e2a async \u5c0f\u5de5\u5177\u201d\u7684\u573a\u666f\uff0c\u5176\u5b9e\u4e0d\u592a\u53cb\u597d\uff1a
\n\u6240\u4ee5\u5728\u81ea\u5df1\u7684 MCP \u5de5\u5177\u91cc\uff0c\u57fa\u4e8e\u5b98\u65b9\u534f\u8bae\u641e\u4e86\u4e00\u4e2a\u300c\u7cbe\u7b80\u7248\u300d\u5b9e\u73b0\uff0c\u4e3b\u8981\u7279\u70b9\uff1a
\nasync\uff0c\u65b9\u4fbf\u76f4\u63a5\u63a5\u5230\u73b0\u6709\u7684 async Web \u6846\u67b6 / \u4efb\u52a1\u7cfb\u7edf \u53ef\u4ee5\u81ea\u884c TODO / \u4e8c\u6b21\u5f00\u53d1\u7684\u65b9\u5411\u5305\u62ec\uff1a
\nDATA_DIR \u505a\u76ee\u5f55\u6c99\u7bb1\uff0c\u9632\u6b62\u8d8a\u754c\u8bbf\u95ee\uff0c\u907f\u514d\u4e00\u4e0a\u6765\u5c31\u6478\u6574\u4e2a\u78c1\u76d8 Github \u9879\u76ee\u5730\u5740\uff1a
\n\n\u6280\u672f\u542b\u91cf\u4e0d\u591a\uff0c\u7eaf\u7cb9\u6709\u76f8\u540c\u9700\u6c42\u7684\u4eba\u53ef\u4ee5\u4e0d\u7528\u518d\u601d\u8003\u592a\u591a\uff0c\u76f4\u63a5\u7528\uff0c\u4e5f\u53ef\u4ee5\u5f53\u4f5c\u7ec4\u4ef6\u62fc\u63a5\u5230\u5176\u4ed6\u5730\u65b9\u3002
\n", "last_modified": 1762429733, "replies": 2, "id": 1171056}] ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86