如何爬网易云音乐爬虫的评论数

写个抓取网易云音乐精彩评论的爬虫a year ago赞赏4 人赞赏658收藏分享举报文章被以下专栏收录发现Python之美,主要针对Web开发、Python进阶等{&debug&:false,&apiRoot&:&&,&paySDK&:&https:\u002F\u002Fpay.zhihu.com\u002Fapi\u002Fjs&,&wechatConfigAPI&:&\u002Fapi\u002Fwechat\u002Fjssdkconfig&,&name&:&production&,&instance&:&column&,&tokens&:{&X-XSRF-TOKEN&:null,&X-UDID&:null,&Authorization&:&oauth c3cef7c66aa9e6a1e3160e20&}}{&database&:{&Post&:{&&:{&isPending&:false,&contributes&:[{&sourceColumn&:{&lastUpdated&:,&description&:&和我一起发现Python之美&,&permission&:&COLUMN_PUBLIC&,&memberId&:112267,&contributePermission&:&COLUMN_PUBLIC&,&translatedCommentPermission&:&all&,&canManage&:true,&intro&:&发现Python之美,主要针对Web开发、Python进阶等&,&urlToken&:&python-cn&,&id&:12816,&imagePath&:&v2-16fe083e82f044cc74013ccab68ee282.jpg&,&slug&:&python-cn&,&applyReason&:&0&,&name&:&Python之美&,&title&:&Python之美&,&url&:&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fpython-cn&,&commentPermission&:&COLUMN_ALL_CAN_COMMENT&,&canPost&:true,&created&:,&state&:&COLUMN_NORMAL&,&followers&:31708,&avatar&:{&id&:&v2-16fe083e82f044cc74013ccab68ee282&,&template&:&https:\u002F\u002Fpic2.zhimg.com\u002F{id}_{size}.jpg&},&activateAuthorRequested&:false,&following&:false,&imageUrl&:&https:\u002F\u002Fpic2.zhimg.com\u002Fv2-16fe083e82f044cc74013ccab68ee282_l.jpg&,&articlesCount&:44},&state&:&accepted&,&targetPost&:{&titleImage&:&https:\u002F\u002Fpic2.zhimg.com\u002Fv2-5d9c1f7f4699d56aefd64e6f214ce62d_r.jpg&,&lastUpdated&:,&imagePath&:&v2-5d9c1f7f4699d56aefd64e6f214ce62d.png&,&permission&:&ARTICLE_PUBLIC&,&topics&:[872,],&summary&:&\u003Cb\u003E被寄了律师函,删掉了\u003C\u002Fb\u003E 无耻的广告:\u003Ca href=\&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F\& class=\&\& data-editable=\&true\& data-title=\&《Python Web开发实战》上市了!\&\u003E《Python Web开发实战》上市了!\u003C\u002Fa\u003E\u003Cb\u003E欢迎关注本人的微信公众号获取更多Python相关的内容(也可以直接搜索「Python之美」):\u003C\u002Fb\u003E &,&copyPermission&:&ARTICLE_COPYABLE&,&translatedCommentPermission&:&all&,&likes&:0,&origAuthorId&:0,&publishedTime&:&T20:14:18+08:00&,&sourceUrl&:&&,&urlToken&:,&id&:1167606,&withContent&:false,&slug&:,&bigTitleImage&:false,&title&:&写个抓取网易云音乐精彩评论的爬虫&,&url&:&\u002Fp\u002F&,&commentPermission&:&ARTICLE_ALL_CAN_COMMENT&,&snapshotUrl&:&&,&created&:,&comments&:0,&columnId&:12816,&content&:&&,&parentId&:0,&state&:&ARTICLE_PUBLISHED&,&imageUrl&:&https:\u002F\u002Fpic2.zhimg.com\u002Fv2-5d9c1f7f4699d56aefd64e6f214ce62d_r.jpg&,&author&:{&bio&:&已离开知乎 祝好&,&isFollowing&:false,&hash&:&6d23d8e16eb481ebb5898a4&,&uid&:68,&isOrg&:false,&slug&:&dongweiming&,&isFollowed&:false,&description&:&微信公众号「Python之美」扫码: http:\u002F\u002Ft.cn\u002FRfKGZce&,&name&:&董伟明&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fdongweiming&,&avatar&:{&id&:&&,&template&:&https:\u002F\u002Fpic3.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&memberId&:112267,&excerptTitle&:&&,&voteType&:&ARTICLE_VOTE_CLEAR&},&id&:441372}],&title&:&写个抓取网易云音乐精彩评论的爬虫&,&author&:&dongweiming&,&content&:&\u003Cp\u003E\u003Cb\u003E被寄了律师函,删掉了\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E无耻的广告:\u003Ca href=\&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F\& class=\&internal\&\u003E《Python Web开发实战》上市了!\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E欢迎关注本人的微信公众号获取更多Python相关的内容(也可以直接搜索「Python之美」):\u003C\u002Fb\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cfigure\u003E\u003Cnoscript\u003E\u003Cimg src=\&https:\u002F\u002Fpic3.zhimg.com\u002Fv2-1cc7bd405282afd75e90f54_b.jpg\& data-rawwidth=\&300\& data-rawheight=\&300\& class=\&content_image\& width=\&300\&\u003E\u003C\u002Fnoscript\u003E\u003Cimg src=\&data:image\u002Fsvg+utf8,&svg%20xmlns='http:\u002F\u002Fwww.w3.org\u002FFsvg'%20width='300'%20height='300'&&\u002Fsvg&\& data-rawwidth=\&300\& data-rawheight=\&300\& class=\&content_image lazy\& width=\&300\& data-actualsrc=\&https:\u002F\u002Fpic3.zhimg.com\u002Fv2-1cc7bd405282afd75e90f54_b.jpg\&\u003E\u003C\u002Ffigure\u003E\u003C\u002Fp\u003E&,&updated&:new Date(&T12:14:18.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:52,&collapsedCount&:0,&likeCount&:658,&state&:&published&,&isLiked&:false,&slug&:&&,&lastestTipjarors&:[{&isFollowed&:false,&name&:&Peng&,&headline&:&高度依附互联网的类人生物实体&,&avatarUrl&:&https:\u002F\u002Fpic4.zhimg.com\u002Fv2-5fec51c7ee7cf3a45cadc69_s.jpg&,&isFollowing&:false,&type&:&people&,&slug&:&zheng-fei-peng-32&,&bio&:&不可描述&,&hash&:&515edca32d6f32e942dc38c&,&uid&:96,&isOrg&:false,&description&:&高度依附互联网的类人生物实体&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fzheng-fei-peng-32&,&avatar&:{&id&:&v2-5fec51c7ee7cf3a45cadc69&,&template&:&https:\u002F\u002Fpic4.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&isFollowed&:false,&name&:&唐悠然&,&headline&:&&,&avatarUrl&:&https:\u002F\u002Fpic3.zhimg.com\u002Ffc7fdaad9b40f_s.jpg&,&isFollowing&:false,&type&:&people&,&slug&:&tang-you-ran&,&bio&:&&,&hash&:&8d4f95e5b1e5b7d57d1e7b4c3053428c&,&uid&:60,&isOrg&:false,&description&:&&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Ftang-you-ran&,&avatar&:{&id&:&fc7fdaad9b40f&,&template&:&https:\u002F\u002Fpic3.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&isFollowed&:false,&name&:&伊宁路没有伊宁&,&headline&:&明日客程还几许,沾衣况是新寒雨&,&avatarUrl&:&https:\u002F\u002Fpic2.zhimg.com\u002Fv2-dd50a294780_s.jpg&,&isFollowing&:false,&type&:&people&,&slug&:&chery-casein&,&bio&:&Progressive\u002FDeep\u002FElectro House患者&,&hash&:&d3bbe0c21b8a073caafac&,&uid&:04,&isOrg&:false,&description&:&明日客程还几许,沾衣况是新寒雨&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fchery-casein&,&avatar&:{&id&:&v2-dd50a294780&,&template&:&https:\u002F\u002Fpic2.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&isFollowed&:false,&name&:&心灵捕手&,&headline&:&殊途&,&avatarUrl&:&https:\u002F\u002Fpic1.zhimg.com\u002Fb02a5a8e4eb15a9a01aa41fe_s.jpg&,&isFollowing&:false,&type&:&people&,&slug&:&GodWill&,&bio&:null,&hash&:&6784969bbacfcd0f6aae792&,&uid&:12,&isOrg&:false,&description&:&殊途&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002FGodWill&,&avatar&:{&id&:&b02a5a8e4eb15a9a01aa41fe&,&template&:&https:\u002F\u002Fpic1.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}],&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&https:\u002F\u002Fpic2.zhimg.com\u002Fv2-5d9c1f7f4699d56aefd64e6f214ce62d_r.jpg&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&reviewers&:[],&topics&:[{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&Python&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&爬虫 (计算机网络)&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&Flask&}],&adminClosedComment&:false,&titleImageSize&:{&width&:960,&height&:458},&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&column&:{&slug&:&python-cn&,&name&:&Python之美&},&tipjarState&:&activated&,&tipjarTagLine&:&打赏越多,更新越快&,&sourceUrl&:&&,&pageCommentsCount&:52,&tipjarorCount&:4,&annotationAction&:[],&hasPublishingDraft&:false,&snapshotUrl&:&&,&publishedTime&:&T20:14:18+08:00&,&url&:&\u002Fp\u002F&,&lastestLikers&:[{&bio&:&程序猿\u002F码字者&,&isFollowing&:false,&hash&:&c1e39f66dcf20d380e160e&,&uid&:545000,&isOrg&:false,&slug&:&gugong&,&isFollowed&:false,&description&:&低调的狂徒&,&name&:&新猿人&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fgugong&,&avatar&:{&id&:&13a2c6e9c5f8f6293efc74&,&template&:&https:\u002F\u002Fpic2.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:null,&isFollowing&:false,&hash&:&16e321caaf3bbaaa4cf8cab&,&uid&:162600,&isOrg&:false,&slug&:&da-da-de-shu-mei-pai&,&isFollowed&:false,&description&:&&,&name&:&大大的树莓派&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fda-da-de-shu-mei-pai&,&avatar&:{&id&:&abaf3b67e54af21ad8709ebaa63502a0&,&template&:&https:\u002F\u002Fpic3.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&&,&isFollowing&:false,&hash&:&4cbe5b886fa74b8cfa61edba&,&uid&:935600,&isOrg&:false,&slug&:&gao-lai-39&,&isFollowed&:false,&description&:&&,&name&:&高来&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fgao-lai-39&,&avatar&:{&id&:&b0efc854d4bc553ac709&,&template&:&https:\u002F\u002Fpic3.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&&,&isFollowing&:false,&hash&:&6bbdf3d699c536fdb4ae8d1cad03d51e&,&uid&:96,&isOrg&:false,&slug&:&shi-ruo-fei-97&,&isFollowed&:false,&description&:&&,&name&:&时若非&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fshi-ruo-fei-97&,&avatar&:{&id&:&fac78b909f22f9dfa8a6d08d32d0eb9b&,&template&:&https:\u002F\u002Fpic4.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&学生一个&,&isFollowing&:false,&hash&:&d0e806d6bfa5d852aac3d9&,&uid&:68,&isOrg&:false,&slug&:&xiao-gen-hua&,&isFollowed&:false,&description&:&跨境电商从业者,网络推广的实践者,个人博客:一个理想主义者的内心独白\nhttp:\u002F\u002Fwww.xiaogenhua.com\u002F&,&name&:&肖根华&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fxiao-gen-hua&,&avatar&:{&id&:&v2-fa850efcc7dcd4a78a28f3f&,&template&:&https:\u002F\u002Fpic3.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}],&summary&:&\u003Cb\u003E被寄了律师函,删掉了\u003C\u002Fb\u003E 无耻的广告:\u003Ca href=\&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F\& class=\&\& data-editable=\&true\& data-title=\&《Python Web开发实战》上市了!\&\u003E《Python Web开发实战》上市了!\u003C\u002Fa\u003E\u003Cb\u003E欢迎关注本人的微信公众号获取更多Python相关的内容(也可以直接搜索「Python之美」):\u003C\u002Fb\u003E &,&reviewingCommentsCount&:0,&meta&:{&previous&:{&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&https:\u002F\u002Fpic3.zhimg.com\u002F50\u002F806a2fe75a99fa1c48db72_xl.jpg&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&topics&:[{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&Python&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&Web 开发&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&编程语言&}],&adminClosedComment&:false,&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&author&:{&bio&:&已离开知乎 祝好&,&isFollowing&:false,&hash&:&6d23d8e16eb481ebb5898a4&,&uid&:68,&isOrg&:false,&slug&:&dongweiming&,&isFollowed&:false,&description&:&微信公众号「Python之美」扫码: http:\u002F\u002Ft.cn\u002FRfKGZce&,&name&:&董伟明&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fdongweiming&,&avatar&:{&id&:&&,&template&:&https:\u002F\u002Fpic3.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&column&:{&slug&:&python-cn&,&name&:&Python之美&},&content&:&\u003Cp\u003E除了经常看\u003Ca href=\&https:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fgithub.com\u002Ftrending\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EGithub Trending\u003C\u002Fa\u003E,我还会通过订阅列表等渠道看一些程序员做的有意思的事和分享。之前这个专栏聊过「\u003Ca href=\&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F\& class=\&internal\&\u003EPython书籍推荐\u003C\u002Fa\u003E」和「\u003Ca href=\&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F\& class=\&internal\&\u003E教你阅读Python开源项目代码\u003C\u002Fa\u003E」,今天我们继续,聊聊我的订阅列表和经常去的网站。\u003C\u002Fp\u003E\u003Ch2\u003E\u003Cb\u003E1. \u003Ca href=\&https:\u002F\u002Flink.zhihu.com\u002F?target=http%3A\u002F\u002Fplanetpython.org\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EPlanet Python\u003C\u002Fa\u003E\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E搜集了非常多的Python相关的博客,其中有很多Python的核心开发者 如Georg Brandl、Nick Coghlan、Ajdavis、Benjamin Peterson、David Goodger等。首页也展示了很多有深度的、非常核心的文章。我平时还会关注它上面的\u003Ca href=\&https:\u002F\u002Flink.zhihu.com\u002F?target=http%3A\u002F\u002Fpython-weekly.blogspot.com\u002F\u002Fxxxvii-stackoverflow-python-report.html\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003Estackoverflow python report\u003C\u002Fa\u003E,里面有一些比较有特点和深度的Python相关问题。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ch2\u003E\u003Cb\u003E2. \u003Ca href=\&https:\u002F\u002Flink.zhihu.com\u002F?target=http%3A\u002F\u002Fimportpython.com\u002Fnewsletter\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EImport Python Weekly\u003C\u002Fa\u003E\u002F\u003C\u002Fb\u003E\u003Cb\u003E\u003Ca href=\&https:\u002F\u002Flink.zhihu.com\u002F?target=http%3A\u002F\u002Fwww.pythonweekly.com\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EPython Weekly\u003C\u002Fa\u003E\u003C\u002Fb\u003E\u003Cb\u003E\u002F\u003Ca class=\& wrap external\& href=\&https:\u002F\u002Flink.zhihu.com\u002F?target=http%3A\u002F\u002Fwww.pycoders.com\u002F\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EPycoder’s Weekly\u003C\u002Fa\u003E\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E这是3个Python的订阅列表,每周都会总结一些最近热点的Python新闻、项目和讨论,也会包含一些挖掘到的好的Python相关的文章,经常可以翻到宝贝。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Ch2\u003E\u003Cb\u003E3. \u003Ca href=\&https:\u002F\u002Flink.zhihu.com\u002F?target=http%3A\u002F\u002Ftoutiao.io\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E开发者头条\u003C\u002Fa\u003E\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E我认为这是国内做的最好的程序员分享的平台,建议同学们都去关注一下,里面有一些独家号\u002F或者团队号都有干货分享。内容不仅限于Python。我个人关注了「架构之美」、「运维就精选」、「前端外刊评论」、「腾讯AlloyTeam」等独家号。每天它的精选内容都可以作为学习的参考,我最近看的「\u003Ca href=\&https:\u002F\u002Flink.zhihu.com\u002F?target=http%3A\u002F\u002Ftoutiao.io\u002Fposts\u002F324imi\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E大型web系统数据缓存设计\u003C\u002Fa\u003E」、「\u003Ca href=\&https:\u002F\u002Flink.zhihu.com\u002F?target=http%3A\u002F\u002Ftoutiao.io\u002Fj\u002Fz7484t\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E使用纯 CSS 实现 500px 照片列表布局\u003C\u002Fa\u003E」和「\u003Ca href=\&https:\u002F\u002Flink.zhihu.com\u002F?target=http%3A\u002F\u002Ftoutiao.io\u002Fj\u002Fr2b31c\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E各大互联网公司架构演进之路汇总\u003C\u002Fa\u003E」等文章都让我收获颇多。\u003C\u002Fp\u003E\u003Ch2\u003E\u003Cb\u003E4. \u003Ca href=\&https:\u002F\u002Flink.zhihu.com\u002F?target=http%3A\u002F\u002Fsimple-is-better.com\u002Fsites\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EPython 酷站导航\u003C\u002Fa\u003E\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E很多人不知道怎么找Python老鸟的博客,我给你们一个秘诀。这个网站虽然不咋运营了,但是这个导航页有个「\u003Ca href=\&https:\u002F\u002Flink.zhihu.com\u002F?target=http%3A\u002F\u002Fsimple-is-better.com\u002Fsites\u002Fblogs\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EPython 技术博客\u003C\u002Fa\u003E 」的板块,里面这些博客添加的越早就越'老',你看我才排到86位。这些博客里面很多都很有名,我也会经常去看看他们的状态(虽然不少网站都不能访问了),比如「\u003Ca href=\&https:\u002F\u002Flink.zhihu.com\u002F?target=http%3A\u002F\u002Fwww.the5fire.com\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EThe5fire的技术博客\u003C\u002Fa\u003E」和「\u003Ca href=\&https:\u002F\u002Flink.zhihu.com\u002F?target=http%3A\u002F\u002Fcodingpy.com\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E编程派\u003C\u002Fa\u003E」。\u003C\u002Fp\u003E\u003Cp\u003E无耻的广告:\u003Ca href=\&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F\& class=\&internal\&\u003E《Python Web开发实战》上市了!\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E\u003Cb\u003E欢迎关注本人的微信公众号获取更多Python相关的内容(也可以直接搜索「Python之美」):\u003C\u002Fb\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cfigure\u003E\u003Cimg src=\&https:\u002F\u002Fpic3.zhimg.com\u002Fv2-1cc7bd405282afd75e90f54_b.jpg\& data-rawwidth=\&300\& data-rawheight=\&300\& class=\&content_image\& width=\&300\&\u003E\u003C\u002Ffigure\u003E\u003C\u002Fp\u003E&,&state&:&published&,&sourceUrl&:&&,&pageCommentsCount&:0,&canComment&:false,&snapshotUrl&:&&,&slug&:,&publishedTime&:&T20:40:01+08:00&,&url&:&\u002Fp\u002F&,&title&:&我的Python订阅列表&,&summary&:&除了经常看\u003Ca href=\&https:\u002F\u002Fgithub.com\u002Ftrending\& data-editable=\&true\& data-title=\&Github Trending\&\u003EGithub Trending\u003C\u002Fa\u003E,我还会通过订阅列表等渠道看一些程序员做的有意思的事和分享。之前这个专栏聊过「\u003Ca href=\&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F\& data-editable=\&true\& data-title=\&Python书籍推荐\&\u003EPython书籍推荐\u003C\u002Fa\u003E」和「\u003Ca href=\&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F\& data-editable=\&true\& data-title=\&教你阅读Python开源项目代码\& class=\&\&\u003E教你阅读Python开源项目代码\u003C\u002Fa\u003E」,今天我们继续,聊聊我的订阅列表和经常去的网站。\u003Cb\u003E1. \u003Ca href=\&http:\u002F\u002Fplanetpython.org\u002F\& class=\&\& data-editable=\&true\& data-title=\&Planet Python\&\u003EPlanet Python\u003C\u002Fa\u003E\u003C\u002Fb\u003E搜集了非常多的Python相…&,&reviewingCommentsCount&:0,&meta&:{&previous&:null,&next&:null},&commentPermission&:&anyone&,&commentsCount&:18,&likesCount&:400},&next&:{&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&https:\u002F\u002Fpic1.zhimg.com\u002F50\u002Fv2-4aae1097bca3ce10e360947_xl.jpg&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&topics&:[{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&Python&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&Flask&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&Web 开发&}],&adminClosedComment&:false,&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&author&:{&bio&:&已离开知乎 祝好&,&isFollowing&:false,&hash&:&6d23d8e16eb481ebb5898a4&,&uid&:68,&isOrg&:false,&slug&:&dongweiming&,&isFollowed&:false,&description&:&微信公众号「Python之美」扫码: http:\u002F\u002Ft.cn\u002FRfKGZce&,&name&:&董伟明&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fdongweiming&,&avatar&:{&id&:&&,&template&:&https:\u002F\u002Fpic3.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&column&:{&slug&:&python-cn&,&name&:&Python之美&},&content&:&这是 \u003Ca href=\&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F\& class=\&internal\&\u003E写个抓取网易云音乐精彩评论的爬虫 - Python之美 - 知乎专栏\u003C\u002Fa\u003E 的续篇。本节将主要分享 \u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fgithub.com\u002Fdongweiming\u002Fcommentbox\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EGitHub - dongweiming\u002Fcommentbox: 网易云音乐精彩评论\u003C\u002Fa\u003E 中我使用Flask的考虑以及延伸出来的问题。\u003Ch2\u003E\u003Cb\u003E1. 怎么用扩展\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E在\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=http%3A\u002F\u002Fflask.pocoo.org\u002Fdocs\u002F0.11\u002Fpatterns\u002Fappfactories\u002F%23factories-extensions\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EApplication Factories\u003C\u002Fa\u003E提到了如何用扩展,也就是在create_app内才用init_app初始化对应的扩展。但是我推荐如下方式来组织扩展。首先 创建一个\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fgithub.com\u002Fdongweiming\u002Fcommentbox\u002Fblob\u002Fmaster\u002Fext.py\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003Eext.py\u003C\u002Fa\u003E(叫extensions.py或者其他我也不反对)文件,用来管理全部的扩展:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Efrom flask_mongoengine import MongoEngine\nfrom flask_mako import MakoTemplates, render_template
# noqa\n\ndb = MongoEngine()\nmako = MakoTemplates()\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E同样在create_app里面初始化(\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fgithub.com\u002Fdongweiming\u002Fcommentbox\u002Fblob\u002Fmaster\u002Fapp.py%23L18\& class=\& external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E\u003Cspan class=\&invisible\&\u003Ehttps:\u002F\u002F\u003C\u002Fspan\u003E\u003Cspan class=\&visible\&\u003Egithub.com\u002Fdongweiming\u002F\u003C\u002Fspan\u003E\u003Cspan class=\&invisible\&\u003Ecommentbox\u002Fblob\u002Fmaster\u002Fapp.py#L18\u003C\u002Fspan\u003E\u003Cspan class=\&ellipsis\&\u003E\u003C\u002Fspan\u003E\u003C\u002Fa\u003E):\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-python\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&kn\&\u003Efrom\u003C\u002Fspan\u003E \u003Cspan class=\&nn\&\u003Eext\u003C\u002Fspan\u003E \u003Cspan class=\&kn\&\u003Eimport\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Edb\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Emako\u003C\u002Fspan\u003E\n\n\n\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003Ecreate_app\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E():\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eapp\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EFlask\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003E__name__\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Etemplate_folder\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'templates'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Estatic_folder\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'static'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eapp\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Econfig\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Efrom_object\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Econfig\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Emako\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Einit_app\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eapp\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Edb\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Einit_app\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eapp\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n\n
\u003Cspan class=\&o\&\u003E...\u003C\u002Fspan\u003E\n\n
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eapp\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E举个例子,注意其中的db,我没有用 「from yourapplication.model import db」,而是使用了第三方的ext中import进来的。\u003C\u002Fp\u003E\u003Cp\u003E而在model里面怎么用呢(\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fgithub.com\u002Fdongweiming\u002Fcommentbox\u002Fblob\u002Fmaster\u002Fmodels.py%23L24\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003Ecommentbox\u002Fmodels.py at master · dongweiming\u002Fcommentbox · GitHub\u003C\u002Fa\u003E):\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-python\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&kn\&\u003Efrom\u003C\u002Fspan\u003E \u003Cspan class=\&nn\&\u003Eext\u003C\u002Fspan\u003E \u003Cspan class=\&kn\&\u003Eimport\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Edb\u003C\u002Fspan\u003E\n\n\n\u003Cspan class=\&k\&\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\&nc\&\u003EBaseModel\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Edb\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EDocument\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E\n
\u003Cspan class=\&o\&\u003E...\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E这样就解耦了扩展的使用,也就是不会有相互依赖的问题了,这就是\u003Cb\u003Einit_app\u003C\u002Fb\u003E存在的意义。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E2. 自定义RESTAPI的处理\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E现存的框架比较知名的有django-rest-framework和flask-restapi,但是这些框架我都不太满意,而对于我这个项目用它们还太重了。好吧,手动写一个实现。首先是借用 DispatcherMiddleware 实现对\u002Fj这样的路径特殊处理(\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fgithub.com\u002Fdongweiming\u002Fcommentbox\u002Fblob\u002Fmaster\u002Fapp.py%23L23\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003Ecommentbox\u002Fapp.py at master · dongweiming\u002Fcommentbox · GitHub\u003C\u002Fa\u003E):\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-python\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&kn\&\u003Efrom\u003C\u002Fspan\u003E \u003Cspan class=\&nn\&\u003Ewerkzeug.wsgi\u003C\u002Fspan\u003E \u003Cspan class=\&kn\&\u003Eimport\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EDispatcherMiddleware\u003C\u002Fspan\u003E
\n\n\n\u003Cspan class=\&n\&\u003Eapp\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ewsgi_app\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EDispatcherMiddleware\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eapp\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ewsgi_app\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EOrderedDict\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E((\u003C\u002Fspan\u003E
\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'\u002Fj'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ejson_api\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E),\u003C\u002Fspan\u003E
\n\u003Cspan class=\&p\&\u003E)))\u003C\u002Fspan\u003E
\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E我希望\u002Fj开头的返回的响应都是json格式的内容:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-python\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&kn\&\u003Efrom\u003C\u002Fspan\u003E \u003Cspan class=\&nn\&\u003Eflask\u003C\u002Fspan\u003E \u003Cspan class=\&kn\&\u003Eimport\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EFlask\u003C\u002Fspan\u003E\n\n\n\u003Cspan class=\&k\&\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\&nc\&\u003EApiFlask\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EFlask\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003Emake_response\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Erv\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Eif\u003C\u002Fspan\u003E \u003Cspan class=\&nb\&\u003Eisinstance\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Erv\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&nb\&\u003Edict\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Eif\u003C\u002Fspan\u003E \u003Cspan class=\&s1\&\u003E'r'\u003C\u002Fspan\u003E \u003Cspan class=\&ow\&\u003Enot\u003C\u002Fspan\u003E \u003Cspan class=\&ow\&\u003Ein\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Erv\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E
\u003Cspan class=\&n\&\u003Erv\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'r'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E]\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&mi\&\u003E1\u003C\u002Fspan\u003E
\u003Cspan class=\&n\&\u003Erv\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EApiResult\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Erv\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Eif\u003C\u002Fspan\u003E \u003Cspan class=\&nb\&\u003Eisinstance\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Erv\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EApiResult\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Erv\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eto_response\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EFlask\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Emake_response\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Erv\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E
\n\u003Cspan class=\&n\&\u003Ejson_api\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EApiFlask\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003E__name__\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E
\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E其中返回了一个额外的字段r, 如果是0表示响应的结果是正确的,为1表示响应的内容有问题。\u003C\u002Fp\u003E\u003Cp\u003E接着我们自定义错误处理的方式,比如404返回这样:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-python\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Emessage\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&s2\&\u003E\&Not Found\&\u003C\u002Fspan\u003E\n\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E怎么实现呢:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-python\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&kn\&\u003Efrom\u003C\u002Fspan\u003E \u003Cspan class=\&nn\&\u003Eflask\u003C\u002Fspan\u003E \u003Cspan class=\&kn\&\u003Eimport\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ejson\u003C\u002Fspan\u003E
\n\u003Cspan class=\&kn\&\u003Efrom\u003C\u002Fspan\u003E \u003Cspan class=\&nn\&\u003Ewerkzeug.wrappers\u003C\u002Fspan\u003E \u003Cspan class=\&kn\&\u003Eimport\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EResponse\u003C\u002Fspan\u003E
\n\u003Cspan class=\&k\&\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\&nc\&\u003EApiResult\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&nb\&\u003Eobject\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Evalue\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Estatus\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E200\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E
\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Evalue\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Evalue\u003C\u002Fspan\u003E
\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Estatus\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Estatus\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003Eto_response\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EResponse\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ejson\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Edumps\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Evalue\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E),\u003C\u002Fspan\u003E
\u003Cspan class=\&n\&\u003Estatus\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Estatus\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E
\u003Cspan class=\&n\&\u003Emimetype\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'application\u002Fjson'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E
\n\u003Cspan class=\&k\&\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\&nc\&\u003EApiException\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&ne\&\u003EException\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Emessage\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Estatus\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E400\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E
\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Emessage\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Emessage\u003C\u002Fspan\u003E
\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Estatus\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Estatus\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003Eto_result\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EApiResult\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E({\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'message'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Emessage\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&s1\&\u003E'r'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&mi\&\u003E1\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E},\u003C\u002Fspan\u003E
\u003Cspan class=\&n\&\u003Estatus\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Estatus\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n\n\n\u003Cspan class=\&nd\&\u003E@json_api.errorhandler\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EApiException\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E
\n\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003Eapi_error_handler\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eerror\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eerror\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eto_result\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E
\n\u003Cspan class=\&nd\&\u003E@json_api.errorhandler\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E403\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E
\n\u003Cspan class=\&nd\&\u003E@json_api.errorhandler\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E404\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E
\n\u003Cspan class=\&nd\&\u003E@json_api.errorhandler\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E500\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E
\n\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003Eerror_handler\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eerror\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Eif\u003C\u002Fspan\u003E \u003Cspan class=\&nb\&\u003Ehasattr\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eerror\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&s1\&\u003E'name'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E
\u003Cspan class=\&n\&\u003Emsg\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eerror\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ename\u003C\u002Fspan\u003E
\u003Cspan class=\&n\&\u003Ecode\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eerror\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ecode\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Eelse\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E
\u003Cspan class=\&n\&\u003Emsg\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eerror\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Emessage\u003C\u002Fspan\u003E
\u003Cspan class=\&n\&\u003Ecode\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&mi\&\u003E500\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EApiResult\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E({\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'message'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Emsg\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E},\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Estatus\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ecode\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E
\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E而且响应也被封装了:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-python\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003Esuccess\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eres\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003ENone\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Estatus_code\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E200\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E
\u003Cspan class=\&n\&\u003Eres\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eres\u003C\u002Fspan\u003E \u003Cspan class=\&ow\&\u003Eor\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{}\u003C\u002Fspan\u003E
\u003Cspan class=\&n\&\u003Edct\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E
\u003Cspan class=\&s1\&\u003E'r'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&mi\&\u003E1\u003C\u002Fspan\u003E
\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Eif\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eres\u003C\u002Fspan\u003E \u003Cspan class=\&ow\&\u003Eand\u003C\u002Fspan\u003E \u003Cspan class=\&nb\&\u003Eisinstance\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eres\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&nb\&\u003Edict\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E
\u003Cspan class=\&n\&\u003Edct\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eupdate\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eres\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EApiResult\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Edct\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Estatus_code\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E
\n\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003Efailure\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Emessage\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Estatus_code\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E
\u003Cspan class=\&n\&\u003Edct\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E
\u003Cspan class=\&s1\&\u003E'r'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&mi\&\u003E0\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E
\u003Cspan class=\&s1\&\u003E'status'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Estatus_code\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E
\u003Cspan class=\&s1\&\u003E'message'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Emessage\u003C\u002Fspan\u003E
\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Edct\u003C\u002Fspan\u003E
\n\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003Eupdated\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eres\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003ENone\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Esuccess\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eres\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eres\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Estatus_code\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E204\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E
\n\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003Ebad_request\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Emessage\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eres\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003ENone\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Efailure\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Emessage\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&mi\&\u003E400\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E使用的时候可以让返回的正确和错误结果的格式都保持统一。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E3. Redis序列化\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E我使用了mongoengine处理model,但是为了给后端减少压力,所以使用Redis缓存结果。大家知道Redis支持了很多数据结构,对我来说,其实是可以满足的,但是为了演示如何存储复杂对象,单个文档对象缓存的是序列化之后的结果,也就是一个字符串(\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fgithub.com\u002Fdongweiming\u002Fcommentbox\u002Fblob\u002Fmaster\u002Fmodels.py%23L42\& class=\& external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E\u003Cspan class=\&invisible\&\u003Ehttps:\u002F\u002F\u003C\u002Fspan\u003E\u003Cspan class=\&visible\&\u003Egithub.com\u002Fdongweiming\u002F\u003C\u002Fspan\u003E\u003Cspan class=\&invisible\&\u003Ecommentbox\u002Fblob\u002Fmaster\u002Fmodels.py#L42\u003C\u002Fspan\u003E\u003Cspan class=\&ellipsis\&\u003E\u003C\u002Fspan\u003E\u003C\u002Fa\u003E):\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-python\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ecache\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eset\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ekey\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ers\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eto_json\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E())\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E取的时候这样(\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fgithub.com\u002Fdongweiming\u002Fcommentbox\u002Fblob\u002Fmaster\u002Fmodels.py%23L38\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003Ecommentbox\u002Fmodels.py at master · dongweiming\u002Fcommentbox · GitHub\u003C\u002Fa\u003E):\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-python\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ers\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ecache\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eget\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ekey\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n\u003Cspan class=\&k\&\u003Eif\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ers\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ecls\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Efrom_json\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ers\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E其中from_json和to_json都是mongoengine自带的,希望对大家在业务中的使用有启发。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E4. local_settings.py\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003Elocal_settings.py在豆瓣被广泛的使用,一般的Flask应用都会有一个config.py文件,包含一些配置,它会被放进版本库。但是线上和测试环境其中的一些设置是不一样的,比如DEBUG在线上一定是False,但是在测试环境就是True。 那么可以在config.py这么用(\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fgithub.com\u002Fdongweiming\u002Fcommentbox\u002Fblob\u002Fmaster\u002Fconfig.py%23L17\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003Ecommentbox\u002Fconfig.py at master · dongweiming\u002Fcommentbox · GitHub\u003C\u002Fa\u003E):\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-python\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EDEBUG\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&bp\&\u003EFalse\u003C\u002Fspan\u003E\n\n\u003Cspan class=\&k\&\u003Etry\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E\n
\u003Cspan class=\&kn\&\u003Efrom\u003C\u002Fspan\u003E \u003Cspan class=\&nn\&\u003Elocal_settings\u003C\u002Fspan\u003E \u003Cspan class=\&kn\&\u003Eimport\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E*\u003C\u002Fspan\u003E
\u003Cspan class=\&c1\&\u003E# noqa\u003C\u002Fspan\u003E\n\u003Cspan class=\&k\&\u003Eexcept\u003C\u002Fspan\u003E \u003Cspan class=\&ne\&\u003EImportError\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Epass\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E假如存在local_settings.py,那么配置就被会覆盖了,而local_settings.py就是在特定环境下才存在的。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E5. 使用Mako\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E豆瓣在我印象里面好像都是没人使用Jinja2的。Mako是另一个知名模板语言,它有如下优点:
\u003C\u002Fp\u003E\u003Cp\u003E1. 性能和Jinja2相近,这一点[Jinja2也承认](\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=http%3A\u002F\u002Fbit.ly\u002F28RvFiM\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EFrequently Asked Questions\u003C\u002Fa\u003E)。 \u003C\u002Fp\u003E\u003Cp\u003E2. 有大型网站在使用,有质量保证。Reddit在2011年的月PV就达到10亿,豆瓣几乎全部用户产品都使用Mako模板,所以不需要担心没有大公司使用的案例。 \u003C\u002Fp\u003E\u003Cp\u003E3. 有知名Web框架支持。Pylons和Pyramid这两个Web框架内置Mako,而且把它作为默认模板。\u003C\u002Fp\u003E\u003Cp\u003E4. 支持在模板中写几乎原生的Python语法的代码,对Python工程师友好,我已经见过多个人来了豆瓣爱上Mako而抛弃Jinja2的例子了。
\u003C\u002Fp\u003E\u003Cp\u003E5. 自带完整的缓存系统。Mako提供非常好的扩展接口,很容易切换成其他的缓存系统。
\u003C\u002Fp\u003E\u003Cp\u003EJinja2和Mako的设计哲学有一点不同:Jinja2认为应该尽可能把逻辑从模板中移除,界限清晰,不允许在模板内写Python代码,也不支持全部的Python内置函数(只提供了很有限、最常用的一部分);而Mako正好相反,它最后会编译成Python代码以达到性能最优,在模板里面可以自由写后端逻辑,不需要传递就可以使用Python自带的数据结构和内置类。Jinja2带来的好处是模板引擎易于维护,并且模板有更好的可读性;而Mako是一个对Python工程师非常友好的语言,限制很少,完成模板开发工作时更有效率,整个项目的代码可维护性更好。
\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E6. 合理使用Flask提供的资源。\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E这并不是这个项目中用到的实践。我在豆瓣东西的一个后台项目看到过这样用蓝图:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Eimport views.story.user_story\nimport views.story.rec_pool\nimport views.story.export\nimport views.story.similar\n... 省略了剩下的几十个import\n\n\ndef create_app():\n
app.register_blueprint(\n
views.story.user_story.bp, url_prefix=\&\u002Fstory\u002Fuser_story\&)\n
app.register_blueprint(\n
views.story.rec_pool.bp, url_prefix=\&\u002Fstory\u002Frec_pool\&)\n
app.register_blueprint(\n
views.story.export.bp, url_prefix=\&\u002Fstory\u002Fexport\&)\n
app.register_blueprint(\n
views.story.similar.bp, url_prefix=\&\u002Fstory\u002Fsimilar\&)\n
... 继续省略剩下的那几十个register_blueprint\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E其实好的做法是什么呢:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-python\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&kn\&\u003Efrom\u003C\u002Fspan\u003E \u003Cspan class=\&nn\&\u003Ewerkzeug.utils\u003C\u002Fspan\u003E \u003Cspan class=\&kn\&\u003Eimport\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Efind_modules\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eimport_string\u003C\u002Fspan\u003E\n\n\n\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003Eregister_blueprints\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eroot\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eapp\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Efor\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ename\u003C\u002Fspan\u003E \u003Cspan class=\&ow\&\u003Ein\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Efind_modules\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eroot\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Erecursive\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003ETrue\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Emod\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eimport_string\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ename\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Eif\u003C\u002Fspan\u003E \u003Cspan class=\&nb\&\u003Ehasattr\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Emod\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&s1\&\u003E'bp'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eurls\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ename\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Esplit\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'.'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eprefix\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&s1\&\u003E'\u002F{}\u002F{}'\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eformat\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eurls\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E-\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E2\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E],\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eurls\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E-\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E1\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E])\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eapp\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eregister_blueprint\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Emod\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ebp\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eurl_prefix\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eprefix\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n\n\n\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003Ecreate_app\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E():\u003C\u002Fspan\u003E\n
\u003Cspan class=\&o\&\u003E...\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eregister_blueprints\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'views'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eapp\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n
\u003Cspan class=\&o\&\u003E...\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cbr\u003E\u003Cp\u003E是否懂了呢?\u003C\u002Fp\u003E\u003Cp\u003E无耻的广告:\u003Ca href=\&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F\& class=\&internal\&\u003E《Python Web开发实战》上市了!\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E欢迎关注本人的微信公众号获取更多Python相关的内容(也可以直接搜索「Python之美」):\u003C\u002Fb\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\u002Fpic1.zhimg.com\u002Fv2-1cc7bd405282afd75e90f54_b.jpg\& data-rawwidth=\&300\& data-rawheight=\&300\& class=\&content_image\& width=\&300\&\u003E\u003C\u002Ffigure\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\u002Fpic1.zhimg.com\u002Fv2-d8b04b23c84acb9e8f9690_b.png\& data-rawwidth=\&600\& data-rawheight=\&300\& class=\&origin_image zh-lightbox-thumb\& width=\&600\& data-original=\&http:\u002F\u002Fpic1.zhimg.com\u002Fv2-d8b04b23c84acb9e8f9690_r.png\&\u003E\u003C\u002Ffigure\u003E&,&state&:&published&,&sourceUrl&:&&,&pageCommentsCount&:0,&canComment&:false,&snapshotUrl&:&&,&slug&:,&publishedTime&:&T11:12:20+08:00&,&url&:&\u002Fp\u002F&,&title&:&Flask最佳实践&,&summary&:&这是 \u003Ca href=\&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F\& data-editable=\&true\& data-title=\&写个抓取网易云音乐精彩评论的爬虫 - Python之美 - 知乎专栏\& class=\&\&\u003E写个抓取网易云音乐精彩评论的爬虫 - Python之美 - 知乎专栏\u003C\u002Fa\u003E 的续篇。本节将主要分享 \u003Ca href=\&https:\u002F\u002Fgithub.com\u002Fdongweiming\u002Fcommentbox\& class=\&\& data-editable=\&true\& data-title=\&GitHub - dongweiming\u002Fcommentbox: 网易云音乐精彩评论\&\u003EGitHub - dongweiming\u002Fcommentbox: 网易云音乐精彩评论\u003C\u002Fa\u003E 中我使用Flask的考虑以及延伸出来的问题。\u003Cb\u003E1. 怎么用扩展\u003C\u002Fb\u003E在\u003Ca href=\&http:\u002F\u002Fflask.pocoo.org\u002Fdocs\u002F0.11\u002Fpatterns\u002Fappfactories\u002F#factories-extensions\& data-editable=\&true\& data-title=\&Application Factories\& class=\&\&\u003EApplication Factories\u003C\u002Fa\u003E提到了如何用扩展,也就是在…&,&reviewingCommentsCount&:0,&meta&:{&previous&:null,&next&:null},&commentPermission&:&anyone&,&commentsCount&:16,&likesCount&:176}},&annotationDetail&:null,&commentsCount&:52,&likesCount&:658,&FULLINFO&:true}},&User&:{&dongweiming&:{&isFollowed&:false,&name&:&董伟明&,&headline&:&微信公众号「Python之美」扫码: http:\u002F\u002Ft.cn\u002FRfKGZce&,&avatarUrl&:&https:\u002F\u002Fpic3.zhimg.com\u002F_s.jpg&,&isFollowing&:false,&type&:&people&,&slug&:&dongweiming&,&bio&:&已离开知乎 祝好&,&hash&:&6d23d8e16eb481ebb5898a4&,&uid&:68,&isOrg&:false,&description&:&微信公众号「Python之美」扫码: http:\u002F\u002Ft.cn\u002FRfKGZce&,&badge&:{&identity&:null,&bestAnswerer&:null},&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fdongweiming&,&avatar&:{&id&:&&,&template&:&https:\u002F\u002Fpic3.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}},&Comment&:{},&favlists&:{}},&me&:{},&global&:{&experimentFeatures&:{&ge3&:&ge3_9&,&ge2&:&ge2_1&,&androidPassThroughPush&:&all&,&newMore&:&new&,&nwebQAGrowth&:&experiment&,&showTipInLiveDetailsPage&:&true&,&nwebFeedAd&:&experiment&,&newSign&:&newVersion&,&searchSectionStyle&:&loosen&,&marketTabBanner&:&market_tab_banner_show&,&liveStore&:&ls_a2_b2_c1_f2&,&qawebThumbnailAbtest&:&new&,&nwebSearch&:&nweb_search_heifetz&,&searchHybridTabs&:&without-tabs&,&enableVoteDownReasonMenu&:&enable&,&showVideoUploadAttention&:&true&,&isOffice&:&false&,&enableTtsPlay&:&post&,&newQuestionDiversion&:&false&,&wechatShareModal&:&wechat_share_modal_show&,&newLiveFeedMediacard&:&old&,&hybridZhmoreVideo&:&no&,&recommendationAbtest&:&new&,&nwebGrowthPeople&:&default&,&qrcodeLogin&:&qrcode&,&isShowUnicomFreeEntry&:&unicom_free_entry_off&,&newMobileColumnAppheader&:&new_header&,&questionRecommendReadingsAbtest&:&recommend&,&androidDbCommentWithRepinRecord&:&open&,&androidDbRecommendAction&:&open&,&zcmLighting&:&zcm&,&androidDbFeedHashTagStyle&:&button&,&appStoreRateDialog&:&close&,&mobileFeedGuide&:&block&,&default&:&None&,&isNewNotiPanel&:&no&,&androidDbRepinSelection&:&open&,&nwebRelatedAdvert&:&default&,&androidProfilePanel&:&panel_b&,&nwebWriteAnswer&:&experiment&}},&columns&:{&next&:{},&python-cn&:{&following&:false,&canManage&:false,&href&:&\u002Fapi\u002Fcolumns\u002Fpython-cn&,&name&:&Python之美&,&creator&:{&slug&:&dongweiming&},&url&:&\u002F

我要回帖

更多关于 网易云音乐网页版 的文章

 

随机推荐