繁体   English   中英

仅使用标准库创建 web 服务器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM