{"id":348,"date":"2018-10-13T22:00:17","date_gmt":"2018-10-13T14:00:17","guid":{"rendered":"http:\/\/develop-note.com\/blog\/?p=348"},"modified":"2022-02-16T22:17:32","modified_gmt":"2022-02-16T14:17:32","slug":"2019ironman-flask-restful-day12","status":"publish","type":"post","link":"https:\/\/www.develop-note.com\/blog\/2018\/10\/13\/2019ironman-flask-restful-day12\/","title":{"rendered":"\u7b2c\u5341\u5c46\u9435\u4eba\u8cfd flask-restful DAY12-\u641e\u61c2flask"},"content":{"rendered":"<h1>\u751a\u9ebc\u662fflask<\/h1>\n<p>\u751a\u9ebc\u662fflask\u5462?<a href=\"https:\/\/zh.wikipedia.org\/wiki\/Flask\" rel=\"nofollow noopener\" target=\"_blank\">\u7dad\u57fa\u767e\u79d1<\/a>\u9019\u6a23\u89e3\u91cb\uff1a<!--more--><\/p>\n<blockquote>\n<p>Flask\u662f\u4e00\u500b\u4f7f\u7528Python\u7de8\u5beb\u7684\u8f15\u91cf\u7d1aWeb\u61c9\u7528\u6846\u67b6\u3002\u57fa\u65bcWerkzeug WSGI\u5de5\u5177\u7bb1\u548cJinja2\u6a21\u677f\u5f15\u64ce\u3002<\/p>\n<\/blockquote>\n<p>\u9019\u90e8\u5206\u5148\u8df3\u904eJinja2\u6a21\u677f\u5f15\u64ce\u7684\u8aaa\u660e\uff0c\u56e0\u70ba\u672c\u7bc7\u4e3b\u8981\u5167\u5bb9\u653e\u5728restful\u7684\u90e8\u5206\uff0c\u5f85\u4e4b\u5f8c\u7b46\u8005\u6709\u6a5f\u6703\u5728\u8ddf\u5927\u5bb6\u5c08\u9580\u8aaa\u660eflask\u6642\u5728\u4ecb\u7d39\u3002\u63a5\u4e0b\u4f86\u5148\u8aaa\u660eWerkzeug\u8ddfWSGI\u662f\u751a\u9ebc\u3002<\/p>\n<h1>Werkzeug\u8ddfWSGI\u662f\u751a\u9ebc<\/h1>\n<p><code><code>WSGI<\/code><\/code>\u662fWeb Server Gateway Interface\u7684\u7e2e\u5beb\uff0c\u662f\u70baPython\u8a9e\u8a00\u5b9a\u7fa9\u7684Web\u4f3a\u670d\u5668\u548cWeb\u61c9\u7528\u7a0b\u5f0f\u6216\u6846\u67b6\u4e4b\u9593\u7684\u4e00\u7a2e\u7c21\u55ae\u800c\u901a\u7528\u7684\u57e0\uff0c\u800cWerkzeug\u662f\u5be6\u73feWSGI\u898f\u7bc4\u7684\u4e00\u500b\u51fd\u5f0f\u5eab\uff0c\u518d\u4f86flask\u662f\u57fa\u65bcWerkzeug\u4e0b\u958b\u767c\u7684\u4e00\u500bframework\uff0c\u800cWSGI\u7684\u5167\u5bb9\u53c8\u8aaa\u4e86\u4e9b\u751a\u9ebc\u5462\uff0c\u7d30\u7bc0\u90e8\u5206\u9700\u8981\u8acb\u8b80\u8005\u53c3\u8003<a href=\"https:\/\/zh.wikipedia.org\/wiki\/Web%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BD%91%E5%85%B3%E6%8E%A5%E5%8F%A3\" rel=\"nofollow noopener\" target=\"_blank\">WSGI\u7684\u7dad\u57fa\u767e\u79d1<\/a>\uff0c\u4e0d\u904e\u9019\u90e8\u5206\u7b46\u8005\u8981\u5148\u8aaa\u660e\u6839\u64da\u7dad\u57fa\u767e\u79d1\u7684\u8aaa\u660eWSGI\u76f8\u95dc\u5167\u5bb9\u5982\u4e0b\uff1a<\/p>\n<blockquote>\n<p>WSGI\u5340\u5206\u70ba\u5169\u500b\u90e8\u4efd\uff1a\u4e00\u70ba\u300c\u4f3a\u670d\u5668\u300d\u6216\u300c\u9598\u9053\u300d\uff0c\u53e6\u4e00\u70ba\u300c\u61c9\u7528\u7a0b\u5f0f\u300d\u6216\u300c\u61c9\u7528\u6846\u67b6\u300d\u3002\u5728\u8655\u7406\u4e00\u500bWSGI\u8acb\u6c42\u6642\uff0c\u4f3a\u670d\u5668\u6703\u70ba\u61c9\u7528\u7a0b\u5f0f\u63d0\u4f9b\u74b0\u5883\u8cc7\u8a0a\u53ca\u4e00\u500b\u56de\u547c\u51fd\u5f0f\uff08Callback Function\uff09\u3002\u7576\u61c9\u7528\u7a0b\u5f0f\u5b8c\u6210\u8655\u7406\u8acb\u6c42\u5f8c\uff0c\u900f\u904e\u524d\u8ff0\u7684\u56de\u547c\u51fd\u5f0f\uff0c\u5c07\u7d50\u679c\u56de\u50b3\u7d66\u4f3a\u670d\u5668\u3002<\/p>\n<\/blockquote>\n<p>\u6b63\u56e0\u70baflask\u7b26\u5408\u9019\u5354\u5b9a\uff0c\u6240\u4ee5\u6211\u5011\u53ef\u4ee5\u5b9a\u7fa9<code><code>middelware<\/code><\/code>\u5728\u4e0d\u6539\u8b8aflask\u5167\u5bb9\u7684\u72c0\u6cc1\u4e0b\u4f86\u5b8c\u6210\u67d0\u4e9b\u529f\u80fd\u3002<\/p>\n<h1>\u91cd\u8981\u529f\u80fd<\/h1>\n<p>\u4ecb\u7d39\u5b8c\u751a\u9ebc\u662fflask\u5f8c\u76f8\u4fe1\u5927\u5bb6\u7d93\u904e\u7b2c\u4e00\u5929\u7684\u6587\u7ae0\u5c31\u77e5\u9053\u8981\u5982\u4f55\u4f7f\u7528\uff0cflask\u7684\u4f7f\u7528\u65b9\u5f0f\u5982\u4e0b\u5217\u5f0f\u5b50\u6240\u5217\uff1a<\/p>\n<pre><code class=\"language-python\">from flask import Flask\napp = Flask(__name__)\n\n@app.route(&quot;\/&quot;)\ndef hello():\n    return &quot;Hello World!&quot;\n\nif __name__ == &quot;__main__&quot;:\n    app.run()<\/code><\/pre>\n<p>\u6703\u4f7f\u7528flask\u5f8c\u9019\u88e1\u5728\u66f4\u9032\u4e00\u6b65\u8981\u4ecb\u7d39flask\u5167\u6709\u751a\u9ebc\u529f\u80fd\u3002<\/p>\n<h2>config<\/h2>\n<p>\u9019\u90e8\u5206\u4ecb\u7d39flask\u7684config\u8981\u5982\u4f55\u8a2d\u5b9a\uff0c\u57fa\u672c\u4e0a\u6709\u5e7e\u7a2e\u65b9\u6cd5\uff0c\u8f03\u5e38\u7528\u7684\u5206\u6210\u4ee5\u4e0b\u5e7e\u7a2e\u8a2d\u5b9a\u65b9\u5f0f\uff1a<\/p>\n<ul>\n<li>\u50cf\u64cd\u4f5c\u5b57\u5178\u4e00\u6a23\u7684\u8a2d\u5b9a<\/li>\n<li>\u50cf\u8a2d\u5b9a\u7269\u4ef6\u5c6c\u6027\u4e00\u6a23\u8a2d\u5b9a<\/li>\n<li>\u900f\u904e\u5b57\u5178\u7684update\u65b9\u6cd5\u4f86\u8a2d\u5b9a<\/li>\n<\/ul>\n<p>\u9996\u5148\u50cf\u64cd\u4f5c\u5b57\u5178<code><code>dict<\/code><\/code>\u4e00\u6a23\u7684\u8a2d\u5b9a\u65b9\u5f0f\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-python\">app.config[&#039;TESTING&#039;] = True<\/code><\/pre>\n<p>\u518d\u4f86\u8a2d\u5b9a\u7269\u4ef6\u5c6c\u6027\u7684\u65b9\u5f0f\u4f86\u8a2d\u5b9a<\/p>\n<pre><code class=\"language-python\">app.testing = True<\/code><\/pre>\n<p>\u6700\u5f8c\u662f\u900f\u904e\u5b57\u5178<code><code>dict<\/code>`<code>\u7684<\/code>`<code>update<\/code><\/code>\u65b9\u6cd5\u4e00\u6b21\u8a2d\u5b9a\u8cc7\u6599\u7684\u5167\u5bb9\u3002<\/p>\n<pre><code class=\"language-python\">app.config.update(\n    TESTING=True,\n    SECRET_KEY=b&#039;_5#y2L&quot;F4Q8z\\n\\xec]\/&#039;\n)<\/code><\/pre>\n<p>\u5728\u8aaa\u660e\u5b8c\u8a2d\u5b9a\u7684\u65b9\u5f0f\u5f8c\u518d\u4f86\u5982\u679c\u6709\u9700\u8981\u77e5\u9053flask\u6709\u54ea\u4e9b\u8cc7\u6599\u53ef\u4ee5\u8a2d\u5b9a\uff0c\u4ee5\u53ca\u8a2d\u5b9a\u5f8c\u6709\u751a\u9ebc\u516c\u7528\u8acb\u770b<a href=\"http:\/\/flask.pocoo.org\/docs\/1.0\/config\/\" rel=\"nofollow noopener\" target=\"_blank\">flask\u5b98\u7db2\u7684\u8a2d\u5b9a\u7ae0\u7bc0<\/a><\/p>\n<h2>Logging<\/h2>\n<p>\u76f8\u4fe1\u5927\u5bb6\u5728\u5728\u7522\u54c1\u4e0a\u7dda\u5f8c\u90fd\u6703\u9700\u8981log\u4f86\u8ffd\u8e64\u662f\u5426\u6709bug\uff0c\u6216\u8005\u662f\u5426\u6709\u51fa\u4e4e\u610f\u6599\u7684\u72c0\u6cc1\uff0c\u6b64\u6642\u76f8\u4fe1\u900f\u904eprint\u662f\u6c92\u8fa6\u6cd5\u89e3\u6c7a\u7684\uff0c\u6240\u4ee5\u9019\u88e1\u4ecb\u7d39flask\u5167\u5efa\u7684log\u529f\u80fdlogger\uff0c\u800c\u4f7f\u7528\u65b9\u5f0f\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-python\">app.logger.debug(&#039;A value for debugging&#039;)\napp.logger.warning(&#039;A warning occurred (%d apples)&#039;, 42)\napp.logger.error(&#039;An error occurred&#039;)<\/code><\/pre>\n<p>\u5176\u4e2d<code><code>app<\/code>`<code>\u5c31\u662fflask\u5be6\u9ad4\uff0c\u800c<\/code>`<code>logger<\/code><\/code>\u6709\u751a\u9ebc\u66f4\u9032\u4e00\u6b65\u7684\u7528\u6cd5\u5462\uff0c\u8acb\u5404\u4f4d\u8b80\u8005\u53c3\u8003flask\u5b98\u65b9\u7db2\u7ad9\u7684<a href=\"http:\/\/flask.pocoo.org\/docs\/1.0\/api\/#flask.Flask.logger\" rel=\"nofollow noopener\" target=\"_blank\">logger\u7bc7<\/a><\/p>\n<h2>\u4f7f\u7528WSGI\u7684middleware<\/h2>\n<p>\u5728\u5ba2\u88fd\u5316middleware\u4e4b\u524d\u5148\u6559\u5927\u5bb6\u5982\u4f55\u4f7f\u7528middleware\uff0c\u4f7f\u7528\u7684\u65b9\u6cd5\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-python\">app.wsgi_app = printMiddleware(app.wsgi_app)<\/code><\/pre>\n<p>\u5176\u4e2dapp\u5373\u662fflask\u7684\u5be6\u9ad4\uff0c\u800c\u5c07wsgi_app\u5305\u88dd\u8d77\u4f86\u5c31\u53ef\u4ee5\u5728\u547c\u53ebflask\u524d\u5f8c\u5148\u900f\u904emiddleware\u8655\u7406\u3002<\/p>\n<h2>\u5ba2\u88fd\u5316WSGI\u7684middleware<\/h2>\n<p>\u5728\u77e5\u9053\u5982\u4f55\u4f7f\u7528middleware\u4e4b\u5f8c\u8981\u9032\u4e00\u6b65\u544a\u8a34\u5927\u5bb6\u5982\u4f55\u81ea\u5b9a\u7fa9\u4e00\u500bmiddleware\uff0c\u8acb\u5404\u4f4d\u8b80\u8005\u770b\u4e00\u4e0b\u4e0b\u9762\u4f8b\u5b50\uff1a<\/p>\n<pre><code class=\"language-python\">class printMiddleware(object):\n    def __init__(self, app):\n        self.app = app\n\n    def __call__(self, environ, start_response):\n        print(&#039;\u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014&#039;)\n        print(&#039;Function called&#039;)\n        print(&#039;\u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014&#039;)\n        return self.app(environ, start_response)<\/code><\/pre>\n<p>\u76f8\u4fe1\u5404\u4f4d\u9084\u8a18\u5f97\u524d\u9762\u8aaa\u5230WSGI\u7684\u898f\u7bc4\uff0c<code><code>environ<\/code>`<code>\u5305\u542b\u4e86\u5ba2\u6237\u7aef\u8acb\u6c42\u7684\u4fe1\u606f\u4ee5\u53ca\u5176\u4ed6\u4fe1\u606f<\/code>`<code>start_response<\/code><\/code>\u5c31\u662f\u8981\u97ff\u61c9\u8fd4\u9084\u7684\u63a5\u53e3\uff0c\u900f\u904e\u4ee5\u4e0a\u7bc4\u4f8b\u53ef\u4ee5\u5728\u6bcf\u6b21request\u6642\u5728server\u7684console\u5370\u51fa\u4e0b\u5217\u5167\u5bb9\u4e86\u3002<\/p>\n<pre><code class=\"language-bash\">\u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014\nFunction called\n\u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014<\/code><\/pre>\n<h1>\u5c0f\u7d50<\/h1>\n<p>\u4eca\u5929\u7d42\u65bc\u958b\u59cb\u9032\u5165flask\u7684\u5167\u5bb9\u4e86\uff0c\u96d6\u7136\u8aaa\u4e86\u5f88\u591a\u89c0\u5ff5\u7684\u6771\u897f\uff0c\u4f46\u662f\u9084\u662f\u5e0c\u671b\u8b80\u8005\u5011\u4eca\u5929\u80fd\u6709\u6240\u6536\u7a6b\uff0c\u63a5\u4e0b\u4f86\u7684\u65e5\u5b50\u958b\u59cb\u8981\u4ecb\u7d39restful\u4ee5\u53caflask-restful\uff0c\u656c\u8acb\u671f\u5f85\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u751a\u9ebc\u662fflask \u751a\u9ebc\u662fflask\u5462?\u7dad\u57fa\u767e\u79d1\u9019\u6a23\u89e3\u91cb\uff1a<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[2],"tags":[162,4,5,3],"class_list":["post-348","post","type-post","status-publish","format-standard","hentry","category-develop","tag-2018ironman","tag-flask","tag-flask-restful","tag-python"],"_links":{"self":[{"href":"https:\/\/www.develop-note.com\/blog\/wp-json\/wp\/v2\/posts\/348","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.develop-note.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.develop-note.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.develop-note.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.develop-note.com\/blog\/wp-json\/wp\/v2\/comments?post=348"}],"version-history":[{"count":24,"href":"https:\/\/www.develop-note.com\/blog\/wp-json\/wp\/v2\/posts\/348\/revisions"}],"predecessor-version":[{"id":2757,"href":"https:\/\/www.develop-note.com\/blog\/wp-json\/wp\/v2\/posts\/348\/revisions\/2757"}],"wp:attachment":[{"href":"https:\/\/www.develop-note.com\/blog\/wp-json\/wp\/v2\/media?parent=348"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.develop-note.com\/blog\/wp-json\/wp\/v2\/categories?post=348"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.develop-note.com\/blog\/wp-json\/wp\/v2\/tags?post=348"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}