{"id":50479,"date":"2024-12-03T10:25:50","date_gmt":"2024-12-03T02:25:50","guid":{"rendered":"https:\/\/fwq.ai\/blog\/50479\/"},"modified":"2024-12-03T10:25:50","modified_gmt":"2024-12-03T02:25:50","slug":"%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8-python-%e5%b0%86%e6%82%a8%e7%9a%84%e8%ae%be%e5%a4%87%e5%8f%98%e6%88%90%e7%ae%80%e5%8d%95%e7%9a%84%e6%9c%8d%e5%8a%a1%e5%99%a8","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/50479\/","title":{"rendered":"\u5982\u4f55\u4f7f\u7528 Python \u5c06\u60a8\u7684\u8bbe\u5907\u53d8\u6210\u7b80\u5355\u7684\u670d\u52a1\u5668"},"content":{"rendered":"<p><b><\/b>     <\/p>\n<h1>\u5982\u4f55\u4f7f\u7528 Python \u5c06\u60a8\u7684\u8bbe\u5907\u53d8\u6210\u7b80\u5355\u7684\u670d\u52a1\u5668<\/h1>\n<p>\u4ece\u73b0\u5728\u5f00\u59cb\uff0c\u6211\u4eec\u8981\u52aa\u529b\u5b66\u4e60\u5566\uff01\u4eca\u5929\u6211\u7ed9\u5927\u5bb6\u5e26\u6765<span style=\"color: #FF6600;, Helvetica, Arial, sans-serif;font-size: 14px;background-color: #FFFFFF\">\u300a\u5982\u4f55\u4f7f\u7528 Python \u5c06\u60a8\u7684\u8bbe\u5907\u53d8\u6210\u7b80\u5355\u7684\u670d\u52a1\u5668\u300b<\/span>\uff0c\u611f\u5174\u8da3\u7684\u670b\u53cb\u8bf7\u7ee7\u7eed\u770b\u4e0b\u53bb\u5427\uff01\u4e0b\u6587\u4e2d\u7684\u5185\u5bb9\u6211\u4eec\u4e3b\u8981\u4f1a\u6d89\u53ca\u5230<span style=\"color: #FF6600;, Helvetica, Arial, sans-serif;font-size: 14px;background-color: #FFFFFF\"><\/span>\u7b49\u7b49\u77e5\u8bc6\u70b9\uff0c\u5982\u679c\u5728\u9605\u8bfb\u672c\u6587\u8fc7\u7a0b\u4e2d\u6709\u9047\u5230\u4e0d\u6e05\u695a\u7684\u5730\u65b9\uff0c\u6b22\u8fce\u7559\u8a00\u5440\uff01\u6211\u4eec\u4e00\u8d77\u8ba8\u8bba\uff0c\u4e00\u8d77\u5b66\u4e60\uff01<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20241120\/1732104926673dd2de6652f.jpg\" class=\"aligncenter\" title=\"\u5982\u4f55\u4f7f\u7528 Python \u5c06\u60a8\u7684\u8bbe\u5907\u53d8\u6210\u7b80\u5355\u7684\u670d\u52a1\u5668\u63d2\u56fe\" alt=\"\u5982\u4f55\u4f7f\u7528 Python \u5c06\u60a8\u7684\u8bbe\u5907\u53d8\u6210\u7b80\u5355\u7684\u670d\u52a1\u5668\u63d2\u56fe\" \/><\/p>\n<p><em>\u4f5c\u8005\uff1a\u7279\u91cc\u514b\u65af\u00b7\u8d5b\u52d2\u65af<\/em><\/p>\n<p>\u8ba9\u6211\u4eec\u521b\u5efa\u4e00\u4e2a\u4ece\u60a8\u7684\u8bbe\u5907\u6258\u7ba1\u7684 python \u670d\u52a1\u5668\u3002<\/p>\n<p>\u5f00\u59cb..<\/p>\n<p>\u521b\u5efa\u4e00\u4e2a\u540d\u4e3aserver\u7684\u76ee\u5f55<\/p>\n<pre>mkdir server\n<\/pre>\n<p>\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a server.py \u7684\u6587\u4ef6<\/p>\n<pre>nano server.py\n<\/pre>\n<p>\u7c98\u8d34\u4ee5\u4e0b\u4ee3\u7801\u3002<\/p>\n<pre>import http.server\nimport socketserver\nimport logging\nimport os\nimport threading\nfrom urllib.parse import urlparse, parse_qs\n\nport = 8080\ndirectory = \"www\"  \n\nlogging.basicconfig(level=logging.info, format='%(asctime)s - %(message)s', datefmt='%y-%m-%d %h:%m:%s')\n\nclass myhandler(http.server.simplehttprequesthandler):\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, directory=directory, **kwargs)\n\n    def log_message(self, format, *args):\n        logging.info(\"%s - %s\" % (self.client_address[0], format % args))\n\n    def do_get(self):\n        parsed_path = urlparse(self.path)\n        query = parse_qs(parsed_path.query)\n\n        # custom logic for different routes\n        if parsed_path.path == '\/':\n            self.serve_file(\"index.html\")\n        elif parsed_path.path == '\/about':\n            self.respond_with_text(\"&lt;h1&gt;about us&lt;\/h1&gt;&lt;p&gt;this is a custom python server.&lt;\/p&gt;\")\n        elif parsed_path.path == '\/greet':\n            name = query.get('name', ['stranger'])[0]\n            self.respond_with_text(f\"&lt;h1&gt;hello, {name}!&lt;\/h1&gt;\")\n        else:\n            self.send_error(404, \"file not found\")\n\n    def do_post(self):\n        content_length = int(self.headers['content-length'])\n        post_data = self.rfile.read(content_length)\n        logging.info(\"received post data: %s\", post_data.decode('utf-8'))\n        self.respond_with_text(\"&lt;h1&gt;post request received&lt;\/h1&gt;\")\n\n    def serve_file(self, filename):\n        if os.path.exists(os.path.join(directory, filename)):\n            self.send_response(200)\n            self.send_header(\"content-type\", \"text\/html\")\n            self.end_headers()\n            with open(os.path.join(directory, filename), 'rb') as file:\n                self.wfile.write(file.read())\n        else:\n            self.send_error(404, \"file not found\")\n\n    def respond_with_text(self, content):\n        self.send_response(200)\n        self.send_header(\"content-type\", \"text\/html\")\n        self.end_headers()\n        self.wfile.write(content.encode('utf-8'))\n\nclass threadedhttpserver(socketserver.threadingmixin, http.server.httpserver):\n    daemon_threads = true  # handle requests in separate threads\n\ndef run_server():\n    try:\n        with threadedhttpserver((\"\", port), myhandler) as httpd:\n            logging.info(f\"serving http on port {port}\")\n            logging.info(f\"serving files from directory: {directory}\")\n            httpd.serve_forever()\n    except exception as e:\n        logging.error(f\"error starting server: {e}\")\n    except keyboardinterrupt:\n        logging.info(\"server stopped by user\")\n\nif __name__ == \"__main__\":\n    server_thread = threading.thread(target=run_server)\n    server_thread.start()\n\n    server_thread.join()\n<\/pre>\n<p>\u521b\u5efa\u4e00\u4e2a\u540d\u4e3awww\u7684\u76ee\u5f55<\/p>\n<pre>mkdir www\n<\/pre>\n<p>\u73b0\u5728\u5bfc\u822a\u5230 www \u76ee\u5f55<\/p>\n<pre>cd www\n<\/pre>\n<p>\u521b\u5efa\u4e00\u4e2a\u540d\u4e3aindex.html\u7684\u6587\u4ef6<\/p>\n<pre>nano index.html\n<\/pre>\n<p>\u5c06\u4ee5\u4e0b\u4ee3\u7801\u7c98\u8d34\u5230\u5176\u4e2d<\/p>\n<pre>&lt;!doctype html&gt;\n&lt;html lang=\"en\"&gt;\n&lt;head&gt;\n    &lt;meta charset=\"utf-8\"&gt;\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"&gt;\n    &lt;title&gt;python simple server&lt;\/title&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n    &lt;h1&gt;welcome to my python server!&lt;\/h1&gt;\n    &lt;p&gt;this is a simple web server running on your local device.&lt;\/p&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;\n<\/pre>\n<p><strong>\u7b2c 2 \u6b65\uff1a\u6d4b\u8bd5\u8def\u7531<\/strong><\/p>\n<p>\u8fd0\u884c\u4fee\u6539\u540e\u7684\u811a\u672c\u540e\uff0c\u8f6c\u5230\uff1a<\/p>\n<p>http:\/\/localhost:8080\/ \u67e5\u770b\u4e3b\u9875\u3002<br \/> http:\/\/localhost:8080\/about \u67e5\u770b\u5173\u4e8e\u9875\u9762\u3002<br \/> http:\/\/localhost:8080\/greet?name=trix<br \/> \u5bf9\u4e8e\u4efb\u4f55\u5176\u4ed6\u8def\u5f84\uff0c\u670d\u52a1\u5668\u5c06\u8fd4\u56de 404 \u9519\u8bef\u3002<\/p>\n<p>\u4e0b\u9762\u662f\u76ee\u5f55\u7ed3\u6784<\/p>\n<pre>server\/\n\u251c\u2500\u2500 server.py\n\u2514\u2500\u2500 www\/\n    \u2514\u2500\u2500 index.html\n<\/pre>\n<p><strong>\u5728\u8fdc\u7a0b\u8bbe\u5907\u4e0a\u8fd0\u884c\u670d\u52a1\u5668<\/strong><\/p>\n<p>\u5982\u679c\u60a8\u60f3\u4ece\u540c\u4e00\u7f51\u7edc\u4e0a\u7684\u53e6\u4e00\u53f0\u8bbe\u5907\u8bbf\u95ee\u60a8\u7684 python \u670d\u52a1\u5668\u600e\u4e48\u529e\uff1f\u60a8\u53ef\u4ee5\u901a\u8fc7\u67e5\u627e\u8fd0\u884c\u670d\u52a1\u5668\u7684\u8ba1\u7b97\u673a\u7684\u672c\u5730 ip \u5730\u5740\u5e76\u4f7f\u7528\u5b83\u800c\u4e0d\u662f localhost \u6765\u8f7b\u677e\u5b8c\u6210\u6b64\u64cd\u4f5c\u3002<\/p>\n<p><strong>\u7b2c 1 \u6b65\uff1a\u67e5\u627e\u60a8\u7684 ip \u5730\u5740<\/strong><\/p>\n<p>\u4f7f\u7528\u7c7b\u4f3c<br \/>\u7684\u547d\u4ee4 <\/p>\n<pre>ipconfig\n<\/pre>\n<pre>ifconfig\n<\/pre>\n<p>\u67e5\u627e\u60a8\u7684 ipv4 \u5730\u5740\uff08\u4f8b\u5982 192.168.x.x\uff09\u3002<\/p>\n<p><strong>\u6b65\u9aa4 2. \u4fee\u6539\u60a8\u7684\u670d\u52a1\u5668\u811a\u672c<\/strong><\/p>\n<p>\u5728\u60a8\u7684\u670d\u52a1\u5668\u811a\u672c\u4e2d\uff0c\u66ff\u6362\u542f\u52a8\u670d\u52a1\u5668\u7684\u884c\uff1a<\/p>\n<pre>with threadedhttpserver((\"\", port), myhandler) as httpd:\n<\/pre>\n<p>\u66f4\u6539\u4e3a\uff1a<\/p>\n<pre>with ThreadedHTTPServer((\"0.0.0.0\", PORT), MyHandler) as httpd:\n<\/pre>\n<p><strong>\u7b2c 3 \u6b65\uff1a\u4ece\u53e6\u4e00\u53f0\u8bbe\u5907\u8bbf\u95ee\u670d\u52a1\u5668<\/strong><\/p>\n<p>\u73b0\u5728\uff0c\u4f7f\u7528\u60a8\u4e4b\u524d\u627e\u5230\u7684 ip \u5730\u5740\uff0c\u60a8\u53ef\u4ee5\u901a\u8fc7\u6d4f\u89c8\u5668\u4e2d\u8bbf\u95ee <strong>http:\/\/:8080<\/strong> \u4ece\u540c\u4e00\u7f51\u7edc\u4e0a\u7684\u4efb\u4f55\u8bbe\u5907\u8bbf\u95ee\u670d\u52a1\u5668\u3002<\/p>\n<p>\u4e00\u5207\u5c31\u7eea<\/p>\n<p>~trixsec<\/p>\n<p>\u672c\u7bc7\u5173\u4e8e\u300a\u5982\u4f55\u4f7f\u7528 Python \u5c06\u60a8\u7684\u8bbe\u5907\u53d8\u6210\u7b80\u5355\u7684\u670d\u52a1\u5668\u300b\u7684\u4ecb\u7ecd\u5c31\u5230\u6b64\u7ed3\u675f\u5566\uff0c\u4f46\u662f\u5b66\u65e0\u6b62\u5883\uff0c\u60f3\u8981\u4e86\u89e3\u5b66\u4e60\u66f4\u591a\u5173\u4e8e\u6587\u7ae0\u7684\u76f8\u5173\u77e5\u8bc6\uff0c\u8bf7\u5173\u6ce8\u7c73\u4e91\u516c\u4f17\u53f7\uff01<\/p>\n<p>      \u7248\u672c\u58f0\u660e \u672c\u6587\u8f6c\u8f7d\u4e8e\uff1adev.to \u5982\u6709\u4fb5\u72af\uff0c\u8bf7\u8054\u7cfb\u5220\u9664<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5982\u4f55\u4f7f\u7528 Python \u5c06\u60a8\u7684\u8bbe\u5907\u53d8\u6210\u7b80\u5355\u7684\u670d\u52a1\u5668 \u4ece\u73b0\u5728\u5f00\u59cb\uff0c\u6211\u4eec\u8981\u52aa\u529b\u5b66\u4e60\u5566\uff01\u4eca\u5929\u6211\u7ed9\u5927\u5bb6\u5e26\u6765\u300a\u5982\u4f55\u4f7f\u7528 Python \u5c06\u60a8\u7684\u8bbe\u5907\u53d8\u6210\u7b80\u5355\u7684\u670d\u52a1\u5668\u300b\uff0c\u611f\u5174\u8da3\u7684\u670b\u53cb\u8bf7\u7ee7\u7eed\u770b\u4e0b\u53bb\u5427\uff01\u4e0b\u6587\u4e2d\u7684\u5185\u5bb9\u6211\u4eec\u4e3b\u8981\u4f1a\u6d89\u53ca\u5230\u7b49\u7b49\u77e5\u8bc6\u70b9\uff0c\u5982\u679c\u5728\u9605\u8bfb\u672c\u6587\u8fc7\u7a0b\u4e2d\u6709\u9047\u5230\u4e0d\u6e05\u695a\u7684\u5730\u65b9\uff0c\u6b22\u8fce\u7559\u8a00\u5440\uff01\u6211\u4eec\u4e00\u8d77\u8ba8\u8bba\uff0c\u4e00\u8d77\u5b66\u4e60\uff01 \u4f5c\u8005\uff1a\u7279\u91cc\u514b\u65af\u00b7\u8d5b\u52d2\u65af \u8ba9\u6211\u4eec\u521b\u5efa\u4e00\u4e2a\u4ece\u60a8\u7684\u8bbe\u5907\u6258\u7ba1\u7684 python \u670d\u52a1\u5668\u3002 \u5f00\u59cb.. \u521b\u5efa\u4e00\u4e2a\u540d\u4e3aserver\u7684\u76ee\u5f55 mkdir server \u521b\u5efa\u4e00\u4e2a\u540d\u4e3a server.py \u7684\u6587\u4ef6 nano server.py \u7c98\u8d34\u4ee5\u4e0b\u4ee3\u7801\u3002 import http.server import socketserver import logging import os import threading from urllib.parse import urlparse, parse_qs port = 8080 directory = &#8220;www&#8221; logging.basicconfig(level=logging.info, format=&#8217;%(asctime)s &#8211; %(message)s&#8217;, datefmt=&#8217;%y-%m-%d %h:%m:%s&#8217;) class myhandler(http.server.simplehttprequesthandler): def __init__(self, *args, **kwargs): super().__init__(*args, directory=directory, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16],"tags":[],"class_list":["post-50479","post","type-post","status-publish","format-standard","hentry","category-16"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/50479","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/comments?post=50479"}],"version-history":[{"count":0,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/50479\/revisions"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=50479"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=50479"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=50479"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}