{"id":933,"date":"2016-08-11T02:28:18","date_gmt":"2016-08-10T18:28:18","guid":{"rendered":"http:\/\/192.168.1.101\/wordpress\/?p=933"},"modified":"2017-07-17T05:46:41","modified_gmt":"2017-07-17T05:46:41","slug":"%e5%88%a9%e7%94%a8python-%e6%9e%84%e5%bb%ba%e4%b8%80%e4%b8%aaapp-%e6%a8%a1%e6%8b%9f%e6%b5%8b%e8%af%95%e7%8e%af%e5%a2%83","status":"publish","type":"post","link":"https:\/\/blog.xiunian.wang\/?p=933","title":{"rendered":"\u5229\u7528python \u6784\u5efa\u4e00\u4e2aAPP \u6a21\u62df\u6d4b\u8bd5\u73af\u5883"},"content":{"rendered":"<h2>\u80cc\u666f<\/h2>\n<p>\u505aapp\u5f00\u53d1\u7684\uff0c\u548c\u540e\u53f0\u8fde\u8c03\u662f\u4e00\u4e2a\u5f88\u91cd\u8981\u7684\u5de5\u4f5c\u3002\u5728\u6211\u6765\u5230\u8fd9\u5bb6\u516c\u53f8\u4e4b\u524d\uff0c\u4e00\u53ea\u4ee5\u4e3a\u6240\u6709\u7684\u529f\u80fd\u662f\u540e\u53f0\u5148\u5f00\u53d1\u51fa\u6765\u7136\u540eapp\u624d\u5f00\u59cb\u5f00\u53d1\u3002\u4f46\u662f\u7531\u4e8e\u73b0\u5728app\u5f00\u53d1\u548c\u540e\u53f0\u5f00\u53d1\u662f\u4e24\u5957\u4eba\u9a6c\uff0c\u6240\u4ee5\u4e0d\u53ef\u907f\u514d\u7684\u9700\u8981\u540c\u65f6\u5f00\u53d1\u751a\u81f3\u540c\u65f6\u4e0a\u7ebf\u3002\u6211\u4eec\u4e0d\u5f97\u4e0d\u9762\u4e34\u7684\u4e00\u4e2a\u95ee\u9898\u662f\u540e\u53f0\u53ea\u7ed9\u51fa\u4e86\u63a5\u53e3\uff0c\u5ba2\u6237\u7aef\u5e76\u6ca1\u6709\u53ef\u4ee5\u8fde\u8c03\u7684\u73af\u5883\uff0c\u8fd9\u6837\u5c31\u4e0d\u5f97\u4e0d\u81ea\u5df1\u5199\u865a\u62df\u6570\u636e\u6a21\u62df\u3002\u8ba9\u5ba2\u6237\u7aef\u80fd\u591f\u6309\u67d0\u4e2a\u6d41\u7a0b\u80fd\u591f\u70b9\u4e0b\u53bb\u3002<\/p>\n<p><!--more--><\/p>\n<h2>\u89e3\u51b3\u65b9\u6cd5<\/h2>\n<ol>\n<li>\u5728\u6211\u63a5\u624b\u94b1\u76d2\u7684\u65f6\u5019\uff0c\u5f88\u591a\u5730\u65b9\u6709\u4e00\u4e2a\u5168\u5c40\u9759\u6001flag\uff0c\u597d\u50cf\u53eb\u4e00\u4e2a\u8d70\u9a6c\u89c2\u82b1\u6a21\u5f0f\u3002\u5f00\u542f\u8fd9\u4e2aflag\uff0c\u53ef\u4ee5\u4e0d\u4e0e\u540e\u53f0\u4ea4\u4e92,\u800c\u76f4\u63a5\u4e00\u6b65\u4e00\u6b65\u8d70\u754c\u9762\u3002\u8fd9\u79cd\u65b9\u6cd5\u56fa\u7136\u6bd4\u8f83\u597d\uff0c\u4f46\u662f\u8fd9\u4e2a\u4fee\u6539\u4e86\u4ee3\u7801\u7684\u6d41\u7a0b\uff0c\u5728\u771f\u5b9e\u73af\u5883\u4e0b\u7528\u4e0d\u5230\u8fd9\u4e2a\u903b\u8f91\uff0c\u800c\u4e14\u5bb9\u6613\u7ed9app\u6d4b\u8bd5\u57cb\u5751\u3002<\/li>\n<li>\u5229\u7528mock\u6280\u672f\u6a21\u62dfhttp\u8fd4\u56de\uff0c\u8fd9\u867d\u7136\u6709\u5f88\u591a\u6846\u67b6\u53ef\u4ee5\u505a\u5230\uff0c\u4f46\u662f\u5bf9\u4e8e\u65b0\u4eba\u800c\u8a00\uff0c\u5b66\u4e60\u6210\u672c\u8f83\u9ad8\uff0c\u4e0d\u540c\u5e73\u53f0\u53ef\u80fd\u6709\u4e0d\u540c\u7684\u89e3\u51b3\u65b9\u6848\u3002\u56e0\u6b64\u4e5f\u4e0d\u662f\u89e3\u51b3\u8fde\u8c03\u95ee\u9898\u7684\u9996\u9009\u3002<\/li>\n<li>\u5199http\u670d\u52a1\u6a21\u62df\u6570\u636e\u8fd4\u56de\u3002\u8fd9\u662f\u4e00\u79cd\u517c\u5bb9\u591a\u4e2a\u5e73\u53f0\u7684\u65b9\u6848\uff0candroid ios \u4ee5\u53cah5 \u90fd\u80fd\u591f\u9002\u914d\u7684\u901a\u7528\u89e3\u51b3\u65b9\u6848\u3002\u4e0b\u9762\u5206\u6790\u4e00\u4e0b\u5982\u4f55\u5b9e\u73b0<\/li>\n<\/ol>\n<h2>\u5b9e\u73b0<\/h2>\n<p>\u505a\u8fc7servlet \u7684\u4eba\u90fd\u77e5\u9053\uff0cservlet\u662f\u4e00\u4e2a\u57fa\u4e8ejava\u7684http\u670d\u52a1\u5668\u7684\u62d3\u5c55\uff0c\u7c7b\u4f3c\u4e8ecgi(common gateway interface)\u3002\u4e00\u4e2aservlet\u5b9e\u73b0\u7c7b\u9700\u8981\u4e00\u822c\u6765\u8bf4\u8981\u5b9e\u73b0doGet doPost\uff0c\u7528\u6765\u5904\u7406\u5ba2\u6237\u7aef\u53d1\u9001\u8fc7\u6765\u7684\u6570\u636e\u3002\u5904\u7406\u5b8c\u6210\u4e4b\u540e\u901a\u8fc7response\u8fd4\u56de\u6570\u636e\u3002\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u52a8\u6001\u7684\u7ed9\u5ba2\u6237\u7aef\u8fd4\u56de\u6570\u636e\u4e86\u3002\u4f46\u662fservlet\u7a0b\u5e8f\u662f\u9700\u8981\u90e8\u7f72\u5230server\u5bb9\u5668\u91cc\u9762\u3002\u6bd4\u5982tomcat\u624d\u80fd\u6267\u884c\uff0c\u8981\u88c5java\u8fd0\u884c\u73af\u5883\u3002\u800c\u4e14java\u4ee3\u7801\u662f\u76f8\u5bf9\u6bd4\u8f83\u7e41\u7410\u3002\u56e0\u6b64\u6211\u4eec\u7528\u53e6\u5916\u4e00\u79cd\u53ef\u4ee5\u98de\u8d77\u6765\u7684\u8bed\u8a00python\u6765\u5b9e\u73b0\u3002\u53ea\u9700\u8981python\u73af\u5883\u5373\u53ef\uff0cpython\u6807\u51c6\u73af\u5883\u5c31\u5305\u542b\u4e86http\u76f8\u5173\u7684\u7c7b\u5e93<\/p>\n<p>\u6211\u4eec\u5c06\u8fd4\u56de\u7684\u6570\u636e\u5199\u6b7b\u5728\u4ee3\u7801\u91cc\u9762\u663e\u7136\u662f\u4e0d\u79d1\u5b66\u7684\u3002\u56e0\u4e3a\u4e0d\u53ef\u80fd\u6211\u4eec\u8981\u6539\u4e00\u4e2a\u8fd4\u56de\u5c31\u5f97\u4fee\u6539\u4ee3\u7801\uff0c\u5e76\u91cd\u65b0\u8fd0\u884c\uff0c\u91c7\u7528\u6587\u4ef6\u4fdd\u5b58\u8fd4\u56de\u5185\u5bb9\u662f\u4e00\u4e2a\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6cd5\uff0c\u7136\u540e\u901a\u8fc7\u4e0d\u540c\u7684\u8bf7\u6c42\u8def\u5f84\u53bb\u83b7\u53d6\u76f8\u5e94\u7684\u6587\u4ef6\u3002\u6ca1\u6709\u627e\u5230\u76f8\u5e94\u6587\u4ef6\u5c31\u521b\u5efa\u76f8\u5e94\u6587\u4ef6\u3002<\/p>\n<p>\u4e8e\u662f\u5f00\u59cb\u7f51\u4e0a\u67e5\u8be2 https:\/\/wiki.python.org\/moin\/BaseHttpServer \u53ea\u9700\u5b9e\u73b0BaseHttpServer\u5c31\u80fd\u5b9e\u73b0\u4e00\u4e2a\u7b80\u5355\u7684http\u8bf7\u6c42\u5904\u7406\u7a0b\u5e8f\u3002<\/p>\n<pre><code class=\"python\">import time\r\nimport BaseHTTPServer\r\n\r\n\r\nHOST_NAME = 'example.net' # !!!REMEMBER TO CHANGE THIS!!!\r\nPORT_NUMBER = 80 # Maybe set this to 9000.\r\n\r\n\r\nclass MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):\r\n    def do_HEAD(s):\r\n        s.send_response(200)\r\n        s.send_header(\"Content-type\", \"text\/html\")\r\n        s.end_headers()\r\n    def do_GET(s):\r\n        \"\"\"Respond to a GET request.\"\"\"\r\n        s.send_response(200)\r\n        s.send_header(\"Content-type\", \"text\/html\")\r\n        s.end_headers()\r\n        s.wfile.write(\"&lt;html&gt;&lt;head&gt;&lt;title&gt;Title goes here.&lt;\/title&gt;&lt;\/head&gt;\")\r\n        s.wfile.write(\"&lt;body&gt;&lt;p&gt;This is a test.&lt;\/p&gt;\")\r\n        # If someone went to \"http:\/\/something.somewhere.net\/foo\/bar\/\",\r\n        # then s.path equals \"\/foo\/bar\/\".\r\n        s.wfile.write(\"&lt;p&gt;You accessed path: %s&lt;\/p&gt;\" % s.path)\r\n        s.wfile.write(\"&lt;\/body&gt;&lt;\/html&gt;\")\r\n\r\nif __name__ == '__main__':\r\n    server_class = BaseHTTPServer.HTTPServer\r\n    httpd = server_class((HOST_NAME, PORT_NUMBER), MyHandler)\r\n    print time.asctime(), \"Server Starts - %s:%s\" % (HOST_NAME, PORT_NUMBER)\r\n    try:\r\n        httpd.serve_forever()\r\n    except KeyboardInterrupt:\r\n        pass\r\n    httpd.server_close()\r\n    print time.asctime(), \"Server Stops - %s:%s\" % (HOST_NAME, PORT_NUMBER)\r\n\r\n<\/code><\/pre>\n<p>\u6574\u4e2a\u4ee3\u7801\u5c3135\u884c\u3002\u5728\u6b64\u57fa\u7840\u4e0a\u53c2\u9605\u4e86\u4e00\u4e9b\u76f8\u5173\u6587\u6863\uff0c\u6211\u91cd\u65b0\u5199\u4e86do_POST\u65b9\u6cd5\uff0c\u53ef\u4ee5\u521b\u5efa\u548c\u8bfb\u53d6\u6587\u4ef6<br \/>\n\u4e00\u4e2a\u7b80\u5355\u7684\u6a21\u62df\u8fd4\u56deapp \u5c31\u642d\u5efa\u597d\u4e86 \u4ee3\u7801\u5982\u4e0b<\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/python\r\n# coding=utf-8\r\n\"\"\"\r\nimport sys\r\nreload(sys)\r\nsys.setdefaultencoding('utf-8')\r\n\"\"\"\r\nfrom BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer\r\nimport os\r\nimport cgi\r\nimport time\r\nimport codecs\r\nimport sys\r\n\r\nreload(sys)\r\nsys.setdefaultencoding(\"utf-8\")\r\nprint sys.getdefaultencoding()\r\n\r\nPORT_NUMBER = 8888\r\nRES_FILE_DIR = \".\"\r\n\r\n\r\nclass myHandler(BaseHTTPRequestHandler):\r\n    def do_GET(self):\r\n        if self.path == \"\/\":\r\n            self.path = \"\/index.html\"\r\n\r\n        try:\r\n            # \u6839\u636e\u8bf7\u6c42\u7684\u6587\u4ef6\u6269\u5c55\u540d\uff0c\u8bbe\u7f6e\u6b63\u786e\u7684mime\u7c7b\u578b\r\n            sendReply = False\r\n            if self.path.endswith(\".html\"):\r\n                mimetype = 'text\/html'\r\n                sendReply = True\r\n            if self.path.endswith(\".jpg\"):\r\n                mimetype = 'image\/jpg'\r\n                sendReply = True\r\n            if self.path.endswith(\".gif\"):\r\n                mimetype = 'image\/gif'\r\n                sendReply = True\r\n            if self.path.endswith(\".js\"):\r\n                mimetype = 'application\/javascript'\r\n                sendReply = True\r\n            if self.path.endswith(\".css\"):\r\n                mimetype = 'text\/css'\r\n                sendReply = True\r\n\r\n            if sendReply == True:\r\n                # \u8bfb\u53d6\u76f8\u5e94\u7684\u9759\u6001\u8d44\u6e90\u6587\u4ef6\uff0c\u5e76\u53d1\u9001\u5b83\r\n                f = open(os.curdir + os.sep + self.path, 'rb')\r\n                self.send_response(200)\r\n                self.send_header('Content-type', mimetype)\r\n                self.end_headers()\r\n                self.wfile.write(f.read())\r\n                f.close()\r\n            return\r\n\r\n        except IOError:\r\n            self.send_error(404, 'File Not Found: %s' % self.path)\r\n\r\n    def do_POST(self):\r\n        form = cgi.FieldStorage(\r\n            fp=self.rfile,\r\n            headers=self.headers,\r\n            environ={'REQUEST_METHOD': 'POST',\r\n                     'CONTENT_TYPE': self.headers['Content-Type'],\r\n            })\r\n        print self.path\r\n        keys = form.keys()\r\n        params = \"\"\r\n        for key in keys:\r\n            params += key + \"=\" + form.getvalue(key, \"\") + \"\\n\"\r\n        print params[:len(params) - 1]\r\n\r\n        # \u8bfb\u53d6\u76f8\u5e94\u7684\u9759\u6001\u8d44\u6e90\u6587\u4ef6\uff0c\u5e76\u53d1\u9001\u5b83\r\n        full_file_path = os.curdir + os.sep + self.path\r\n        if os.path.isfile(full_file_path):\r\n            file_out = open(full_file_path, 'rb')\r\n            full_text = file_out.read()\r\n            file_out.close()\r\n            self.send_response(200)\r\n            self.end_headers()\r\n            if len(full_text) &gt; 0:\r\n                self.wfile.write(full_text)\r\n                print(full_text)\r\n            else:\r\n                self.wfile.write(u\"{\\\"status\\\":1,\\\"remark\\\":\\\"\u8bf7\u6c42\u5904\u7406\u4e0d\u5b58\u5728\\\"}\")\r\n        else:\r\n            self.send_response(200)\r\n            self.end_headers()\r\n            retstr = u\"{\\\"status\\\":-1,\\\"remark\\\":\\\"\u8bf7\u6c42\u5904\u7406\u4e0d\u5b58\u5728,\u65b0\u5efa\u5904\u7406\\\"}\"\r\n            self.wfile.write(retstr)\r\n            if not os.path.exists(os.path.split(full_file_path)[0]):\r\n                os.makedirs(os.path.split(full_file_path)[0])\r\n            fwrite = codecs.open(full_file_path, 'wb', 'utf-8')\r\n            fwrite.write(retstr)\r\n            fwrite.close()\r\n            print retstr, \"\u5df2\u4fdd\u5b58\u5230\u6587\u4ef6\uff0c\u8def\u5f84:\", full_file_path\r\n\r\n\r\ntry:\r\n    server = HTTPServer(('', PORT_NUMBER), myHandler)\r\n    print 'Started httpserver on port ', PORT_NUMBER\r\n\r\n    server.serve_forever()\r\n\r\nexcept KeyboardInterrupt:\r\n    print '^C received, shutting down the web server'\r\n    server.socket.close()\r\n\r\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u80cc\u666f \u505aapp\u5f00\u53d1\u7684\uff0c\u548c\u540e\u53f0\u8fde\u8c03\u662f\u4e00\u4e2a\u5f88\u91cd\u8981\u7684\u5de5\u4f5c\u3002\u5728\u6211\u6765\u5230\u8fd9\u5bb6\u516c\u53f8\u4e4b\u524d\uff0c\u4e00\u53ea\u4ee5\u4e3a\u6240\u6709\u7684\u529f\u80fd\u662f\u540e\u53f0\u5148\u5f00\u53d1\u51fa\u6765\u7136\u540eapp\u624d\u5f00\u59cb\u5f00\u53d1\u3002\u4f46\u662f\u7531\u4e8e\u73b0\u5728app\u5f00\u53d1\u548c\u540e\u53f0\u5f00\u53d1\u662f\u4e24\u5957\u4eba\u9a6c\uff0c\u6240\u4ee5\u4e0d\u53ef\u907f\u514d\u7684\u9700\u8981\u540c\u65f6\u5f00\u53d1\u751a\u81f3\u540c\u65f6\u4e0a\u7ebf\u3002\u6211\u4eec\u4e0d\u5f97\u4e0d\u9762\u4e34\u7684\u4e00\u4e2a\u95ee\u9898\u662f\u540e\u53f0\u53ea\u7ed9\u51fa\u4e86\u63a5\u53e3\uff0c\u5ba2\u6237\u7aef\u5e76\u6ca1\u6709\u53ef\u4ee5\u8fde\u8c03\u7684\u73af\u5883\uff0c\u8fd9\u6837\u5c31\u4e0d\u5f97\u4e0d\u81ea\u5df1\u5199\u865a\u62df\u6570\u636e\u6a21\u62df\u3002\u8ba9\u5ba2\u6237\u7aef\u80fd\u591f\u6309\u67d0\u4e2a\u6d41\u7a0b\u80fd\u591f\u70b9\u4e0b\u53bb\u3002<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.xiunian.wang\/index.php?rest_route=\/wp\/v2\/posts\/933"}],"collection":[{"href":"https:\/\/blog.xiunian.wang\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.xiunian.wang\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.xiunian.wang\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.xiunian.wang\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=933"}],"version-history":[{"count":1,"href":"https:\/\/blog.xiunian.wang\/index.php?rest_route=\/wp\/v2\/posts\/933\/revisions"}],"predecessor-version":[{"id":951,"href":"https:\/\/blog.xiunian.wang\/index.php?rest_route=\/wp\/v2\/posts\/933\/revisions\/951"}],"wp:attachment":[{"href":"https:\/\/blog.xiunian.wang\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=933"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.xiunian.wang\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=933"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.xiunian.wang\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=933"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}