2013-01-08 88 views
0

为了演示基本的HTTP处理,我正在尝试定义一个非常小的HTTP服务器演示的过程。我一直在使用优秀的werkzeug库,我试图“多一些”。我目前的服务器确实太多:)最小的HTTP服务器与Werkzeug - 内部服务器错误

#!/usr/bin/env python2.7 
# encoding: utf-8 

if __name__ == '__main__': 
    from werkzeug.serving import run_simple 
    run_simple('127.0.0.1', 6969, application=None) 

run_simple正在处理的东西已经太多了。使得该服务器的请求,

→ http GET http://127.0.0.1:6969/ 

当我们得到:

HTTP/1.0 500 INTERNAL SERVER ERROR 
Content-Type: text/html 
Content-Length: 291 
Server: Werkzeug/0.8.3 Python/2.7.1 
Date: Tue, 08 Jan 2013 07:45:46 GMT 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> 
<title>500 Internal Server Error</title> 
<h1>Internal Server Error</h1> 
<p>The server encountered an internal error and was 
unable to complete your request. Either the server 
is overloaded or there is an error in the application.</p> 

我很想把它降低到最低限度。并且使用500内部服务器错误作为一切。理想的情况是从服务器的响应应该是500任何HTTP请求,只是说,因为服务器不知道请求任何

HTTP/1.0 500 INTERNAL SERVER ERROR 

然后在第二阶段,我可能会添加

HTTP/1.0 500 INTERNAL SERVER ERROR 
Content-Type: text/plain 

Internal Server Error 

然后通过理解它们开始处理请求。目标是在这个过程中进行教育。欢迎任何接管默认答案的建议。

更新001

有:

#!/usr/bin/env python2.7 
# encoding: utf-8 

from werkzeug.wrappers import BaseResponse as Response 


def application(environ, start_response): 
    response = Response('Internal Server Error', status=500) 
    return response(environ, start_response) 

if __name__ == '__main__': 
    from werkzeug.serving import run_simple 
    run_simple('127.0.0.1', 6969, application) 

它将返回

HTTP/1.0 500 INTERNAL SERVER ERROR 
Content-Type: text/plain; charset=utf-8 
Content-Length: 21 
Server: Werkzeug/0.8.3 Python/2.7.1 
Date: Tue, 08 Jan 2013 07:55:10 GMT 

Internal Server Error 

我想删除至少在服务器,哪些是可选的日期。

+0

所以,你要HTTP的实现,其通过回复'500内部服务器ERROR'一切符合? – Potatoswatter

+0

是的。几分钟后,我取得了一些进展。 – karlcow

+0

是否有必要使用库?只要打开一个TCP端口并在任何人发送两条换行符时打印字符串。 – Potatoswatter

回答

3

作为基本示例,我不会使用第三方库。您可以使用Python附带的BaseHTTPServer模块。

import BaseHTTPServer 

PORT = 8000 

class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler): 
    def send_response(self, code, message=None): 
     """Send the response header and log the response code. 

     In contrast to base class, do not send two standard headers 
     with the server software version and the current date. 
     """ 
     self.log_request(code) 
     if message is None: 
      if code in self.responses: 
       message = self.responses[code][0] 
      else: 
       message = '' 
     if self.request_version != 'HTTP/0.9': 
      self.wfile.write("%s %d %s\r\n" % 
          (self.protocol_version, code, message)) 

    def do_GET(self): 
     self.send_response(500) 
     self.send_header("Content-type", "text/html") 
     self.end_headers() 
     self.wfile.write("Internal Server Error\n") 


httpd = BaseHTTPServer.HTTPServer(("", PORT), MyHandler) 
print "serving at port", PORT 
httpd.serve_forever() 

这将为我们提供以下响应:

HTTP/1.0 500 Internal Server Error 
Content-type: text/html 

Internal Server Error 

在那里你可以做你的变化是现在在do_GET法的地方。我认为每条生产线都很明显。

选择1:

更基本的是

import SocketServer 

response = """HTTP/1.0 500 Internal Server Error 
Content-type: text/html 

Invalid Server Error""" 

class MyTCPHandler(SocketServer.BaseRequestHandler): 
    """ 
    The RequestHandler class for our server. 

    It is instantiated once per connection to the server, and must 
    override the handle() method to implement communication to the 
    client. 
    """ 


    def handle(self): 
     # self.request is the TCP socket connected to the client 
     self.data = self.request.recv(1024).strip() 
     self.request.sendall(response) 

if __name__ == "__main__": 
    HOST, PORT = "localhost", 8000 
    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler) 
    server.serve_forever() 
+0

它不起作用。采取GET方法意味着我们已经理解了这个请求。通过HEAD,PUT或其他任何方式改变GET,它应该以相同的方式失败:) 500真的意味着我无法处理这个。 – karlcow

+0

增加了另一个例子,也许这有助于。 –

+0

仍然试图用werkzeug做 – karlcow