我需要在 Python 中实现一个非常简单的类似 Web 服务器的应用程序,它将执行基本的 HTTP 请求和响应,并在网页上显示非常基本的输出。我不太关心在 Python 中实际编码它,但我不知道从哪里开始?如何设置?一个文件?多个文件?我想我不知道如何处理这是一个“服务器”这一事实 - 所以我不熟悉如何处理 HTTP 请求/套接字/处理请求等。有什么建议吗?资源?
4 回答
您应该查看SimpleHttpServer (py3: http.server ) 模块。
根据您要执行的操作,您可以直接使用它,也可以查看模块的源代码(py2、py3)以获取想法。
如果你想获得更底层的,SimpleHttpServer 扩展BaseHttpServer ( source ) 使其正常工作。
如果您想获得更底层的信息,请查看SocketServer(来源:py2,py3)。
如果他们只想共享一个目录,人们通常会像python -m SimpleHttpServer
(或)一样运行 python:它是一个功能齐全且......简单的服务器。python3 -m http.server
您可以为此目的使用套接字编程。以下代码段创建一个 tcp 套接字并在端口 9000 上侦听 http 请求:
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
. http://localhost:9000/
在您的网络浏览器(充当客户端)中打开。然后在浏览器窗口中,您可以看到文本“Hello World”(http 响应)。
编辑**之前的代码只在chrome上测试过,正如你们对其他浏览器的建议,代码被修改为:
- 要使响应类似于 http,您可以发送带有 http 版本 1.1、状态代码 200 OK 和内容类型 text/html 的普通标头。
- 提交响应后,客户端套接字需要关闭,因为它是 TCP 套接字。
- 要正确关闭客户端套接字,
shutdown()
需要调用socket.shutdown vs socket.close
然后在 chrome、firefox ( http://localhost:9000/ ) 和终端中的简单 curl (curl http://localhost:9000 ) 上测试代码。
我决定在 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()
服务器还打印出传入的 HTTP 请求。不管请求如何,代码当然只发送 text/html - 即使浏览器正在请求 favicon:
$ 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()
这比接受的答案有所改进,但我会发布这个,以便未来的用户可以轻松使用它。