【问题标题】:Empty POST request from HTML form (Python)来自 HTML 表单的空 POST 请求(Python)
【发布时间】:2020-02-05 01:10:04
【问题描述】:

我正在尝试使用 BaseHTTPRequestHandler 模块在 Python 中接收 POST 请求。我写了一个简单的 HTML 表单:

  <html>
    <head>
      <meta charset='UTF-8'>
    </head>
    <body>
      <form action="http://localhost:8080/" method='post'>
        <strong>Access point</strong><br>
        <label for='ssid'>SSID: </label>
          <input type='text' id=ssid><br>
        <label for='passphrase'>Passphrase: </label>
          <input type='password' id=passphrase><br>
        <br>
        <strong>Calendar</strong><br>
        <label for='id'>ID: </label>
          <input type='text' id=calid><br>
        <br>
        <input type='submit'>
        <input type='reset'>
      </form>
    </body>
  <html>

和一个最小的应用程序:

# -*- coding: utf-8 -*-

from http.server import BaseHTTPRequestHandler, HTTPServer
import socketserver
import socket
import sys

class ConfigHTTPRequestHandler(BaseHTTPRequestHandler):
    def _set_headers(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()

    def do_GET(self):
        self._set_headers()
        with open("index.html", "rb") as f:
            self.wfile.write(f.read())

    def do_HEAD(self):
        self._set_headers()

    def do_POST(self):
        print(self.headers)

        content_length = int(self.headers.get('Content-Length', 0))
        config_string = self.rfile.read(content_length).decode("UTF-8")
        print("Content length: ", content_length)
        print("Config string: [ ", config_string, " ]")

        self._set_headers()
        return

ConfigHTTPRequestHandler.protocol_version = "HTTP/1.0"
httpd = HTTPServer(("127.0.0.1", 8080), ConfigHTTPRequestHandler)

sa = httpd.socket.getsockname()
print("Serving HTTP on", sa[0], "port", sa[1], "...")
try:
    httpd.serve_forever()
except KeyboardInterrupt:
    print("\nKeyboard interrupt received, exiting.")
    httpd.server_close()
    sys.exit(0)

问题是每个 POST 请求都是空的。我得到 content_length = 0。

【问题讨论】:

    标签: python html forms post basehttpserver


    【解决方案1】:

    请为您的表单元素提供 name 属性,看看它是否有效。

    <html>
        <head>
            <meta charset='UTF-8'>
        </head>
        <body>
            <form action="http://localhost:8080/" method='post'>
                <strong>Access point</strong><br>
                <label for='ssid'>SSID: </label>
                <input type='text' id="ssid" name="ssid"><br>
                <label for='passphrase'>Passphrase: </label>
                <input type='password' id="passphrase" name="passphrase"><br>
                <br>
                <strong>Calendar</strong><br>
                <label for='id'>ID: </label>
                <input type='text' id="calid" name="calid"><br>
                <br>
                <input type='submit'>
                <input type='reset'>
            </form>
        </body>
    <html>
    

    【讨论】:

      【解决方案2】:

      我想详细说明 user7883492 的回答。

      根据this protocol description,仅提交表单的“成功控件”。
      根据this 一个成功的控制需要有一个名称属性。

      您的控件满足被视为“成功控件”的所有要求,但名称属性要求除外。
      这就是他们没有提交的原因。
      添加name属性后成为“成功控件”,并被提交。

      【讨论】:

        猜你喜欢
        • 2021-09-05
        • 2017-10-13
        • 1970-01-01
        • 2018-07-14
        • 2016-03-19
        • 2022-10-01
        • 2013-06-12
        • 1970-01-01
        • 2018-01-28
        相关资源
        最近更新 更多