Heim  >  Artikel  >  Backend-Entwicklung  >  Hinweise zum Lesen des Flaschenquellcodes (1): WSGI

Hinweise zum Lesen des Flaschenquellcodes (1): WSGI

巴扎黑
巴扎黑Original
2017-06-23 15:06:292337Durchsuche

Vorwort

Bottle ist ein Python-Webframework. Das gesamte Framework verfügt über nur eine Datei, weniger als 4.000 Codezeilen und keine Abhängigkeiten außer der Python-Standardbibliothek. Es enthält jedoch allgemeine Funktionen von Web-Frameworks wie Routing, Vorlagen und Plug-Ins. Es gibt keinen besseren Zeitpunkt als das Lesen des Bottle-Quellcodes, um zu verstehen, was ein Web-Framework ist und wie es funktioniert. Da Bottle ein Framework ist, das WSGI unterstützt, wollen wir vor dem Lesen des Quellcodes zunächst verstehen, was WSGI ist.

Hinweis: Die in diesem Artikel verwendete Flaschenversion ist 0.12.13.

WSGI

Allgemeine Webserver können nur statische Seiten verarbeiten. Handelt es sich um dynamische Inhalte, muss der Server mit Serversprachen wie Java/Python/Ruby interagieren und ihnen den Inhalt zur Verarbeitung übergeben. Da die meisten Webserver in C geschrieben sind, können sie die Serversprache nicht direkt ausführen. Daher ist eine Brücke zwischen beiden erforderlich (in praktischen Anwendungen wird normalerweise ein Anwendungsserver zwischen dem Webserver und der WSGI-Anwendung hinzugefügt, um WSGI zu unterstützen). In Python ist WSGI eine solche Brücke. Die Implementierung von WSGI ist in zwei Teile unterteilt: Der eine ist der Server und der andere die Anwendung. Werfen wir einen Blick darauf, wie jeder von ihnen aussieht und wie die beiden zusammenarbeiten.

 1 class Server: 2  3     def __init__(self, server_address): 4         self.server_address = server_address 5  6     def set_app(self, application): 7         self.app = application 8  9     def serve_forever(self):10         while True:11             # socket.accept()12             if request_comein():13                 self.handle_request()14 15     def handle_request(self):16         request_data = self.get_request()17         self.parse_request(request_data)18         environ = self.get_environ()19         result = self.application(environ, self.start_response)20         self.send_response(result)21 22     def start_response(self, status, headers, exc_info):23         pass24 25     def get_environ(self):26         pass27 28     def get_request(self):29         pass30 31     def parse_request(self, text):32         pass33 34     def send_response(self, message):35         pass36 37 38 def make_server(host, port, app, server=Server):39     server = server((host, port))40     server.set_app(app)41     return server42 43 def simple_app(environ, start_response):44     status = '200 OK'45     response_headers = [('Content-type', 'text/plain')]46     start_response(status, response_headers)47     return 'Hello World!'48 49 if __name__ == '__main__':50     server = make_server('localhost', 8080, simple_app)51     server.serve_forever()

Dieses Servermodell ist durch den Platz begrenzt und lässt viele Details aus. Wenn Sie einen einfachen und lauffähigen WSGI-Server wünschen, können Sie hier auf Let's Build A verweisen Webserver.Teil 2.

Nach Erhalt der Anfrage analysiert der Server die Informationen in der Anfragenachricht und speichert das Ergebnis in einem Wörterbuch namens environ. Anschließend wird die Anwendung application(environ, start_response) mit environ und der start_response-Funktion aufgerufen, die Header-Informationen als Parameter verarbeitet. Abschließend werden die Ergebnisse der Anwendung zu einer neuen Antwort zusammengefasst und an den Client zurückgesendet.

Auf der Anwendungsseite ist eine WSGI-Anwendung ein aufrufbares Objekt. Es kann eine Funktion, Methode, Klasse oder eine Instanz mit einer __call__-Methode sein. Die obige Anwendung ist eine Funktion.

Wenn verschiedene Server und Anwendungen/Frameworks gemäß WSGI-Standards entwickelt werden, können wir verschiedene Server und Frameworks entsprechend unseren Anforderungen frei kombinieren.

Die einfachste Anwendung von Bottle

Nachdem wir WSGI kurz verstanden haben, kehren wir zu Bottle zurück, um zu beobachten, wie eine Bottle-Anwendung aussieht, wie sie ausgeführt wird und wie wir sie ausführen Unterschied zwischen den Modellen.

1 from bottle import Bottle, run2 3 app = Bottle()4 5 @app.route('/hello')6 def hello():7     return 'Hello World!'8 9 run(app, host='localhost', port=8080, server='wsgiref')

Führen Sie nun dieses Programm aus und verwenden Sie den Browser, um auf die Adresse „localhost:8080/hello“ zuzugreifen. Daraufhin wird „Hello World“ angezeigt !'

1 Im Gegensatz zur oben genannten Anwendung ist die Flaschenanwendung eine Instanz. Gemäß den WSGI-Vorschriften muss das Bottle-Objekt die Methode __call__ implementieren:

1 def __call__(self, environ, start_response):2     ''' Each instance of :class:'Bottle' is a WSGI application. '''3     return self.wsgi(environ, start_response)

Diese Bottle.wsgi-Methode ist also der Eingang für den Server, um das aufzurufen Bottle-Anwendung, und es ist auch der Einstiegspunkt für den Server, um die Bottle-Anwendung aufzurufen. Unser Einstiegspunkt zum Lesen des Quellcodes.

2. @app.route() Dieser Dekorator bindet eine Funktion an eine URL. Wenn wir auf „localhost:8080/hello“ zugreifen, wird die Hallo-Funktion aufgerufen.

3. Der Standardserver von Bottle ist wsgiref (eine einfache Implementierung von WSGI in der Python-Standardbibliothek). Natürlich hat Bottle auch Adapter für viele Server geschrieben. Sie müssen nur den Wert von server ändern, und die Funktion run() findet den entsprechenden Adapter basierend auf dem Namen des Servers. Es ist nicht erforderlich, zusätzlichen Code zu schreiben.

Funktion und Adapter-Teilecode ausführen:

 1 def run(app=None, server='wsgiref', host='127.0.0.1', port=8080, 2         interval=1, reloader=False, quiet=False, plugins=None, 3         debug=None, **kargs): 4     if server in server_names: 5         server = server_names.get(server) 6     if isinstance(server, basestring): 7         server = load(server) 8     if isinstance(server, type): 9         server = server(host=host, port=port, **kargs)10     if not isinstance(server, ServerAdapter):11         raise ValueError("Unknown or unsupported server: %r" % server)12     ...13     server.run(app)14 15 class MeinheldServer(ServerAdapter):16     def run(self, handler):17         from meinheld import server18         server.listen((self.host, self.port))19         server.run(handler)

Endlich

in diesem Artikel haben wir kurz vorgestellt, wie Server und Anwendungen unter dem WSGI-Standard interagieren. Im nächsten Artikel konzentrieren wir uns weiterhin auf diese einfachste Anwendung und sprechen über die Routing-Funktionen im Zusammenhang mit @app.route().

Das obige ist der detaillierte Inhalt vonHinweise zum Lesen des Flaschenquellcodes (1): WSGI. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn