[英]Create web server using ONLY standard library
我想仅使用 std 库在 Python 中实现 web 页面。
我在 PHP 中完成了它,但我想在 Python 中完成它,我很难理解文档。
这是我在 PHP 中所做的:
访问http://localhost:8888/project/src/car.php 。
用户必须填写一份表格,其中指定了汽车的品牌。
然后该站点返回http://localhost:8888/project/src/car.php?brand=toyota中的汽车 JSON 列表
它工作得很好。
在 PHP 中这很容易,但我无法在 Python 中找到仅使用标准库的方法。
你有什么建议吗?
这是我到目前为止所拥有的:
服务器.py:
import http.server
import socketserver
if __name__ == '__main__':
PORT = 8888
Handler = http.server.SimpleHTTPRequestHandler
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print("serving at port", PORT)
httpd.serve_forever()
索引.html:
<!-- used to make a form for the user -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Autocompletion</title>
</head>
<body>
<h2>Manufacturer finder</h2>
<p>
Please enter your research
</p>
<form action="car.py" method="get" class="form-example">
<div class="form-example">
<label for="brand">Enter your query: </label>
<input type="text" name="brand" id="brand" required>
</div>
<div class="form-example">
<input type="submit" value="Submit">
</div>
</form>
</body>
</html>
用户登陆 index.html 有一个表格要完成。 当用户填写表格时,打开文件: http://localhost:8888/car.py?brand=toyota
该脚本适用于http://localhost:8888/而不是http://localhost:8888/car.py (就像我的 PHP 脚本一样)但它不是问题。
填写表格后,我不知道如何检索变量制造商并显示来自品牌的汽车列表。 在 car.py 中,我有一个我需要的每个品牌的汽车列表,因此我只需要从该品牌获取正确的汽车并将其打印为 JSON,而无需额外的 HTML。
我遇到的问题:完成表格只需打印整个 car.py 文件。
表单不安全不是问题(您可以通过将结果附加到?brand=toyota 到 url)。
这就是我启动服务器的方式:
python server.py
你有什么建议吗?
谢谢你的关注
您选择的处理程序 class 的文档清楚地说明了
此 class 服务于当前目录及以下目录中的文件,直接将目录结构映射到 HTTP 请求。
这就是您看到car.py
内容的原因。
您必须实现自己的处理程序 class,从BaseHTTPRequestHandler
派生,以满足您的需求。 这个简单的示例仅在您访问/data
时将查询字符串解析并返回为 JSON 。
顺便说一句,在这里比较 PHP 和 Python (“在 PHP 中很容易”)是相当苹果和橘子的; with PHP, you also have something (be it Apache, Nginx, PHP-FPM, PHP's built-in web server) to process requests and choose which script to use, invoke it, etc., wherein here you're doing everything from scratch .
import urllib.parse
import http.server
import socketserver
import json
class CarHandler(http.server.SimpleHTTPRequestHandler):
def _send_content(self, data, status=200, content_type="text/plain"):
if isinstance(data, str):
data = data.encode("utf-8")
self.send_response(status)
self.send_header("Content-Type", content_type)
self.send_header("Content-Length", str(len(data)))
self.end_headers()
self.wfile.write(data)
self.wfile.flush()
def do_GET(self):
url = urllib.parse.urlparse(self.path)
if url.path == "/":
return self._send_content(
"<form method=get action=/data><input type=search name=q><input type=submit></form>",
content_type="text/html",
)
elif url.path == "/data":
qs = urllib.parse.parse_qs(url.query)
return self._send_content(json.dumps(qs), content_type="application/json")
else:
return self._send_content(f"404: {url}", status=400)
if __name__ == "__main__":
PORT = 8891
with socketserver.TCPServer(("", PORT), CarHandler) as httpd:
print("serving at port", PORT)
httpd.serve_forever()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.