1

我想只使用 std 库在 Python 中实现一个网页。

我用 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

你有什么建议吗 ?
谢谢你的关注

4

1 回答 1

3

您选择的处理程序类的文档非常清楚地说明了

此类提供当前目录及以下目录中的文件,直接将目录结构映射到 HTTP 请求。

这就是为什么您会看到car.py.

您必须实现自己的处理程序类,派生自BaseHTTPRequestHandler,以满足您的需求。这个简单的示例仅在您访问/data.

顺便说一句,在这里比较 PHP 和 Python(“在 PHP 中很容易”)是苹果和橘子。使用 PHP,您也有一些东西(无论是 Apache、Nginx、PHP-FPM、PHP 的内置 Web 服务器)来处理请求并选择要使用的脚本、调用它等,在这里您可以从头开始做所有事情.

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()
于 2020-05-08T12:47:12.900 回答