无法检索在 Localhost:port python 上运行的 HTML 表单数据

Posted

技术标签:

【中文标题】无法检索在 Localhost:port python 上运行的 HTML 表单数据【英文标题】:unable to retrieve HTML form data running on Localhost:port python 【发布时间】:2021-07-01 03:56:45 【问题描述】:

我正在使用套接字编程在我的 localhost:port 上运行一个简单的表单输入。

目前,我在我的 chrome 上运行了一个表单,只是 localhost:2333 上的一个文本框,我可以像这样在我的 wireshark 上看到文本框输入

我输入的输入消息是 testesest。 之后,我将<form action="http://localhost:2333"> 放入,以便输入的表单数据可以流回我的localhost:port。但是,我的第二个 r= recv(1024) 没有收到任何东西。

import socket
import sys
import os

Addr = ''
PORT = 2333
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((Addr, PORT))
s.listen()

以上为标准部分。

while(1):
    try:
        print("waiting for connection")
        conn, address = s.accept()
        print("New client connected from IP address  and port number ".format(*address))
        
        received = conn.recv(1024)
        #print("Request received")

        #This is what i am hosting
        #A webpage with a form
        
        
        conn.send(b'\r\n')
        
        #This is the webpage content

        
        #The code will stuck here at recv
        print("Waiting for form input from client")
        r = conn.recv(1024)
        print(r.decode())

                
        print("Form input received")
        print("HTTP response sent")


    except KeyboardInterrupt:
        conn.close()
        s.close()

    conn.close()
    s.close()
    break   

我可以得到一些帮助吗?

【问题讨论】:

【参考方案1】:

通过GET 发送的输入数据附加到URI (/?work=<data>),作为新请求发送:

import socket
import sys
import os

Addr = ''
PORT = 2333
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((Addr, PORT))
s.listen()

while (1):
    try:
        print("waiting for connection")
        conn, address = s.accept()
        print(
            "New client connected from IP address  and port number ".format(
                *address
            )
        )

        request = conn.recv(1024)
        print("Request received")
        method, uri, _ = request.decode().split(' ', 2)
        print(method, uri)

        #This is what i am hosting
        #A webpage with a form

        response = ""
        conn.send(b'HTTP/1.1 200 OK\r\n')
        conn.send(b'Content-Type: text/html\r\n')
        conn.send(b'Host: localhost:2333\n')
        conn.send(b'\r\n')

        if uri == '/':
            response = """<html>
                <body><form action="http://localhost:2333/" method="GET">
                <input type="text" name="work"></form></body>
                </html>"""
        elif uri.startswith('/?work'):
            response = f"<html><body><h2>recevied: uri[uri.find('/?work=')+7:]</h2></body></html>"

        conn.send(response.encode())
        conn.send(b"\r\n")

        print("Form input received")
        #print("HTTP response sent")

    except KeyboardInterrupt:
        conn.close()
        s.close()

    #conn.close()
    #s.close()
    #break

输出:

waiting for connection
New client connected from IP address 127.0.0.1 and port number 55941
Request received
GET /?work=TestInput
<html><body><h2>recevied: TestInput</h2></body></html>
Form input received
waiting for connection
...

注意: 你可能想看看protocol specs 和/或使用任何现有的库来摆脱这些低级的东西。

【讨论】:

【参考方案2】:

每当我们提交任何表单时,浏览器都会发出新的http请求而不是使用现有的连接,因此您需要在新的http请求/连接中处理它。

另一件事是,r = conn.recv(1024) 不会让当前连接关闭,这就是为什么在文本字段中按 enter 也不起作用。

【讨论】:

以上是关于无法检索在 Localhost:port python 上运行的 HTML 表单数据的主要内容,如果未能解决你的问题,请参考以下文章

XMLHTTPRequest 无法加载 http://... Origin http://localhost:port is not allowed by Access-Control-Allow-O

错误请求 - 使用 localhost:port 以外的其他方式访问时主机名无效

C# Web - localhost:port 有效,127.0.0.1:port 无效

我在哪里可以在 Kesterl 代码中找到字符串:“现在正在侦听:http://localhost:port”?

允许 UIWebView 在没有 Internet 连接的情况下加载 http://localhost:port/path URI

localhost 在 Webapi 操作中拒绝连接