{"id":98425,"date":"2022-03-10T10:44:26","date_gmt":"2022-03-10T02:44:26","guid":{"rendered":"http:\/\/www.zhushiyao.com\/?p=98425"},"modified":"2022-03-10T10:57:25","modified_gmt":"2022-03-10T02:57:25","slug":"b0d86e22a0","status":"publish","type":"post","link":"http:\/\/www.zhushiyao.com\/?p=98425","title":{"rendered":"\u5b66\u4e60Flask\u4e3b\u7ad9\u6e90\u7801\uff0c\u6784\u5efa\u81ea\u5df1\u7684Web\u7ad9\u70b9"},"content":{"rendered":"<div class=\"bpp-post-content\">\n<section style=\"font-size: 16px; color: black; padding-right: 10px; padding-left: 10px; line-height: 1.6; letter-spacing: 0px; word-break: break-word; overflow-wrap: break-word; text-align: left; font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, 'PingFang SC', Cambria, Cochin, Georgia, Times, 'Times New Roman', serif;\">\n<blockquote style=\"border-top: none; border-right: none; border-bottom: none; font-size: 0.9em; overflow: auto; border-left-color: rgba(0, 0, 0, 0.4); background: rgba(0, 0, 0, 0.05); color: #6a737d; padding: 10px 10px 10px 20px; margin-bottom: 20px; margin-top: 20px;\">\n<p style=\"font-size: 16px; padding-top: 8px; padding-bottom: 8px; color: black; line-height: 26px;\">\u5927\u5bb6\u597d\uff0c\u6211\u662f\u8096\u6069\uff0c\u6e90\u7801\u89e3\u6790\u6bcf\u5468\u89c1<\/p>\n<\/blockquote>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">flask\u2014website\uff0c\u662fflask\u66fe\u7ecf\u7684\u4e3b\u7ad9\u6e90\u7801\uff0c\u4f7f\u7528flask\u5236\u4f5c\uff0c\u5305\u542b\u6a21\u7248\u6e32\u67d3\uff0c\u6570\u636e\u5e93\u64cd\u4f5c\uff0copenID\u8ba4\u8bc1, \u5168\u6587\u68c0\u7d22\u7b49\u529f\u80fd\u3002\u5bf9\u4e8e\u5b66\u4e60\u5982\u4f55\u4f7f\u7528flask\u5236\u4f5c\u4e00\u4e2a\u5b8c\u5907\u7684web\u7ad9\u70b9\uff0c\u5f88\u6709\u53c2\u8003\u4ef7\u503c\uff0c\u6211\u4eec\u4e00\u8d77\u6765\u5b66\u4e60\u5b83\u3002<\/p>\n<h2 style=\"margin-top: 30px; margin-bottom: 15px; font-weight: bold; font-size: 22px;\">\u9879\u76ee\u7ed3\u6784<\/h2>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">flask-website\u5df2\u7ecf\u5f52\u6863\u5c01\u5b58\uff0c\u6211\u4eec\u4f7f\u7528\u6700\u540e\u7684\u7248\u672c<code style=\"font-size: 14px; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin-right: 2px; margin-left: 2px; color: #1e6bb8; background-color: rgba(27, 31, 35, 0.05); font-family: 'Operator Mono', Consolas, Monaco, Menlo, monospace; word-break: break-all;\">8b08<\/code>\uff0c\u5305\u62ec\u5982\u4e0b\u51e0\u4e2a\u6a21\u5757:<\/p>\n<section style=\"overflow-x: auto;\">\n<table>\n<thead>\n<tr style=\"border-width: 1px 0px 0px; background-color: white; border-color: #cccccc initial initial initial; border-style: solid initial initial initial;\">\n<th style=\"border-top-width: 1px; border-color: #cccccc; text-align: left; background-color: #f0f0f0; min-width: 85px;\">\u6a21\u5757<\/th>\n<th style=\"border-top-width: 1px; border-color: #cccccc; text-align: left; background-color: #f0f0f0; min-width: 85px;\">\u63cf\u8ff0<\/th>\n<\/tr>\n<\/thead>\n<tbody style=\"border: 0px initial initial;\">\n<tr style=\"border-width: 1px 0px 0px; background-color: white; border-color: #cccccc initial initial initial; border-style: solid initial initial initial;\">\n<td style=\"border-color: #cccccc; min-width: 85px;\">run.py<\/td>\n<td style=\"border-color: #cccccc; min-width: 85px;\">\u542f\u52a8\u811a\u672c<\/td>\n<\/tr>\n<tr style=\"border-width: 1px 0px 0px; background-color: #f8f8f8; border-color: #cccccc initial initial initial; border-style: solid initial initial initial;\">\n<td style=\"border-color: #cccccc; min-width: 85px;\">websiteconfig.py<\/td>\n<td style=\"border-color: #cccccc; min-width: 85px;\">\u8bbe\u7f6e\u811a\u672c<\/td>\n<\/tr>\n<tr style=\"border-width: 1px 0px 0px; background-color: white; border-color: #cccccc initial initial initial; border-style: solid initial initial initial;\">\n<td style=\"border-color: #cccccc; min-width: 85px;\">update-doc-searchindex.py<\/td>\n<td style=\"border-color: #cccccc; min-width: 85px;\">\u66f4\u65b0\u7d22\u5f15\u811a\u672c<\/td>\n<\/tr>\n<tr style=\"border-width: 1px 0px 0px; background-color: #f8f8f8; border-color: #cccccc initial initial initial; border-style: solid initial initial initial;\">\n<td style=\"border-color: #cccccc; min-width: 85px;\">database.py<\/td>\n<td style=\"border-color: #cccccc; min-width: 85px;\">\u6570\u636e\u5e93\u6a21\u5757<\/td>\n<\/tr>\n<tr style=\"border-width: 1px 0px 0px; background-color: white; border-color: #cccccc initial initial initial; border-style: solid initial initial initial;\">\n<td style=\"border-color: #cccccc; min-width: 85px;\">docs.py<\/td>\n<td style=\"border-color: #cccccc; min-width: 85px;\">\u7d22\u5f15\u6587\u6863\u6a21\u5757<\/td>\n<\/tr>\n<tr style=\"border-width: 1px 0px 0px; background-color: #f8f8f8; border-color: #cccccc initial initial initial; border-style: solid initial initial initial;\">\n<td style=\"border-color: #cccccc; min-width: 85px;\">openid_auth.py<\/td>\n<td style=\"border-color: #cccccc; min-width: 85px;\">oauth\u8ba4\u8bc1<\/td>\n<\/tr>\n<tr style=\"border-width: 1px 0px 0px; background-color: white; border-color: #cccccc initial initial initial; border-style: solid initial initial initial;\">\n<td style=\"border-color: #cccccc; min-width: 85px;\">search.py<\/td>\n<td style=\"border-color: #cccccc; min-width: 85px;\">\u641c\u7d20\u6a21\u5757<\/td>\n<\/tr>\n<tr style=\"border-width: 1px 0px 0px; background-color: #f8f8f8; border-color: #cccccc initial initial initial; border-style: solid initial initial initial;\">\n<td style=\"border-color: #cccccc; min-width: 85px;\">utils.py<\/td>\n<td style=\"border-color: #cccccc; min-width: 85px;\">\u5de5\u5177\u7c7b<\/td>\n<\/tr>\n<tr style=\"border-width: 1px 0px 0px; background-color: white; border-color: #cccccc initial initial initial; border-style: solid initial initial initial;\">\n<td style=\"border-color: #cccccc; min-width: 85px;\">listings<\/td>\n<td style=\"border-color: #cccccc; min-width: 85px;\">\u4e00\u4e9b\u5c55\u793a\u680f<\/td>\n<\/tr>\n<tr style=\"border-width: 1px 0px 0px; background-color: #f8f8f8; border-color: #cccccc initial initial initial; border-style: solid initial initial initial;\">\n<td style=\"border-color: #cccccc; min-width: 85px;\">views<\/td>\n<td style=\"border-color: #cccccc; min-width: 85px;\">\u84dd\u56fe\u6a21\u5757\uff0c\u5305\u62ec\u793e\u533a\uff0c\u6269\u5c55\uff0c\u90ae\u4ef6\u5217\u8868\uff0c\u4ee3\u7801\u7247\u6bb5\u7b49<\/td>\n<\/tr>\n<tr style=\"border-width: 1px 0px 0px; background-color: white; border-color: #cccccc initial initial initial; border-style: solid initial initial initial;\">\n<td style=\"border-color: #cccccc; min-width: 85px;\">static<\/td>\n<td style=\"border-color: #cccccc; min-width: 85px;\">\u7f51\u7ad9\u7684\u9759\u6001\u8d44\u6e90<\/td>\n<\/tr>\n<tr style=\"border-width: 1px 0px 0px; background-color: #f8f8f8; border-color: #cccccc initial initial initial; border-style: solid initial initial initial;\">\n<td style=\"border-color: #cccccc; min-width: 85px;\">templates<\/td>\n<td style=\"border-color: #cccccc; min-width: 85px;\">\u7f51\u7ad9\u7684\u6a21\u7248\u8d44\u6e90<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/section>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">flask-website\u7684\u9879\u76ee\u7ed3\u6784\uff0c\u53ef\u4ee5\u4f5c\u4e3aflask\u7684\u811a\u624b\u67b6\uff0c\u6309\u7167\u8fd9\u4e2a\u76ee\u5f55\u89c4\u5212\u6784\u5efa\u81ea\u5df1\u7684\u7ad9\u70b9:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">.\n\u251c\u2500\u2500\u00a0LICENSE\n\u251c\u2500\u2500\u00a0Makefile\n\u251c\u2500\u2500\u00a0README\n\u251c\u2500\u2500\u00a0flask_website\n\u2502\u00a0\u00a0\u00a0\u251c\u2500\u2500\u00a0__init__.py\n\u2502\u00a0\u00a0\u00a0\u251c\u2500\u2500\u00a0database.py\n\u2502\u00a0\u00a0\u00a0\u251c\u2500\u2500\u00a0docs.py\n\u2502\u00a0\u00a0\u00a0\u251c\u2500\u2500\u00a0flaskystyle.py\n\u2502\u00a0\u00a0\u00a0\u251c\u2500\u2500\u00a0listings\n\u2502\u00a0\u00a0\u00a0\u251c\u2500\u2500\u00a0openid_auth.py\n\u2502\u00a0\u00a0\u00a0\u251c\u2500\u2500\u00a0search.py\n\u2502\u00a0\u00a0\u00a0\u251c\u2500\u2500\u00a0static\n\u2502\u00a0\u00a0\u00a0\u251c\u2500\u2500\u00a0templates\n\u2502\u00a0\u00a0\u00a0\u251c\u2500\u2500\u00a0utils.py\n\u2502\u00a0\u00a0\u00a0\u2514\u2500\u2500\u00a0views\n\u251c\u2500\u2500\u00a0requirements.txt\n\u251c\u2500\u2500\u00a0run.py\n\u251c\u2500\u2500\u00a0update-doc-searchindex.py\n\u2514\u2500\u2500\u00a0websiteconfig.py\n<\/code><\/pre>\n<ul class=\"list-paddingleft-2\" style=\"margin-top: 8px; margin-bottom: 8px; padding-left: 25px;\">\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">run.py\u4f5c\u4e3a\u9879\u76ee\u7684\u542f\u52a8\u5165\u53e3<\/section>\n<\/li>\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">requirements.txt\u63cf\u8ff0\u9879\u76ee\u7684\u4f9d\u8d56\u5305<\/section>\n<\/li>\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">flask_website\u662f\u9879\u76ee\u7684\u4e3b\u6a21\u5757\uff0c\u91cc\u9762\u5305\u62ec:\u5b58\u653e\u9759\u6001\u8d44\u6e90\u7684static\u76ee\u5f55; \u5b58\u653e\u6a21\u7248\u6587\u4ef6\u7684templates\u76ee\u5f55;\u5b58\u653e\u4e00\u4e9b\u84dd\u56fe\u6a21\u5757\u7684views\u6a21\u5757\uff0c\u4f7f\u7528\u8fd9\u4e9b\u84dd\u56fe\u6784\u5efa\u7f51\u7ad9\u7684\u4e0d\u540c\u9875\u9762\u3002<\/section>\n<\/li>\n<\/ul>\n<h2 style=\"margin-top: 30px; margin-bottom: 15px; font-weight: bold; font-size: 22px;\">\u7f51\u7ad9\u5165\u53e3<\/h2>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u7f51\u7ad9\u7684\u5165\u53e3run.py\u4ee3\u7801\u5f88\u7b80\u5355\uff0c\u5bfc\u5165app\u5e76\u8fd0\u884c:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">from\u00a0flask_website\u00a0import\u00a0app\napp.run(debug=True)\n<\/code><\/pre>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">app\u662f\u57fa\u4e8eflask\uff0c\u4f7f\u7528<code style=\"font-size: 14px; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin-right: 2px; margin-left: 2px; color: #1e6bb8; background-color: rgba(27, 31, 35, 0.05); font-family: 'Operator Mono', Consolas, Monaco, Menlo, monospace; word-break: break-all;\">websiteconfig<\/code>\u4e2d\u7684\u914d\u7f6e\u8fdb\u884c\u521d\u59cb\u5316<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">app\u00a0=\u00a0Flask(__name__)\napp.config.from_object(<span style=\"color: #98c379; line-height: 26px;\">'websiteconfig'<\/span>)\n<\/code><\/pre>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">app\u4e2d\u8bbe\u7f6e\u4e86\u4e00\u4e9b\u5168\u5c40\u5b9e\u73b0\uff0c\u6bd4\u5982404\u9875\u9762\u5b9a\u4e49\uff0c\u5168\u5c40\u7528\u6237\uff0c\u5173\u95eddb\u8fde\u63a5\uff0c\u548c\u6a21\u7248\u65f6\u95f4:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">@app.errorhandler(404)\ndef\u00a0not_found(error):\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">return<\/span>\u00a0render_template(<span style=\"color: #98c379; line-height: 26px;\">'404.html'<\/span>),\u00a0404\n\n@app.before_request\ndef\u00a0load_current_user():\n\u00a0\u00a0\u00a0\u00a0g.user\u00a0=\u00a0User.query.filter_by(openid=session[<span style=\"color: #98c379; line-height: 26px;\">'openid'<\/span>]).first()\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #c678dd; line-height: 26px;\">if<\/span>\u00a0<span style=\"color: #98c379; line-height: 26px;\">'openid'<\/span>\u00a0<span style=\"color: #c678dd; line-height: 26px;\">in<\/span>\u00a0session\u00a0<span style=\"color: #c678dd; line-height: 26px;\">else<\/span>\u00a0None\n\n@app.teardown_request\ndef\u00a0remove_db_session(exception):\n\u00a0\u00a0\u00a0\u00a0db_session.remove()\n\n@app.context_processor\ndef\u00a0current_year():\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">return<\/span>\u00a0{<span style=\"color: #98c379; line-height: 26px;\">'current_year'<\/span>:\u00a0datetime.utcnow().year}\n<\/code><\/pre>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u52a0\u8f7dview\u90e8\u5206\u4f7f\u7528\u4e86\u4e24\u79cd\u65b9\u5f0f\uff0c\u7b2c\u4e00\u79cd\u662f\u4f7f\u7528flask\u7684add_url_rule\u51fd\u6570\uff0c\u8bbe\u7f6e\u4e86\u6587\u6863\u7684\u641c\u7d22\u5b9e\u73b0\uff0c\u8fd9\u4e9burl\u6267\u884cdocs\u6a21\u5757:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">app.add_url_rule(<span style=\"color: #98c379; line-height: 26px;\">'\/docs\/'<\/span>,\u00a0endpoint=<span style=\"color: #98c379; line-height: 26px;\">'docs.index'<\/span>,\u00a0build_only=True)\napp.add_url_rule(<span style=\"color: #98c379; line-height: 26px;\">'\/docs\/&lt;path:page&gt;\/'<\/span>,\u00a0endpoint=<span style=\"color: #98c379; line-height: 26px;\">'docs.show'<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0build_only=True)\napp.add_url_rule(<span style=\"color: #98c379; line-height: 26px;\">'\/docs\/&lt;version&gt;\/.latex\/Flask.pdf'<\/span>,\u00a0endpoint=<span style=\"color: #98c379; line-height: 26px;\">'docs.pdf'<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0build_only=True)\n<\/code><\/pre>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u7b2c\u4e8c\u79cd\u662f\u4f7f\u7528flask\u7684\u84dd\u56fe\u529f\u80fd:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">from\u00a0flask_website.views\u00a0import\u00a0general\nfrom\u00a0flask_website.views\u00a0import\u00a0community\nfrom\u00a0flask_website.views\u00a0import\u00a0mailinglist\nfrom\u00a0flask_website.views\u00a0import\u00a0snippets\nfrom\u00a0flask_website.views\u00a0import\u00a0extensions\napp.register_blueprint(general.mod)\napp.register_blueprint(community.mod)\napp.register_blueprint(mailinglist.mod)\napp.register_blueprint(snippets.mod)\napp.register_blueprint(extensions.mod)\n<\/code><\/pre>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u6700\u540eapp\u8fd8\u5b9a\u4e49\u4e86\u4e00\u4e9bjinja\u6a21\u7248\u7684\u5de5\u5177\u51fd\u6570:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">app.jinja_env.filters[<span style=\"color: #98c379; line-height: 26px;\">'datetimeformat'<\/span>]\u00a0=\u00a0utils.format_datetime\napp.jinja_env.filters[<span style=\"color: #98c379; line-height: 26px;\">'dateformat'<\/span>]\u00a0=\u00a0utils.format_date\napp.jinja_env.filters[<span style=\"color: #98c379; line-height: 26px;\">'timedeltaformat'<\/span>]\u00a0=\u00a0utils.format_timedelta\napp.jinja_env.filters[<span style=\"color: #98c379; line-height: 26px;\">'displayopenid'<\/span>]\u00a0=\u00a0utils.display_openid\n<\/code><\/pre>\n<h2 style=\"margin-top: 30px; margin-bottom: 15px; font-weight: bold; font-size: 22px;\">\u6a21\u7248\u6e32\u67d3<\/h2>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u73b0\u5728\u4e3b\u6d41\u7684\u7ad9\u70b9\u90fd\u662f\u91c7\u7528\u524d\u540e\u7aef\u5206\u79bb\u7684\u7ed3\u6784\uff0c\u540e\u7aef\u63d0\u4f9b\u7eaf\u7cb9\u7684API\uff0c\u524d\u7aef\u4f7f\u7528vue\u7b49\u6784\u5efa\u3002\u8fd9\u79cd\u7ed3\u6784\u5bf9\u4e8e\u6784\u5efa\u5c0f\u578b\u7ad9\u70b9\uff0c\u4f1a\u6bd4\u8f83\u590d\u6742\uff0c\u6709\u725b\u5200\u6740\u9e21\u7684\u611f\u89c9\u3002\u5bf9\u4e2a\u4eba\u5f00\u53d1\u8005\uff0c\u8fd8\u9700\u8981\u5b66\u4e60\u66f4\u591a\u7684\u524d\u7aef\u77e5\u8bc6\u3002\u800c\u4f7f\u7528\u540e\u7aef\u7684\u6a21\u7248\u6e32\u67d3\u65b9\u5f0f\u6784\u5efa\u9875\u9762\uff0c\u662f\u6bd4\u8f83\u4f20\u7edf\u7684\u65b9\u5f0f\uff0c\u5bf9\u5c0f\u578b\u7ad9\u70b9\u6bd4\u8f83\u5b9e\u7528\u3002<\/p>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u672c\u9879\u76ee\u5c31\u662f\u4f7f\u7528\u6a21\u7248\u6784\u5efa\uff0c\u5728general\u84dd\u56fe\u4e2d:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">mod\u00a0=\u00a0Blueprint(<span style=\"color: #98c379; line-height: 26px;\">'general'<\/span>,\u00a0__name__)\n\n@mod.route(<span style=\"color: #98c379; line-height: 26px;\">'\/'<\/span>)\ndef\u00a0index():\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: #c678dd; line-height: 26px;\">if<\/span>\u00a0request_wants_json():\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">return<\/span>\u00a0jsonify(releases=[r.to_json()\u00a0<span style=\"color: #c678dd; line-height: 26px;\">for<\/span>\u00a0r\u00a0<span style=\"color: #c678dd; line-height: 26px;\">in<\/span>\u00a0releases])\n\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">return<\/span>\u00a0render_template(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #98c379; line-height: 26px;\">'general\/index.html'<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0latest_release=releases[-1],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #5c6370; font-style: italic; line-height: 26px;\">#\u00a0pdf\u00a0link\u00a0does\u00a0not\u00a0redirect,\u00a0needs\u00a0version<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #5c6370; font-style: italic; line-height: 26px;\">#\u00a0docs\u00a0version\u00a0only\u00a0includes\u00a0major.minor<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0docs_pdf_version=<span style=\"color: #98c379; line-height: 26px;\">'.'<\/span>.join(releases[-1].version.split(<span style=\"color: #98c379; line-height: 26px;\">'.'<\/span>,\u00a02)[:2])\n\u00a0\u00a0\u00a0\u00a0)\n<\/code><\/pre>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u53ef\u4ee5\u770b\u5230\u9996\u9875\u67092\u79cd\u8f93\u51fa\u65b9\u5f0f\uff0c\u4e00\u79cd\u662fjson\u5316\u7684\u8f93\u51fa\uff0c\u53e6\u4e00\u79cd\u662fhtml\u65b9\u5f0f\u8f93\u51fa\uff0c\u6211\u4eec\u91cd\u70b9\u770b\u770b\u7b2c\u4e8c\u79cd\u65b9\u5f0f\u3002\u51fd\u6570render_template\u4f20\u9012\u4e86\u6a21\u7248\u8def\u5f84\uff0clatest_release\u548cdocs_pdf_version\u4e24\u4e2a\u53d8\u91cf\u503c\u3002<\/p>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u6a21\u7248\u4e5f\u662f\u6a21\u5757\u5316\u7684\uff0c\u4e00\u822c\u662f\u6839\u636e\u9875\u9762\u5e03\u5c40\u800c\u6765\u3002\u6bd4\u5982\u5206\u6210\u5de6\u53f3\u4e24\u680f\u7684\u7ed3\u6784\uff0c\u6216\u8005\u4e0a\u4e0b\u7ed3\u6784\uff0c\u5e03\u5c40\u5b9a\u4e49\u7684\u6a21\u7248\u4e00\u822c\u53eb\u505alayout\u3002\u6bd4\u5982\u672c\u9879\u76ee\u7684\u6a21\u7248\u5c31\u4ece\u4e0a\u81f3\u4e0b\u5b9a\u4e49\u6210\u4e0b\u97625\u5757:<\/p>\n<ul class=\"list-paddingleft-2\" style=\"margin-top: 8px; margin-bottom: 8px; padding-left: 25px;\">\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">head \u4e00\u822c\u5b9a\u4e49html\u9875\u9762\u6807\u9898(\u6d4f\u89c8\u5668\u680f)\uff0ccss\u6837\u5f0f\/js-script\u7684\u6309\u9700\u52a0\u8f7d\u7b49<\/section>\n<\/li>\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">body_title \u5b9a\u4e49\u9875\u9762\u7684\u6807\u9898<\/section>\n<\/li>\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">message \u5b9a\u4e49\u4e00\u4e9b\u7edf\u4e00\u7684\u901a\u77e5\uff0c\u63d0\u793a\u7c7b\u7684\u5c55\u793a\u7a7a\u95f4<\/section>\n<\/li>\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">body \u9875\u9762\u7684\u6b63\u6587\u90e8\u5206<\/section>\n<\/li>\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">footer \u7edf\u4e00\u7684\u9875\u811a<\/section>\n<\/li>\n<\/ul>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u4f7f\u7528layout\u6a21\u7248\u5b9a\u4e49\uff0c\u5c06\u7f51\u7ad9\u7684\u5c55\u793a\u98ce\u683c\u7edf\u4e00\u4e0b\u6765\uff0c\u5404\u4e2a\u9875\u9762\u53ef\u4ee5\u7ee7\u627f\u548c\u6269\u5c55\u3002\u4e0b\u9762\u662fhead\u5757\u548cmessage\u5757\u7684\u5b9a\u4e49\u7ec6\u8282:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">&lt;!doctype\u00a0html&gt;\n{%\u00a0block\u00a0head\u00a0%}\n&lt;title&gt;{%\u00a0block\u00a0title\u00a0%}Welcome{%\u00a0endblock\u00a0%}\u00a0|\u00a0Flask\u00a0(A\u00a0Python\u00a0Microframework)&lt;\/title&gt;\n&lt;meta\u00a0charset=utf-8&gt;\n&lt;link\u00a0rel=stylesheet\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">type<\/span>=text\/css\u00a0href=<span style=\"color: #98c379; line-height: 26px;\">\"{{\u00a0url_for('static',\u00a0filename='style.css')\u00a0}}\"<\/span>&gt;\n&lt;link\u00a0rel=<span style=\"color: #98c379; line-height: 26px;\">\"shortcut\u00a0icon\"<\/span>\u00a0href=<span style=\"color: #98c379; line-height: 26px;\">\"{{\u00a0url_for('static',\u00a0filename='favicon.ico')\u00a0}}\"<\/span>&gt;\n&lt;script\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">type<\/span>=text\/javascript\n\u00a0\u00a0src=<span style=\"color: #98c379; line-height: 26px;\">\"http:\/\/ajax.googleapis.com\/ajax\/libs\/jquery\/1.4.2\/jquery.min.js\"<\/span>&gt;&lt;\/script&gt;\n{%\u00a0endblock\u00a0%}\n&lt;div\u00a0class=box&gt;\n\u00a0\u00a0...\n\u00a0\u00a0&lt;p\u00a0class=nav&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;a\u00a0href=<span style=\"color: #98c379; line-height: 26px;\">\"{{\u00a0url_for('general.index')\u00a0}}\"<\/span>&gt;overview&lt;\/a&gt;\u00a0\/\/\n\u00a0\u00a0\u00a0\u00a0&lt;a\u00a0href=<span style=\"color: #98c379; line-height: 26px;\">\"{{\u00a0url_for('docs.index')\u00a0}}\"<\/span>&gt;docs&lt;\/a&gt;\u00a0\/\/\n\u00a0\u00a0\u00a0\u00a0&lt;a\u00a0href=<span style=\"color: #98c379; line-height: 26px;\">\"{{\u00a0url_for('community.index')\u00a0}}\"<\/span>&gt;community&lt;\/a&gt;\u00a0\/\/\n\u00a0\u00a0\u00a0\u00a0&lt;a\u00a0href=<span style=\"color: #98c379; line-height: 26px;\">\"{{\u00a0url_for('extensions.index')\u00a0}}\"<\/span>&gt;extensions&lt;\/a&gt;\u00a0\/\/\n\u00a0\u00a0\u00a0\u00a0&lt;a\u00a0href=<span style=\"color: #98c379; line-height: 26px;\">\"https:\/\/psfmember.org\/civicrm\/contribute\/transact?reset=1&amp;id=20\"<\/span>&gt;donate&lt;\/a&gt;\n\u00a0\u00a0{%\u00a0<span style=\"color: #c678dd; line-height: 26px;\">for<\/span>\u00a0message\u00a0<span style=\"color: #c678dd; line-height: 26px;\">in<\/span>\u00a0get_flashed_messages()\u00a0%}\n\u00a0\u00a0\u00a0\u00a0&lt;p\u00a0class=message&gt;{{\u00a0message\u00a0}}\n\u00a0\u00a0{%\u00a0endfor\u00a0%}\n\u00a0\u00a0...\n<\/code><\/pre>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u672c\u9879\u76ee\u9996\u9875\u7684general\/index\u7ee7\u627f\u81ea\u5168\u5c40\u7684layout\uff0c\u5e76\u5bf9\u5176\u4e2d\u7684body\u90e8\u5206\u8fdb\u884c\u8986\u76d6\uff0c\u4f7f\u7528\u81ea\u5df1\u7684\u914d\u7f6e:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">{%\u00a0extends\u00a0<span style=\"color: #98c379; line-height: 26px;\">\"layout.html\"<\/span>\u00a0%}\n\u00a0\u00a0\u00a0\u00a0....\n{%\u00a0block\u00a0body\u00a0%}\n\u00a0\u00a0&lt;ul&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;li&gt;&lt;a\u00a0href=<span style=\"color: #98c379; line-height: 26px;\">\"{{\u00a0latest_release.detail_url\u00a0}}\"<\/span>&gt;Download\u00a0latest\u00a0release&lt;\/a&gt;\u00a0({{\u00a0latest_release.version\u00a0}})\n\u00a0\u00a0\u00a0\u00a0&lt;li&gt;&lt;a\u00a0href=<span style=\"color: #98c379; line-height: 26px;\">\"{{\u00a0url_for('docs.index')\u00a0}}\"<\/span>&gt;Read\u00a0the\u00a0documentation&lt;\/a&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;li&gt;&lt;a\u00a0href=<span style=\"color: #98c379; line-height: 26px;\">\"{{\u00a0url_for('mailinglist.index')\u00a0}}\"<\/span>&gt;Join\u00a0the\u00a0mailinglist&lt;\/a&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;li&gt;&lt;a\u00a0href=https:\/\/github.com\/pallets\/flask&gt;Fork\u00a0it\u00a0on\u00a0github&lt;\/a&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;li&gt;&lt;a\u00a0href=https:\/\/github.com\/pallets\/flask\/issues&gt;Add\u00a0issues\u00a0and\u00a0feature\u00a0requests&lt;\/a&gt;\n\u00a0\u00a0&lt;\/ul&gt;\n\u00a0\u00a0...\n<\/code><\/pre>\n<ul class=\"list-paddingleft-2\" style=\"margin-top: 8px; margin-bottom: 8px; padding-left: 25px;\">\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">\u8fd9\u4e2a\u5217\u8868\u4e3b\u8981\u4f7f\u7528\u4e86\u84dd\u56fe\u4e2d\u4f20\u5165\u7684latest_release\u53d8\u91cf\uff0c\u5c55\u793a\u6700\u65b0\u6587\u6863(pdf)\u7684url<\/section>\n<\/li>\n<\/ul>\n<h2 style=\"margin-top: 30px; margin-bottom: 15px; font-weight: bold; font-size: 22px;\">\u6570\u636e\u5e93\u64cd\u4f5c<\/h2>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u7f51\u7ad9\u6709\u4ea4\u4e92\uff0c\u5fc5\u5b9a\u8981\u6301\u4e45\u5316\u6570\u636e\u3002\u672c\u9879\u76ee\u4f7f\u7528\u7684sqlite\u7684\u6570\u636e\u5e93\uff0c\u6bd4\u8f83\u8f7b\u91cf\u7ea7\u3002\u6570\u636e\u5e93\u4f7f\u7528sqlalchemy\u5c01\u88c5\u7684ORM\u5b9e\u73b0\u3002\u4e0b\u9762\u7684\u4ee3\u7801\u5c55\u793a\u4e86\u5982\u4f55\u521b\u5efa\u4e00\u4e2a\u8bc4\u8bba:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">@mod.route(<span style=\"color: #98c379; line-height: 26px;\">'\/comments\/&lt;int:id&gt;\/'<\/span>,\u00a0methods=[<span style=\"color: #98c379; line-height: 26px;\">'GET'<\/span>,\u00a0<span style=\"color: #98c379; line-height: 26px;\">'POST'<\/span>])\n@requires_admin\ndef\u00a0edit_comment(id):\n\u00a0\u00a0\u00a0\u00a0comment\u00a0=\u00a0Comment.query.get(id)\n\u00a0\u00a0\u00a0\u00a0snippet\u00a0=\u00a0comment.snippet\n\u00a0\u00a0\u00a0\u00a0form\u00a0=\u00a0dict(title=comment.title,\u00a0text=comment.text)\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: #c678dd; line-height: 26px;\">if<\/span>\u00a0request.method\u00a0==\u00a0<span style=\"color: #98c379; line-height: 26px;\">'POST'<\/span>:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0...\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0form[<span style=\"color: #98c379; line-height: 26px;\">'title'<\/span>]\u00a0=\u00a0request.form[<span style=\"color: #98c379; line-height: 26px;\">'title'<\/span>]\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0form[<span style=\"color: #98c379; line-height: 26px;\">'text'<\/span>]\u00a0=\u00a0request.form[<span style=\"color: #98c379; line-height: 26px;\">'text'<\/span>]\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0..\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0comment.title\u00a0=\u00a0form[<span style=\"color: #98c379; line-height: 26px;\">'title'<\/span>]\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0comment.text\u00a0=\u00a0form[<span style=\"color: #98c379; line-height: 26px;\">'text'<\/span>]\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0db_session.commit()\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0flash(u<span style=\"color: #98c379; line-height: 26px;\">'Comment\u00a0was\u00a0updated.'<\/span>)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">return<\/span>\u00a0redirect(snippet.url)\n\u00a0\u00a0\u00a0\u00a0...\n<\/code><\/pre>\n<ul class=\"list-paddingleft-2\" style=\"margin-top: 8px; margin-bottom: 8px; padding-left: 25px;\">\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">\u521b\u5efacomment\u5bf9\u8c61<\/section>\n<\/li>\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">\u4ecehtml\u7684form\u8868\u5355\u4e2d\u83b7\u53d6\u7528\u6237\u63d0\u4ea4\u7684title\u548ctext<\/section>\n<\/li>\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">\u5bf9comment\u5bf9\u8c61\u8fdb\u884c\u8d4b\u503c\u548c\u63d0\u4ea4<\/section>\n<\/li>\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">\u5237\u65b0\u9875\u9762\u7684\u63d0\u793a\u4fe1\u606f(\u5728\u6a21\u7248\u7684message\u90e8\u5206\u5c55\u793a)<\/section>\n<\/li>\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">\u8fd4\u56de\u5230\u65b0\u7684url<\/section>\n<\/li>\n<\/ul>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u501f\u52a9sqlalchemy\uff0c\u6570\u636e\u6a21\u578b\u7684\u64cd\u4f5cAPI\u7b80\u5355\u6613\u61c2\u3002\u8981\u4f7f\u7528\u6570\u636e\u5e93\uff0c\u9700\u8981\u5148\u521b\u5efa\u6570\u636e\u5e93\u8fde\u63a5\uff0c\u6784\u5efa\u6a21\u578b\u7b49, \u4e3b\u8981\u5728database\u6a21\u5757:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">DATABASE_URI\u00a0=\u00a0<span style=\"color: #98c379; line-height: 26px;\">'sqlite:\/\/\/'<\/span>\u00a0+\u00a0os.path.join(_basedir,\u00a0<span style=\"color: #98c379; line-height: 26px;\">'flask-website.db'<\/span>)\n<span style=\"color: #5c6370; font-style: italic; line-height: 26px;\">#\u00a0\u521b\u5efa\u5f15\u64ce<\/span>\nengine\u00a0=\u00a0create_engine(app.config[<span style=\"color: #98c379; line-height: 26px;\">'DATABASE_URI'<\/span>],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0convert_unicode=True,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0**app.config[<span style=\"color: #98c379; line-height: 26px;\">'DATABASE_CONNECT_OPTIONS'<\/span>])\n<span style=\"color: #5c6370; font-style: italic; line-height: 26px;\">#\u00a0\u521b\u5efasession(\u8fde\u63a5)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\ndb_session\u00a0=\u00a0scoped_session(sessionmaker(autocommit=False,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0autoflush=False,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">bind<\/span>=engine))\n<span style=\"color: #5c6370; font-style: italic; line-height: 26px;\">#\u00a0\u521d\u59cb\u5316<\/span>\ndef\u00a0init_db():\n\u00a0\u00a0\u00a0\u00a0Model.metadata.create_all(<span style=\"color: #e6c07b; line-height: 26px;\">bind<\/span>=engine)\n\n<span style=\"color: #5c6370; font-style: italic; line-height: 26px;\">#\u00a0\u5b9a\u4e49\u57fa\u7840\u6a21\u578b<\/span>\nModel\u00a0=\u00a0declarative_base(name=<span style=\"color: #98c379; line-height: 26px;\">'Model'<\/span>)\nModel.query\u00a0=\u00a0db_session.query_property()\n<\/code><\/pre>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">Comment\u6570\u636e\u6a21\u578b\u5b9a\u4e49:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">class\u00a0Comment(Model):\n\u00a0\u00a0\u00a0\u00a0__tablename__\u00a0=\u00a0<span style=\"color: #98c379; line-height: 26px;\">'comments'<\/span>\n\u00a0\u00a0\u00a0\u00a0id\u00a0=\u00a0Column(<span style=\"color: #98c379; line-height: 26px;\">'comment_id'<\/span>,\u00a0Integer,\u00a0primary_key=True)\n\u00a0\u00a0\u00a0\u00a0snippet_id\u00a0=\u00a0Column(Integer,\u00a0ForeignKey(<span style=\"color: #98c379; line-height: 26px;\">'snippets.snippet_id'<\/span>))\n\u00a0\u00a0\u00a0\u00a0author_id\u00a0=\u00a0Column(Integer,\u00a0ForeignKey(<span style=\"color: #98c379; line-height: 26px;\">'users.user_id'<\/span>))\n\u00a0\u00a0\u00a0\u00a0title\u00a0=\u00a0Column(String(200))\n\u00a0\u00a0\u00a0\u00a0text\u00a0=\u00a0Column(String)\n\u00a0\u00a0\u00a0\u00a0pub_date\u00a0=\u00a0Column(DateTime)\n\n\u00a0\u00a0\u00a0\u00a0snippet\u00a0=\u00a0relation(Snippet,\u00a0backref=backref(<span style=\"color: #98c379; line-height: 26px;\">'comments'<\/span>,\u00a0lazy=True))\n\u00a0\u00a0\u00a0\u00a0author\u00a0=\u00a0relation(User,\u00a0backref=backref(<span style=\"color: #98c379; line-height: 26px;\">'comments'<\/span>,\u00a0lazy=<span style=\"color: #98c379; line-height: 26px;\">'dynamic'<\/span>))\n\n\u00a0\u00a0\u00a0\u00a0def\u00a0__init__(self,\u00a0snippet,\u00a0author,\u00a0title,\u00a0text):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0self.snippet\u00a0=\u00a0snippet\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0self.author\u00a0=\u00a0author\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0self.title\u00a0=\u00a0title\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0self.text\u00a0=\u00a0text\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0self.pub_date\u00a0=\u00a0datetime.utcnow()\n\n\u00a0\u00a0\u00a0\u00a0def\u00a0to_json(self):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">return<\/span>\u00a0dict(author=self.author.to_json(),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0title=self.title,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pub_date=http_date(self.pub_date),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0text=unicode(self.rendered_text))\n\n\u00a0\u00a0\u00a0\u00a0@property\n\u00a0\u00a0\u00a0\u00a0def\u00a0rendered_text(self):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0from\u00a0flask_website.utils\u00a0import\u00a0format_creole\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">return<\/span>\u00a0format_creole(self.text)\n<\/code><\/pre>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">Comment\u6a21\u578b\u6309\u7167\u7ed3\u6784\u5316\u7684\u65b9\u5f0f\u5b9a\u4e49\u4e86\u8868\u540d\uff0c6\u4e2a\u5b57\u6bb5\uff0c2\u4e2a\u5173\u8054\u5173\u7cfb\u548cjson\u5316\u548c\u6587\u672c\u5316\u7684\u5c55\u793a\u65b9\u6cd5\u3002<\/p>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">sqlalchemy\u7684\u4f7f\u7528\uff0c\u5728\u4e4b\u524d\u7684\u6587\u7ae0\u4e2d\u6709\u8fc7\u4ecb\u7ecd\uff0c\u672c\u6587\u5c31\u4e0d\u518d\u8d58\u8ff0\u3002<\/p>\n<h2 style=\"margin-top: 30px; margin-bottom: 15px; font-weight: bold; font-size: 22px;\">openID\u8ba4\u8bc1<\/h2>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u4e00\u4e2a\u5c0f\u4f17\u7684\u7f51\u7ad9\uff0c\u6784\u5efa\u81ea\u5df1\u7684\u8d26\u53f7\u5373\u9ebb\u70e6\u4e5f\u4e0d\u5b89\u5168\uff0c\u4f7f\u7528\u7b2c\u4e09\u65b9\u7684\u7528\u6237\u4f53\u7cfb\u4f1a\u6bd4\u8f83\u5408\u9002\u3002\u672c\u9879\u76ee\u4f7f\u7528\u7684\u662fFlask-OpenID\u8fd9\u4e2a\u5e93\u63d0\u4f9b\u7684optnID\u767b\u5f55\u8ba4\u8bc1\u3002<\/p>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u7528\u6237\u767b\u5f55\u7684\u65f6\u5019\uff0c\u4f1a\u6839\u636e\u7528\u6237\u9009\u62e9\u7684\u4e09\u65b9\u767b\u5f55\u7ad9\u70b9\uff0c\u8df3\u8f6c\u5230\u5bf9\u5e94\u7684\u7f51\u7ad9\u8fdb\u884c\u8ba4\u8bc1:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">@mod.route(<span style=\"color: #98c379; line-height: 26px;\">'\/login\/'<\/span>,\u00a0methods=[<span style=\"color: #98c379; line-height: 26px;\">'GET'<\/span>,\u00a0<span style=\"color: #98c379; line-height: 26px;\">'POST'<\/span>])\n@oid.loginhandler\ndef\u00a0login():\n\u00a0\u00a0\u00a0\u00a0..\n\u00a0\u00a0\u00a0\u00a0openid\u00a0=\u00a0request.values.get(<span style=\"color: #98c379; line-height: 26px;\">'openid'<\/span>)\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: #c678dd; line-height: 26px;\">if<\/span>\u00a0not\u00a0openid:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0openid\u00a0=\u00a0COMMON_PROVIDERS.get(request.args.get(<span style=\"color: #98c379; line-height: 26px;\">'provider'<\/span>))\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: #c678dd; line-height: 26px;\">if<\/span>\u00a0openid:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">return<\/span>\u00a0oid.try_login(openid,\u00a0ask_for=[<span style=\"color: #98c379; line-height: 26px;\">'fullname'<\/span>,\u00a0<span style=\"color: #98c379; line-height: 26px;\">'nickname'<\/span>])\n\u00a0\u00a0\u00a0\u00a0..\n<\/code><\/pre>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u4ece\u5bf9\u5e94\u7684\u6a21\u7248\u4e0a\u66f4\u5bb9\u6613\u7406\u89e3\u8fd9\u4e2a\u8fc7\u7a0b, \u53ef\u4ee5\u770b\u5230\u9ed8\u8ba4\u652f\u6301AOL\/Google\/Yahoo\u4e09\u4e2a\u8d26\u53f7\u4f53\u7cfb\u8ba4\u8bc1:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">{%\u00a0block\u00a0body\u00a0%}\n\u00a0\u00a0&lt;form\u00a0action=<span style=\"color: #98c379; line-height: 26px;\">\"\"<\/span>\u00a0method=post&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;p&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0For\u00a0some\u00a0of\u00a0the\u00a0features\u00a0on\u00a0this\u00a0site\u00a0(such\u00a0as\u00a0creating\u00a0snippets\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0or\u00a0adding\u00a0comments)\u00a0you\u00a0have\u00a0to\u00a0be\u00a0signed\u00a0<span style=\"color: #c678dd; line-height: 26px;\">in<\/span>.\u00a0\u00a0You\u00a0don<span style=\"color: #98c379; line-height: 26px;\">'t\u00a0need\u00a0to\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0create\u00a0an\u00a0account\u00a0on\u00a0this\u00a0website,\u00a0just\u00a0sign\u00a0in\u00a0with\u00a0an\u00a0existing\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;a\u00a0href=http:\/\/openid.net\/&gt;OpenID&lt;\/a&gt;\u00a0account.\n\u00a0\u00a0\u00a0\u00a0&lt;p&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0OpenID\u00a0URL:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input\u00a0type=text\u00a0name=openid\u00a0class=openid\u00a0size=30&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input\u00a0type=hidden\u00a0name=next\u00a0value=\"{{\u00a0next\u00a0}}\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input\u00a0type=submit\u00a0value=Login&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;p&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Alternatively\u00a0you\u00a0can\u00a0directly\u00a0sign\u00a0in\u00a0by\u00a0clicking\u00a0on\u00a0one\u00a0of\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0the\u00a0providers\u00a0here\u00a0in\u00a0case\u00a0you\u00a0don'<\/span>t\u00a0know\u00a0the\u00a0identity\u00a0URL:\n\u00a0\u00a0\u00a0\u00a0&lt;ul&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;li&gt;&lt;a\u00a0href=?provider=aol&gt;AOL&lt;\/a&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;li&gt;&lt;a\u00a0href=?provider=google&gt;Google&lt;\/a&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;li&gt;&lt;a\u00a0href=?provider=yahoo&gt;Yahoo&lt;\/a&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;\/ul&gt;\n\u00a0\u00a0&lt;\/form&gt;\n{%\u00a0endblock\u00a0%}\n<\/code><\/pre>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u5728\u4e09\u65b9\u7ad9\u70b9\u8ba4\u8bc1\u5b8c\u6210\u540e\uff0c\u4f1a\u5efa\u7acb\u672c\u7ad9\u70b9\u7684\u7528\u6237\u548copenid\u7684\u7ed1\u5b9a\u5173\u7cfb:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">@mod.route(<span style=\"color: #98c379; line-height: 26px;\">'\/first-login\/'<\/span>,\u00a0methods=[<span style=\"color: #98c379; line-height: 26px;\">'GET'<\/span>,\u00a0<span style=\"color: #98c379; line-height: 26px;\">'POST'<\/span>])\ndef\u00a0first_login():\n\u00a0\u00a0\u00a0\u00a0...\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0db_session.add(User(request.form[<span style=\"color: #98c379; line-height: 26px;\">'name'<\/span>],\u00a0session[<span style=\"color: #98c379; line-height: 26px;\">'openid'<\/span>]))\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0db_session.commit()\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0flash(u<span style=\"color: #98c379; line-height: 26px;\">'Successfully\u00a0created\u00a0profile\u00a0and\u00a0logged\u00a0in'<\/span>)\n\u00a0\u00a0\u00a0\u00a0...\n<\/code><\/pre>\n<ul class=\"list-paddingleft-2\" style=\"margin-top: 8px; margin-bottom: 8px; padding-left: 25px;\">\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">session\u4e2d\u7684openid\u662f\u7b2c\u4e09\u65b9\u767b\u5f55\u6210\u529f\u540e\u5199\u5165session<\/section>\n<\/li>\n<\/ul>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u4e09\u65b9\u767b\u5f55\u7684\u903b\u8f91\u8fc7\u7a0b\u5927\u6982\u5c31\u5982\u4e0a\u6240\u793a\uff0c\u5148\u53bb\u4e09\u65b9\u5e73\u53f0\u767b\u5f55\uff0c\u7136\u540e\u548c\u672c\u5730\u7ad9\u70b9\u7684\u8d26\u53f7\u8fdb\u884c\u5173\u8054\u3002\u5176\u5177\u4f53\u7684\u5b9e\u73b0\uff0c\u4e3b\u8981\u4f9d\u8d56Flask-OpenID\u8fd9\u4e2a\u6a21\u5757\uff0c \u6211\u4eec\u5927\u6982\u4e86\u89e3\u5373\u53ef\u3002<\/p>\n<h2 style=\"margin-top: 30px; margin-bottom: 15px; font-weight: bold; font-size: 22px;\">\u5168\u6587\u68c0\u7d22<\/h2>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u5168\u6587\u68c0\u7d22\u5bf9\u4e8e\u4e00\u4e2a\u7ad9\u70b9\u975e\u5e38\u91cd\u8981\uff0c\u53ef\u4ee5\u5e2e\u52a9\u7528\u6237\u5728\u7f51\u7ad9\u4e0a\u5feb\u901f\u627e\u5230\u9002\u5408\u7684\u5185\u5bb9\u3002\u672c\u9879\u76ee\u5c55\u793a\u4e86\u4f7f\u7528whoosh\u8fd9\u4e2a\u7eafpython\u5b9e\u73b0\u7684\u5168\u6587\u68c0\u7d22\u5de5\u5177\uff0c\u6784\u5efa\u7f51\u7ad9\u5185\u5bb9\u68c0\u7d22\uff0c\u548c\u4f7f\u7528ElasticSearch\u8fd9\u6837\u5927\u578b\u7684\u68c0\u7d22\u5e93\u4e0d\u4e00\u6837\u3002\u603b\u4e4b\uff0c\u672c\u9879\u76ee\u4f7f\u7528\u7684\u90fd\u662f\u5c0f\u578b\u5de5\u5177\uff0c\u7eafpython\u5b9e\u73b0\u3002<\/p>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u5168\u6587\u68c0\u7d22\u4ece<code style=\"font-size: 14px; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin-right: 2px; margin-left: 2px; color: #1e6bb8; background-color: rgba(27, 31, 35, 0.05); font-family: 'Operator Mono', Consolas, Monaco, Menlo, monospace; word-break: break-all;\">\/search\/<\/code>\u5165\u53e3\u8fdb\u5165:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">@mod.route(<span style=\"color: #98c379; line-height: 26px;\">'\/search\/'<\/span>)\ndef\u00a0search():\n\u00a0\u00a0\u00a0\u00a0q\u00a0=\u00a0request.args.get(<span style=\"color: #98c379; line-height: 26px;\">'q'<\/span>)\u00a0or\u00a0<span style=\"color: #98c379; line-height: 26px;\">''<\/span>\n\u00a0\u00a0\u00a0\u00a0page\u00a0=\u00a0request.args.get(<span style=\"color: #98c379; line-height: 26px;\">'page'<\/span>,\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">type<\/span>=int)\u00a0or\u00a01\n\u00a0\u00a0\u00a0\u00a0results\u00a0=\u00a0None\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: #c678dd; line-height: 26px;\">if<\/span>\u00a0q:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0results\u00a0=\u00a0perform_search(q,\u00a0page=page)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #c678dd; line-height: 26px;\">if<\/span>\u00a0results\u00a0is\u00a0None:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0abort(404)\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">return<\/span>\u00a0render_template(<span style=\"color: #98c379; line-height: 26px;\">'general\/search.html'<\/span>,\u00a0results=results,\u00a0q=q)\n<\/code><\/pre>\n<ul class=\"list-paddingleft-2\" style=\"margin-top: 8px; margin-bottom: 8px; padding-left: 25px;\">\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">q\u662f\u641c\u7d20\u7684\u5173\u952e\u5b57\uff0cpage\u662f\u7ffb\u9875\u7684\u9875\u6570<\/section>\n<\/li>\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">\u4f7f\u7528perform_search\u65b9\u6cd5\u5bf9\u7d22\u5f15\u8fdb\u884c\u67e5\u8be2<\/section>\n<\/li>\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">\u5982\u679c\u627e\u4e0d\u5230\u5185\u5bb9\u5c55\u793a404\uff1b\u5982\u679c\u627e\u5230\u5185\u5bb9\uff0c\u5c55\u793a\u7ed3\u679c<\/section>\n<\/li>\n<\/ul>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u5728search\u6a21\u5757\u4e2d\u63d0\u4f9b\u4e86search\u65b9\u6cd5\uff0c\u524d\u9762\u8c03\u7528\u7684perform_search\u51fd\u6570\u662f\u5176\u522b\u540d:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">def\u00a0search(query,\u00a0page=1,\u00a0per_page=20):\n\u00a0\u00a0\u00a0\u00a0with\u00a0index.searcher()\u00a0as\u00a0s:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0qp\u00a0=\u00a0qparser.MultifieldParser([<span style=\"color: #98c379; line-height: 26px;\">'title'<\/span>,\u00a0<span style=\"color: #98c379; line-height: 26px;\">'content'<\/span>],\u00a0index.schema)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0q\u00a0=\u00a0qp.parse(unicode(query))\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0try:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result_page\u00a0=\u00a0s.search_page(q,\u00a0page,\u00a0pagelen=per_page)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0except\u00a0ValueError:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #c678dd; line-height: 26px;\">if<\/span>\u00a0page\u00a0==\u00a01:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">return<\/span>\u00a0SearchResultPage(None,\u00a0page)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">return<\/span>\u00a0None\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0results\u00a0=\u00a0result_page.results\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0results.highlighter.fragmenter.maxchars\u00a0=\u00a0512\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0results.highlighter.fragmenter.surround\u00a0=\u00a040\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0results.highlighter.formatter\u00a0=\u00a0highlight.HtmlFormatter(<span style=\"color: #98c379; line-height: 26px;\">'em'<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0classname=<span style=\"color: #98c379; line-height: 26px;\">'search-match'<\/span>,\u00a0termclass=<span style=\"color: #98c379; line-height: 26px;\">'search-term'<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0between=u<span style=\"color: #98c379; line-height: 26px;\">'&lt;span class=ellipsis&gt;\u00a0\u2026\u00a0&lt;\/span&gt;'<\/span>)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">return<\/span>\u00a0SearchResultPage(result_page,\u00a0page)\n<\/code><\/pre>\n<ul class=\"list-paddingleft-2\" style=\"margin-top: 8px; margin-bottom: 8px; padding-left: 25px;\">\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">\u4ecettile\u548ccontent\u4e2d\u641c\u7d20\u5173\u952e\u5b57q<\/section>\n<\/li>\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">\u8bbe\u7f6e\u4f7f\u7528unicode\u7f16\u7801<\/section>\n<\/li>\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">\u5c06\u68c0\u7d22\u7ed3\u679c\u5c01\u88c5\u6210SearchResultPage<\/section>\n<\/li>\n<\/ul>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u91cd\u70b9\u5728<code style=\"font-size: 14px; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin-right: 2px; margin-left: 2px; color: #1e6bb8; background-color: rgba(27, 31, 35, 0.05); font-family: 'Operator Mono', Consolas, Monaco, Menlo, monospace; word-break: break-all;\">index.searcher()<\/code>\u8fd9\u4e2a\u7d22\u5f15, \u5b83\u4f7f\u7528\u4e0b\u9762\u65b9\u6cd5\u6784\u5efa:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">from\u00a0whoosh\u00a0import\u00a0highlight,\u00a0analysis,\u00a0qparser\nfrom\u00a0whoosh.support.charset\u00a0import\u00a0accent_map\n...\ndef\u00a0open_index():\n\u00a0\u00a0\u00a0\u00a0from\u00a0whoosh\u00a0import\u00a0index,\u00a0fields\u00a0as\u00a0f\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: #c678dd; line-height: 26px;\">if<\/span>\u00a0os.path.isdir(app.config[<span style=\"color: #98c379; line-height: 26px;\">'WHOOSH_INDEX'<\/span>]):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">return<\/span>\u00a0index.open_dir(app.config[<span style=\"color: #98c379; line-height: 26px;\">'WHOOSH_INDEX'<\/span>])\n\u00a0\u00a0\u00a0\u00a0os.mkdir(app.config[<span style=\"color: #98c379; line-height: 26px;\">'WHOOSH_INDEX'<\/span>])\n\u00a0\u00a0\u00a0\u00a0analyzer\u00a0=\u00a0analysis.StemmingAnalyzer()\u00a0|\u00a0analysis.CharsetFilter(accent_map)\n\u00a0\u00a0\u00a0\u00a0schema\u00a0=\u00a0f.Schema(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0url=f.ID(stored=True,\u00a0unique=True),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0id=f.ID(stored=True),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0title=f.TEXT(stored=True,\u00a0field_boost=2.0,\u00a0analyzer=analyzer),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">type<\/span>=f.ID(stored=True),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0keywords=f.KEYWORD(commas=True),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0content=f.TEXT(analyzer=analyzer)\n\u00a0\u00a0\u00a0\u00a0)\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">return<\/span>\u00a0index.create_in(app.config[<span style=\"color: #98c379; line-height: 26px;\">'WHOOSH_INDEX'<\/span>],\u00a0schema)\n\nindex\u00a0=\u00a0open_index()\n<\/code><\/pre>\n<ul class=\"list-paddingleft-2\" style=\"margin-top: 8px; margin-bottom: 8px; padding-left: 25px;\">\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">whoosh\u521b\u5efa\u672c\u5730\u7684\u7d22\u5f15\u6587\u4ef6<\/section>\n<\/li>\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">whoosh\u6784\u5efa\u641c\u7d20\u7684\u6570\u636e\u7ed3\u6784\uff0c\u5305\u62ecurl\uff0ctitle\uff0c\uff0c\u5173\u952e\u5b57\u548c\u5185\u5bb9<\/section>\n<\/li>\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">\u5173\u952e\u5b57\u548c\u5185\u5bb9\u53c2\u4e0e\u68c0\u7d22<\/section>\n<\/li>\n<\/ul>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u7d22\u5f15\u9700\u8981\u6784\u5efa\u548c\u5237\u65b0:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">def\u00a0update_documentation_index():\n\u00a0\u00a0\u00a0\u00a0from\u00a0flask_website.docs\u00a0import\u00a0DocumentationPage\n\u00a0\u00a0\u00a0\u00a0writer\u00a0=\u00a0index.writer()\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: #c678dd; line-height: 26px;\">for<\/span>\u00a0page\u00a0<span style=\"color: #c678dd; line-height: 26px;\">in<\/span>\u00a0DocumentationPage.iter_pages():\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0page.remove_from_search_index(writer)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0page.add_to_search_index(writer)\n\u00a0\u00a0\u00a0\u00a0writer.commit()\n<\/code><\/pre>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u6587\u6863\u7d22\u5f15\u6784\u5efa\u5728docs\u6a21\u5757\u4e2d:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">DOCUMENTATION_PATH\u00a0=\u00a0os.path.join(_basedir,\u00a0<span style=\"color: #98c379; line-height: 26px;\">'..\/flask\/docs\/_build\/dirhtml'<\/span>)\nWHOOSH_INDEX\u00a0=\u00a0os.path.join(_basedir,\u00a0<span style=\"color: #98c379; line-height: 26px;\">'flask-website.whoosh'<\/span>)\n\nclass\u00a0DocumentationPage(Indexable):\n\u00a0\u00a0\u00a0\u00a0search_document_kind\u00a0=\u00a0<span style=\"color: #98c379; line-height: 26px;\">'documentation'<\/span>\n\n\u00a0\u00a0\u00a0\u00a0def\u00a0__init__(self,\u00a0slug):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0self.slug\u00a0=\u00a0slug\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fn\u00a0=\u00a0os.path.join(app.config[<span style=\"color: #98c379; line-height: 26px;\">'DOCUMENTATION_PATH'<\/span>],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0slug,\u00a0<span style=\"color: #98c379; line-height: 26px;\">'index.html'<\/span>)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0with\u00a0open(fn)\u00a0as\u00a0f:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0contents\u00a0=\u00a0f.read().decode(<span style=\"color: #98c379; line-height: 26px;\">'utf-8'<\/span>)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0title,\u00a0text\u00a0=\u00a0_doc_body_re.search(contents).groups()\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0self.title\u00a0=\u00a0Markup(title).striptags().split(u<span style=\"color: #98c379; line-height: 26px;\">'\u2014'<\/span>)[0].strip()\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0self.text\u00a0=\u00a0Markup(text).striptags().strip().replace(u<span style=\"color: #98c379; line-height: 26px;\">'\u00b6'<\/span>,\u00a0u<span style=\"color: #98c379; line-height: 26px;\">''<\/span>)\n\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0@classmethod\n\u00a0\u00a0\u00a0\u00a0def\u00a0iter_pages(cls):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0base_folder\u00a0=\u00a0os.path.abspath(app.config[<span style=\"color: #98c379; line-height: 26px;\">'DOCUMENTATION_PATH'<\/span>])\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #c678dd; line-height: 26px;\">for<\/span>\u00a0dirpath,\u00a0dirnames,\u00a0filenames\u00a0<span style=\"color: #c678dd; line-height: 26px;\">in<\/span>\u00a0os.walk(base_folder):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #c678dd; line-height: 26px;\">if<\/span>\u00a0<span style=\"color: #98c379; line-height: 26px;\">'index.html'<\/span>\u00a0<span style=\"color: #c678dd; line-height: 26px;\">in<\/span>\u00a0filenames:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0slug\u00a0=\u00a0dirpath[len(base_folder)\u00a0+\u00a01:]\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #5c6370; font-style: italic; line-height: 26px;\">#\u00a0skip\u00a0the\u00a0index\u00a0page.\u00a0\u00a0useless<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #c678dd; line-height: 26px;\">if<\/span>\u00a0slug:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0yield\u00a0DocumentationPage(slug)\n\n<\/code><\/pre>\n<ul class=\"list-paddingleft-2\" style=\"margin-top: 8px; margin-bottom: 8px; padding-left: 25px;\">\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">\u6587\u6863\u8bfb\u53d6DOCUMENTATION_PATH\u76ee\u5f55\u4e0b\u7684\u6e90\u6587\u4ef6(\u9879\u76ee\u6587\u6863)<\/section>\n<\/li>\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">\u8bfb\u53d6\u6587\u4ef6\u7684\u6807\u9898\u548c\u6587\u672c\uff0c\u6784\u5efa\u7d22\u5f15\u6587\u4ef6<\/section>\n<\/li>\n<\/ul>\n<h2 style=\"margin-top: 30px; margin-bottom: 15px; font-weight: bold; font-size: 22px;\">\u5c0f\u7ed3<\/h2>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u672c\u6587\u6211\u4eec\u8d70\u9a6c\u89c2\u82b1\u7684\u67e5\u770b\u4e86flask-view\u8fd9\u4e2aflask\u66fe\u7ecf\u7684\u4e3b\u7ad9\u3002\u867d\u7136\u6ca1\u6709\u6df1\u5165\u592a\u591a\u7ec6\u8282\uff0c\u4f46\u662f\u6211\u4eec\u77e5\u9053\u4e86\u6a21\u7248\u6e32\u67d3\uff0c\u6570\u636e\u5e93\u64cd\u4f5c\uff0cOpenID\u8ba4\u8bc1\u548c\u5168\u6587\u68c0\u7d22\u56db\u4e2a\u529f\u80fd\u7684\u5b9e\u73b0\u65b9\u5f0f\uff0c\u5efa\u7acb\u4e86\u76f8\u5173\u6280\u672f\u7684\u7d22\u5f15\u3002\u5982\u679c\u6211\u4eec\u9700\u8981\u6784\u5efa\u81ea\u5df1\u7684\u5c0f\u578bweb\u9879\u76ee\uff0c\u6bd4\u5982\u535a\u5ba2\uff0c\u5b8c\u5168\u53ef\u4ee5\u4ee5\u8fd9\u4e2a\u9879\u76ee\u4e3a\u57fa\u7840\uff0c\u4fee\u6539\u5b9e\u73b0\u3002<\/p>\n<blockquote style=\"border-top: none; border-right: none; border-bottom: none; font-size: 0.9em; overflow: auto; border-left-color: rgba(0, 0, 0, 0.4); background: rgba(0, 0, 0, 0.05); color: #6a737d; padding: 10px 10px 10px 20px; margin-bottom: 20px; margin-top: 20px;\">\n<p style=\"font-size: 16px; padding-top: 8px; padding-bottom: 8px; color: black; line-height: 26px;\">\u7ecf\u8fc7\u6570\u5468\u7684\u8c03\u6574\uff0c\u63a5\u4e0b\u6211\u4eec\u5f00\u59cb\u8fdb\u5165python\u5f71\u54cd\u529b\u5de8\u5927\u7684\u9879\u76ee\u4e4b\u4e00: Django\u3002\u656c\u8bf7\u671f\u5f85\u3002<\/p>\n<\/blockquote>\n<h2 style=\"margin-top: 30px; margin-bottom: 15px; font-weight: bold; font-size: 22px;\">\u5c0f\u6280\u5de7<\/h2>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u672c\u9879\u76ee\u63d0\u4f9b\u4e862\u4e2a\u975e\u5e38\u5b9e\u7528\u7684\u5c0f\u6280\u5de7\u3002\u7b2c1\u4e2a\u662fjson\u5316\u548chtml\u5316\u8f93\u51fa\uff0c\u8fd9\u6837\u7528\u6237\u53ef\u4ee5\u81ea\u7531\u9009\u62e9\u8f93\u51fa\u65b9\u5f0f\uff0c\u540c\u65f6\u7ad9\u70b9\u4e5f\u53ef\u4ee5\u6784\u5efa\u7eafAPI\u7684\u63a5\u53e3\u3002\u8fd9\u4e2a\u529f\u80fd\u662f\u4f7f\u7528\u4e0b\u9762\u7684request_wants_json\u51fd\u6570\u63d0\u4f9b:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">def\u00a0request_wants_json():\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: #5c6370; font-style: italic; line-height: 26px;\">#\u00a0we\u00a0only\u00a0accept\u00a0json\u00a0if\u00a0the\u00a0quality\u00a0of\u00a0json\u00a0is\u00a0greater\u00a0than\u00a0the<\/span>\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: #5c6370; font-style: italic; line-height: 26px;\">#\u00a0quality\u00a0of\u00a0text\/html\u00a0because\u00a0text\/html\u00a0is\u00a0preferred\u00a0to\u00a0support<\/span>\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: #5c6370; font-style: italic; line-height: 26px;\">#\u00a0browsers\u00a0that\u00a0accept\u00a0on\u00a0*\/*<\/span>\n\u00a0\u00a0\u00a0\u00a0best\u00a0=\u00a0request.accept_mimetypes\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.best_match([<span style=\"color: #98c379; line-height: 26px;\">'application\/json'<\/span>,\u00a0<span style=\"color: #98c379; line-height: 26px;\">'text\/html'<\/span>])\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">return<\/span>\u00a0best\u00a0==\u00a0<span style=\"color: #98c379; line-height: 26px;\">'application\/json'<\/span>\u00a0and\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0request.accept_mimetypes[best]\u00a0&gt;\u00a0request.accept_mimetypes[<span style=\"color: #98c379; line-height: 26px;\">'text\/html'<\/span>]\n<\/code><\/pre>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">request_wants_json\u51fd\u6570\u4e2d\u5224\u65ad\u5934\u90e8\u7684mime\u7c7b\u578b\uff0c\u8fdb\u884c\u6839\u636e\u662f<code style=\"font-size: 14px; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin-right: 2px; margin-left: 2px; color: #1e6bb8; background-color: rgba(27, 31, 35, 0.05); font-family: 'Operator Mono', Consolas, Monaco, Menlo, monospace; word-break: break-all;\">application\/json<\/code>\u8fd8\u662f<code style=\"font-size: 14px; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin-right: 2px; margin-left: 2px; color: #1e6bb8; background-color: rgba(27, 31, 35, 0.05); font-family: 'Operator Mono', Consolas, Monaco, Menlo, monospace; word-break: break-all;\">text\/html<\/code>\u51b3\u5b9a\u5c55\u793a\u65b9\u5f0f\u3002<\/p>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u7b2c2\u4e2a\u5c0f\u6280\u5de7\u662f\u8ba4\u8bc1\u88c5\u9970\u5668, \u524d\u9762\u4e00\u4e2a\u662f\u767b\u5f55\u9a8c\u8bc1\uff0c\u540e\u4e00\u4e2a\u662f\u8d85\u7ea7\u7ba1\u7406\u8ba4\u8bc1:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">def\u00a0requires_login(f):\n\u00a0\u00a0\u00a0\u00a0@wraps(f)\n\u00a0\u00a0\u00a0\u00a0def\u00a0decorated_function(*args,\u00a0**kwargs):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #c678dd; line-height: 26px;\">if<\/span>\u00a0g.user\u00a0is\u00a0None:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0flash(u<span style=\"color: #98c379; line-height: 26px;\">'You\u00a0need\u00a0to\u00a0be\u00a0signed\u00a0in\u00a0for\u00a0this\u00a0page.'<\/span>)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">return<\/span>\u00a0redirect(url_for(<span style=\"color: #98c379; line-height: 26px;\">'general.login'<\/span>,\u00a0next=request.path))\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">return<\/span>\u00a0f(*args,\u00a0**kwargs)\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">return<\/span>\u00a0decorated_function\n\ndef\u00a0requires_admin(f):\n\u00a0\u00a0\u00a0\u00a0@wraps(f)\n\u00a0\u00a0\u00a0\u00a0def\u00a0decorated_function(*args,\u00a0**kwargs):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #c678dd; line-height: 26px;\">if<\/span>\u00a0not\u00a0g.user.is_admin:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0abort(401)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">return<\/span>\u00a0f(*args,\u00a0**kwargs)\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: #e6c07b; line-height: 26px;\">return<\/span>\u00a0requires_login(decorated_function)\n<\/code><\/pre>\n<p style=\"padding-top: 8px; padding-bottom: 8px; line-height: 26px;\">\u8fd9\u4e24\u4e2a\u88c5\u9970\u5668\uff0c\u5728view\u7684API\u4e0a\u4f7f\u7528, \u6bd4\u5982\u7f16\u8f91snippet\u9700\u8981\u767b\u5f55\uff0c\u8bc4\u8bba\u9700\u8981\u7ba1\u7406\u5458\u6743\u9650:<\/p>\n<pre style=\"margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;\"><code style=\"overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;\">@mod.route(<span style=\"color: #98c379; line-height: 26px;\">'\/edit\/&lt;int:id&gt;\/'<\/span>,\u00a0methods=[<span style=\"color: #98c379; line-height: 26px;\">'GET'<\/span>,\u00a0<span style=\"color: #98c379; line-height: 26px;\">'POST'<\/span>])\n@requires_login\ndef\u00a0edit(id):\n\u00a0\u00a0\u00a0\u00a0...\n\n@mod.route(<span style=\"color: #98c379; line-height: 26px;\">'\/comments\/&lt;int:id&gt;\/'<\/span>,\u00a0methods=[<span style=\"color: #98c379; line-height: 26px;\">'GET'<\/span>,\u00a0<span style=\"color: #98c379; line-height: 26px;\">'POST'<\/span>])\n@requires_admin\ndef\u00a0edit_comment(id):\n\u00a0\u00a0\u00a0\u00a0...\n<\/code><\/pre>\n<h2 style=\"margin-top: 30px; margin-bottom: 15px; font-weight: bold; font-size: 22px;\">\u53c2\u8003\u94fe\u63a5<\/h2>\n<ul class=\"list-paddingleft-2\" style=\"margin-top: 8px; margin-bottom: 8px; padding-left: 25px;\">\n<li>\n<section style=\"margin-top: 5px; margin-bottom: 5px; line-height: 26px; color: #010101;\">https:\/\/github.com\/pallets\/flask-website<\/section>\n<\/li>\n<\/ul>\n<\/section>\n<section style=\"white-space: normal; max-width: 100%; font-family: -apple-system-font, BlinkMacSystemFont, 'Helvetica Neue', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei UI', 'Microsoft YaHei', Arial, sans-serif; font-size: 15px; color: #3e3e3e; line-height: 1.8; word-spacing: 1.6px; letter-spacing: 0.5px; box-sizing: border-box !important; overflow-wrap: break-word !important;\">\n<section style=\"margin-right: 9px; margin-bottom: 5px; margin-left: 9px; max-width: 100%; box-sizing: border-box; min-height: 1em; font-size: inherit; color: inherit; line-height: 1.75em; text-align: center; overflow-wrap: break-word !important;\"><img decoding=\"async\" class=\"rich_pages wxw-img\" style=\"letter-spacing: 0.544px; word-spacing: 1.6px; background-color: #ffffff; font-family: \u5fae\u8f6f\u96c5\u9ed1; font-size: 16px; font-variant-numeric: normal; line-height: 25.6px; widows: 1; display: inline; box-sizing: border-box !important; overflow-wrap: break-word !important; visibility: visible !important; width: auto !important;\" title=\"\u5b66\u4e60Flask\u4e3b\u7ad9\u6e90\u7801\uff0c\u6784\u5efa\u81ea\u5df1\u7684Web\u7ad9\u70b9\" src=\"http:\/\/www.zhushiyao.com\/wp-content\/uploads\/2022\/03\/9-1646880266.gif\" alt=\"\u5b66\u4e60Flask\u4e3b\u7ad9\u6e90\u7801\uff0c\u6784\u5efa\u81ea\u5df1\u7684Web\u7ad9\u70b9\" \/><\/section>\n<section style=\"margin-right: 8px; margin-bottom: 15px; margin-left: 8px; max-width: 100%; box-sizing: border-box; min-height: 1em; font-size: inherit; color: inherit; line-height: 1.75em; overflow-wrap: break-word !important;\"><strong><span style=\"color: #ff4c00;\">\u8f6c\u81ea\uff1a<br \/>\n<\/span><\/strong><\/section>\n<\/section>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u5927\u5bb6\u597d\uff0c\u6211\u662f\u8096\u6069\uff0c\u6e90\u7801\u89e3\u6790\u6bcf\u5468\u89c1 flask\u2014website\uff0c\u662fflask\u66fe\u7ecf\u7684\u4e3b\u7ad9\u6e90\u7801\uff0c\u4f7f\u7528flask\u5236\u4f5c\uff0c &hellip; <a href=\"http:\/\/www.zhushiyao.com\/?p=98425\" class=\"more-link\">\u7ee7\u7eed\u9605\u8bfb<span class=\"screen-reader-text\">\u201c\u5b66\u4e60Flask\u4e3b\u7ad9\u6e90\u7801\uff0c\u6784\u5efa\u81ea\u5df1\u7684Web\u7ad9\u70b9\u201d<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[8],"_links":{"self":[{"href":"http:\/\/www.zhushiyao.com\/index.php?rest_route=\/wp\/v2\/posts\/98425"}],"collection":[{"href":"http:\/\/www.zhushiyao.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.zhushiyao.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.zhushiyao.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.zhushiyao.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=98425"}],"version-history":[{"count":2,"href":"http:\/\/www.zhushiyao.com\/index.php?rest_route=\/wp\/v2\/posts\/98425\/revisions"}],"predecessor-version":[{"id":98429,"href":"http:\/\/www.zhushiyao.com\/index.php?rest_route=\/wp\/v2\/posts\/98425\/revisions\/98429"}],"wp:attachment":[{"href":"http:\/\/www.zhushiyao.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=98425"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.zhushiyao.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=98425"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.zhushiyao.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=98425"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}