收到POST http请求后,“资源暂时不可用” - Python

时间:2013-02-07 22:18:04

标签: python forms http-post

我的服务器套接字有问题。我正在制作一个Web服务器并尝试从浏览器填充。表单HTML脚本如下所示:

<html>
<body bgcolor = black text= white>
<FORM method="post" action="/processData.py">
<P>
<LABEL for="firstname">First name: </LABEL>
<INPUT type="text" id="firstname"><BR>

<LABEL for="lastname">Last name: </LABEL>
<INPUT type="text" id="lastname"><BR>

<LABEL for="email">email: </LABEL>
<INPUT type="text" id="email"><BR>

<INPUT type="radio" name="sex" value="Male"> Male<BR>
<INPUT type="radio" name="sex" value="Female"> Female<BR>

<INPUT type="submit" value="Send"> <INPUT type="reset">
</P>
</FORM>
</body>
</html>

我正在尝试在点击“提交”后从浏览器发送POST请求时在我的终端上打印整个请求。当我在我的网络服务器上收到POST请求时,套接字会抛出'[Errno 35]资源暂时不可用'。我没有关闭连接或任何东西,但不知何故我失去联系。这是我在python中用来获取POST的代码。

while not recvIsComplete:
    rcvdStr = fd.recv( 1024 )
    if rcvdStr[0:3] == "GET":
        toGET()

    elif rcvdStr[0:4] == "POST":       
        print rcvdStr

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这可能不正确,但似乎很可能基于您提供的信息:

您已经编写了一个阻塞服务器 - 可能是每个客户端连接都在自己的线程中(但可能使用进程或greenlet,或者甚至可能只是一次只处理一个客户端)。但是你正在使用非阻塞套接字。

详细信息取决于您的确切代码和平台,但最常见的原因是您在非阻塞套接字上调用recv且没有数据,并且它返回EWOULDBLOCK ,您的平台与EAGAINEWOULDBLOCK具有相同的错误编号。

如果是这样,简单的答案是:不要将非阻塞套接字与阻塞服务器一起使用。确保套接字处于阻止模式,或者不要在它们上面调用recv,除非您知道有数据(例如,因为select刚刚告诉您)。

可以通过try recv处理阻止服务器中的非阻塞套接字并以某种方式处理EWOULDBLOCK(例如{{}只在那个套接字上再试一次,或发送一个心跳/空闲数据包以确保另一面仍在那里,或者适合你的设计的任何东西)。但通常,这不是你想要做的;你可以用select做一些更简单的事。