无法检索在 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