[{"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": 132006, "username": "simple2025", "url": "u/simple2025", "website": "", "twitter": "", "psn": "", "github": "", "btc": "", "location": "", "tagline": "", "bio": "", "avatar_mini": "https://cdn.v2ex.com/gravatar/d8be1ee891483e0287a7350aae996608?s=24&d=retro", "avatar_normal": "https://cdn.v2ex.com/gravatar/d8be1ee891483e0287a7350aae996608?s=48&d=retro", "avatar_large": "https://cdn.v2ex.com/gravatar/d8be1ee891483e0287a7350aae996608?s=73&d=retro", "created": 1439177249, "last_modified": 1756361548, "pro": 0}, "last_reply_by": "julyclyde", "last_touched": 1765355047, "title": "Python \u6709\u6ca1\u6709 subprocess \u7684\u66ff\u4ee3\u54c1,\u88ab subprocess \u6298\u817e\u6b7b\u4e86.", "url": "t/1177771", "created": 1765258059, "deleted": 0, "content": "\u7cfb\u7edf\u662f win10,\r\n\r\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\r\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.\r\n\r\n\u73b0\u5728\u9047\u5230\u4e86\u95ee\u9898, \u8c03\u7528 vagrant reload \u6709\u65f6\u5019\u4f1a\u5361\u5728\u90a3\u91cc.\r\n\u6240\u4ee5\u6211\u60f3\u60f3\u8981\u4e0d\u8981\u6dfb\u52a0\u4e00\u4e2a\u8d85\u65f6,\u7136\u540e\u6211\u8bd5\u4e86\u51e0\u79cd\r\n\r\n1. \u4f7f\u7528 subprocess.popen,\u7136\u540e communicate \u90a3\u91cc\u52a0 timeout \u53c2\u6570,\u6ca1\u7528\r\n\r\n2. \u4f7f\u7528 func_timeout \u5e93,\u4e5f\u6ca1\u6709\u7528.\r\n\r\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?", "content_rendered": "

\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
    \n
  1. \n

    \u4f7f\u7528 subprocess.popen,\u7136\u540e communicate \u90a3\u91cc\u52a0 timeout \u53c2\u6570,\u6ca1\u7528

    \n
  2. \n
  3. \n

    \u4f7f\u7528 func_timeout \u5e93,\u4e5f\u6ca1\u6709\u7528.

    \n
  4. \n
\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\u5728\u505a\u4ec0\u4e48

\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

\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/

\n

Feedalyze \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

\n

\u89e3\u51b3\u7684\u95ee\u9898

\n

1 \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

\n

2 \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

\n

3 \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

\n

4 \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

\u4e3a\u4ec0\u4e48\u503c\u5f97\u52a0\u5165\uff1f

\n\n

\u4f60\u5c06\u8d1f\u8d23

\n\n

\u5e0c\u671b\u4f60

\n\n

\u6211\u4eec\u63d0\u4f9b

\n\n

\u6211\u4eec\u6682\u672a\u63d0\u4f9b

\n\n

\u4f46\u6211\u4eec\u63d0\u4f9b\u66f4\u591a

\n\n

\u5907\u6ce8

\n\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
\u6709\u4ec0\u4e48\u76d1\u63a7/\u626b\u63cf\u7a0b\u5e8f\u63a8\u8350\u5417\uff1f python \u8bed\u8a00", "last_modified": 1763916707, "replies": 6, "id": 1174561}, {"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": 288428, "username": "susunus", "url": "u/susunus", "website": null, "twitter": null, "psn": null, "github": null, "btc": null, "location": null, "tagline": null, "bio": null, "avatar_mini": "https://cdn.v2ex.com/gravatar/f3db7707ceed2f547353eede641f5bf8?s=24&d=retro", "avatar_normal": "https://cdn.v2ex.com/gravatar/f3db7707ceed2f547353eede641f5bf8?s=48&d=retro", "avatar_large": "https://cdn.v2ex.com/gravatar/f3db7707ceed2f547353eede641f5bf8?s=73&d=retro", "created": 1517388145, "last_modified": 1762861053, "pro": 0}, "last_reply_by": "Rat3", "last_touched": 1763361550, "title": "\u6709\u611f\u4e8e Golang\uff0c\u5982\u4f55\u7528 3~5 \u4e2a\u95ee\u9898\uff0c\u8bc6\u522b Python \u5f00\u53d1\u8005\u7684\u6280\u672f\u7d20\u517b\uff1f", "url": "t/1173212", "created": 1763348274, "deleted": 0, "content": "\u9762\u8bd5\u548c\u88ab\u9762\u8bd5\u4e2d\uff0c\u5de5\u7a0b\u5316\u80fd\u529b\uff08\u80fd\u5e72\u6d3b\uff09\u3001\u4ea4\u6d41\u80fd\u529b\uff08\u80fd\u914d\u5408\uff09\u3001\u6280\u672f\u6df1\u5ea6\uff08\u89e3\u51b3\u95ee\u9898\u80fd\u529b\uff09\u90fd\u5f88\u91cd\u8981\uff0c\u4f5c\u4e3a\u666e\u901a\u5f00\u53d1\u8005\u666e\u901a\u9762\u8bd5\u5b98\u5e94\u8be5\u600e\u4e48\u505a\u597d\u8fd9\u573a\u9762\u8bd5", "content_rendered": "\u9762\u8bd5\u548c\u88ab\u9762\u8bd5\u4e2d\uff0c\u5de5\u7a0b\u5316\u80fd\u529b\uff08\u80fd\u5e72\u6d3b\uff09\u3001\u4ea4\u6d41\u80fd\u529b\uff08\u80fd\u914d\u5408\uff09\u3001\u6280\u672f\u6df1\u5ea6\uff08\u89e3\u51b3\u95ee\u9898\u80fd\u529b\uff09\u90fd\u5f88\u91cd\u8981\uff0c\u4f5c\u4e3a\u666e\u901a\u5f00\u53d1\u8005\u666e\u901a\u9762\u8bd5\u5b98\u5e94\u8be5\u600e\u4e48\u505a\u597d\u8fd9\u573a\u9762\u8bd5", "last_modified": 1763348274, "replies": 11, "id": 1173212}, {"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": "zbuhui2013", "last_touched": 1764484371, "title": "fastapi tortoise orm \u524d\u7aef\u7ba1\u7406\u6846\u67b6\u6709\u54ea\u4e2a\u597d\u7528\u7684", "url": "t/1173180", "created": 1763344210, "deleted": 0, "content": "\u76ee\u524d\u662f fastapi+tortoise orm \uff0c\u8003\u5bdf\u4e86\u51e0\u4e2a\r\n\r\ndjango admin \u6709\u70b9\u91cd\r\n\r\nfastapi-admin\uff1a \u6298\u817e\u5f97\u5f88\u9ebb\u70e6\uff0c\r\n\r\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", "content_rendered": "

\u76ee\u524d\u662f fastapi+tortoise orm \uff0c\u8003\u5bdf\u4e86\u51e0\u4e2a

\n

django admin \u6709\u70b9\u91cd

\n

fastapi-admin\uff1a \u6298\u817e\u5f97\u5f88\u9ebb\u70e6\uff0c

\n

fastadmin: \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:

\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.\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

\n
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
\n

models/teams.py

\n
from 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
\n

router/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
\n

router/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\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

\n\n

\u53ef\u4ee5\u81ea\u884c TODO / \u4e8c\u6b21\u5f00\u53d1\u7684\u65b9\u5411\u5305\u62ec\uff1a

\n\n

Github \u9879\u76ee\u5730\u5740\uff1a

\n

mcp-filesystem-python

\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