我需要在Python中实现一个非常简单的类似于Web服务器的应用程序,它将执行基本的HTTP请求和响应,并在网页上显示非常基本的输出。我并不太关心实际在Python中编码,但我不确定从哪里开始?如何设置这个?一个文件?多个文件?我猜我不知道如何处理这是一个“服务器”的事实 - 所以我不熟悉如何处理HTTP请求/套接字/处理请求等。有什么建议?资源?
我需要在Python中实现一个非常简单的类似于Web服务器的应用程序,它将执行基本的HTTP请求和响应,并在网页上显示非常基本的输出。我并不太关心实际在Python中编码,但我不确定从哪里开始?如何设置这个?一个文件?多个文件?我猜我不知道如何处理这是一个“服务器”的事实 - 所以我不熟悉如何处理HTTP请求/套接字/处理请求等。有什么建议?资源?
python -m SimpleHttpServer
(或python3 -m http.server
):这是一个完全功能的简单服务器。from socket import *
def createServer():
serversocket = socket(AF_INET, SOCK_STREAM)
serversocket.bind(('localhost',9000))
serversocket.listen(5)
while(1):
(clientsocket, address) = serversocket.accept()
clientsocket.send("HTTP/1.1 200 OK\n"
+"Content-Type: text/html\n"
+"\n" # Important!
+"<html><body>Hello World</body></html>\n")
clientsocket.shutdown(SHUT_WR)
clientsocket.close()
serversocket.close()
createServer()
启动服务器,$ python server.py
。
在您的Web浏览器中打开http://localhost:9000/
(作为客户端)。然后在浏览器窗口中,您可以看到文本“Hello World”(HTTP响应)。
编辑** 先前的代码仅在Chrome上进行了测试,并且由于您们建议其他浏览器,因此代码已修改为:
shutdown()
socket.shutdown vs socket.close然后在Chrome、Firefox(http://localhost:9000/)和终端中的简单curl(curl http://localhost:9000)上测试了该代码。
sendall()
和 .encode("utf-8")
绝对必不可少,这两个函数都解决了我遇到的错误。到目前为止,我的所有服务器尝试都失败了,所以我非常感激。这是一个应该受到赞赏的回答,但我不喜欢 clientsocket.send("HTTP/1.1 200 OK\n" +"Content-Type: text/html\n" +"\n" # Important! +"<html><body>Hello World</body></html>\n")
。难道那不应该在同一行上吗?我不得不修改那一部分。再次感谢。:) - Xantium我决定使用Python 3来制作这个项目,并且让它可以在Chrome中使用,以便作为我正在开发的在线课程的示例。当然,Python 3需要在正确的位置使用encode()
和decode()
。而Chrome则希望在获取数据之前发送GET请求。我还添加了一些错误检查,以确保在中止服务器或出现故障时清理其套接字:
def createServer():
serversocket = socket(AF_INET, SOCK_STREAM)
try :
serversocket.bind(('localhost',9000))
serversocket.listen(5)
while(1):
(clientsocket, address) = serversocket.accept()
rd = clientsocket.recv(5000).decode()
pieces = rd.split("\n")
if ( len(pieces) > 0 ) : print(pieces[0])
data = "HTTP/1.1 200 OK\r\n"
data += "Content-Type: text/html; charset=utf-8\r\n"
data += "\r\n"
data += "<html><body>Hello World</body></html>\r\n\r\n"
clientsocket.sendall(data.encode())
clientsocket.shutdown(SHUT_WR)
except KeyboardInterrupt :
print("\nShutting down...\n");
except Exception as exc :
print("Error:\n");
print(exc)
serversocket.close()
print('Access http://localhost:9000')
createServer()
$ python3 server.py
Access http://localhost:9000
GET / HTTP/1.1
GET /favicon.ico HTTP/1.1
^C
Shutting down...
但这是一个很好的例子,大多数情况下它展示了为什么你想使用像Flask或DJango这样的框架而不是编写自己的框架。感谢提供初始代码。
上面提到了一个非常简单的解决方案,但是上面的解决方案并不起作用。这个解决方案在Chrome上经过测试,可以正常工作。这是Python 3,尽管我从未在Python 2上测试过。
from socket import *
def createServer():
serversocket = socket(AF_INET, SOCK_STREAM)
serversocket.bind(('localhost',9000))
serversocket.listen(5)
while(1):
(clientsocket, address) = serversocket.accept()
clientsocket.send(bytes("HTTP/1.1 200 OK\n"
+"Content-Type: text/html\n"
+"\n" # Important!
+"<html><body>Hello World</body></html>\n",'utf-8'))
clientsocket.shutdown(SHUT_WR)
clientsocket.close()
serversocket.close()
createServer()
这是对已被接受的答案进行改进,但我会发布它,以便未来的用户可以轻松使用它。