如何使用 python 套接字获取表单值?

How to get form value using python sockets?

我用表单创建了一个简单的网站,我想获取在 id 'message'
上输入的输入 我的代码:

website.py

import socket

SERVER_HOST = '127.0.0.1'
SERVER_PORT = 8000
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((SERVER_HOST, SERVER_PORT))
server_socket.listen(1)
print('Listening on port %s ...' % SERVER_PORT)
#sender
while True:    
    client_connection, client_address = server_socket.accept()

    request = client_connection.recv(1024).decode()
    print(request)
    with open('form.html', 'r')as f:
        file=f.read()
    response = 'HTTP/1.0 200 OK\n\n'+file
    client_connection.sendall(response.encode())
    client_connection.close()
server_socket.close()

form.html

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title>form</title>
  </head>
  <body>
    <form action="/" method="get" accept-charset="utf-8">
      <input type="text" name="message" id="message" value="" />
      <input type="submit" name="submit" id="submit" value="submit" />
    </form>
<script>
//what will be here?
</script>
  </body>
</html>

你能帮我打印在 id 'message' 上输入的输入吗?
仅使用套接字或其他内部库。

有多种方法可以做到:

  1. 使用 XMLHttpRequest 可以进行网络请求。这可用于获取页面。示例:
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        console.log(this.responseText); // good result !
    }
};
xmlhttp.open("GET", "http://my.url/example", true);
xmlhttp.send();

然后,在您的 HTML 页面中,您只需要 return 结果。

  1. 使用WebSocket

服务器端

你必须使用支持 WebSocket 的东西。它不同于“基本”套接字,因为它将通过 HTTP 协议(​​但在 8000 端口上)。

要做到这一点,您应该使用 Python Websocket。您可以使用 pip install websocket-server.

安装它

这是我的代码:

import logging
from websocket_server import WebsocketServer

def new_client(client, server):
   print("New client !")

def received_msg(client, server, message):
   print("New message:", message)

server = WebsocketServer(host='127.0.0.1', port=8000, loglevel=logging.INFO)
server.set_fn_new_client(new_client)
server.set_fn_message_received(received_msg)
server.run_forever()

客户端

这是 HTML websocket 利用率的部分:

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title>form</title>
  </head>
  <body>
    <form action="/" method="get" accept-charset="utf-8">
      <input type="text" name="message" id="message" value="" />
    </form>
    <button onclick="run()">Run</button>
  </body>
  <script type="text/javascript">
    var socket = new WebSocket("ws://localhost:8000");
    socket.onopen = function (event) {
      console.log("opened");
      socket.send("Opened !");
    };
    function run() {
      socket.send(JSON.stringify({ "message": document.getElementById("message").value }));
    }

  </script>
</html>

终于

当您显示 HTML 页面时,输入消息并单击“运行”:

INFO:websocket_server.websocket_server:Listening on port 8000 for clients..
INFO:websocket_server.websocket_server:Starting WebsocketServer on main thread.
New client !
New message: Opened !
New message: {"message":"value"}