8

我需要在 Python 中实现一个非常简单的类似 Web 服务器的应用程序,它将执行基本的 HTTP 请求和响应,并在网页上显示非常基本的输出。我不太关心在 Python 中实际编码它,但我不知道从哪里开始?如何设置?一个文件?多个文件?我想我不知道如何处理这是一个“服务器”这一事实 - 所以我不熟悉如何处理 HTTP 请求/套接字/处理请求等。有什么建议吗?资源?

4

4 回答 4

10

您应该查看SimpleHttpServer (py3: http.server ) 模块。

根据您要执行的操作,您可以直接使用它,也可以查看模块的源代码(py2py3)以获取想法。

如果你想获得更底层的,SimpleHttpServer 扩展BaseHttpServer ( source ) 使其正常工作。

如果您想获得底层的信息,请查看SocketServer(来源:py2py3)。

如果他们只想共享一个目录,人们通常会像python -m SimpleHttpServer(或)一样运行 python:它是一个功能齐全且......简单的服务器。python3 -m http.server

于 2012-04-10T15:09:25.153 回答
6

您可以为此目的使用套接字编程。以下代码段创建一个 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上测试过,正如你们对其他浏览器的建议,代码被修改为:

  1. 要使响应类似于 http,您可以发送带有 http 版本 1.1、状态代码 200 OK 和内容类型 text/html 的普通标头。
  2. 提交响应后,客户端套接字需要关闭,因为它是 TCP 套接字。
  3. 要正确关闭客户端套接字,shutdown()需要调用socket.shutdown vs socket.close

然后在 chrome、firefox ( http://localhost:9000/ ) 和终端中的简单 curl (curl http://localhost:9000 ) 上测试代码。

于 2012-05-15T00:22:08.897 回答
1

我决定在 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 这样的框架,而不是自己编写。感谢您的初始代码。

于 2018-11-05T15:10:31.417 回答
-1

上面提到了一个非常简单的解决方案,但是上面的解决方案不起作用。该解决方案在 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()

这比接受的答案有所改进,但我会发布这个,以便未来的用户可以轻松使用它。

于 2019-01-26T20:25:33.527 回答