0

基本的な HTTP 処理のデモンストレーションを行うために、私は本当に最小限の 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 Internal Server Error を使用してください。理想的には、サーバーからの応答は、すべての HTTP 要求に対して 500 である必要があります。サーバーは要求について何も知らないためです。

HTTP/1.0 500 INTERNAL SERVER ERROR

次に、第2段階で、おそらく追加します

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

オプションのサーバーと日付を少なくとも削除したい。

4

1 に答える 1

3

基本的な例として、サードパーティのライブラリは使用しません。Python に付属の BaseHTTPServer-module を使用できます。

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()
于 2013-01-08T08:29:52.800 に答える