
? Ein Mojo HTTP -Framework mit Flügeln
LightBug ist ein einfaches und süßes HTTP -Framework für Mojo, das auf bewährten Praxis aus Systemprogrammierungen aufbaut, wie z.
Dies ist noch nicht bereit. Wir wollen mit neuen Entwicklungen in Mojo Schritt halten, aber es kann einige Zeit dauern, um einen Punkt zu erreichen, an dem dies in realen Anwendungen sicher ist.
Lightbug hat derzeit die folgenden Funktionen:
def -Funktionen verwendet werden(zurück nach oben)
Die einzige harte Abhängigkeit für lightbug_http ist Mojo. Erfahren Sie, wie Sie auf der modularen Website mit Mojo auf dem Laufenden können. Sobald Sie ein Mojo -Projekt vor Ort eingerichtet haben,
Fügen Sie den mojo-community -Kanal zu Ihrem mojoproject.toml , z. B. hinzu:
[ project ]
channels = [ " conda-forge " , " https://conda.modular.com/max " , " https://repo.prefix.dev/mojo-community " ] Fügen Sie lightbug_http als Abhängigkeit hinzu:
[ dependencies ]
lightbug_http = " >=0.1.5 " Führen Sie magic install am Wurzel Ihres Projekts aus, wo sich mojoproject.toml befindet
Lightbug sollte jetzt als Abhängigkeit installiert werden. Sie können alle Standardimporte gleichzeitig importieren, z. B.:
from lightbug_http import *oder einzelne Strukturen und Funktionen importieren, z. B.
from lightbug_http.service import HTTPService
from lightbug_http.http import HTTPRequest, HTTPResponse, OK , NotFoundEs gibt einige Standard -Handler, mit denen Sie spielen können:
from lightbug_http.service import Printer # prints request details to console
from lightbug_http.service import Welcome # serves an HTML file with an image (currently requires manually adding files to static folder, details below)
from lightbug_http.service import ExampleRouter # serves /, /first, /second, and /echo routes Fügen Sie Ihren Handler in lightbug. durch Übergabe einer Struktur, die das folgende Merkmal erfüllt:
trait HTTPService :
fn func ( inout self , req : HTTPRequest) raises -> HTTPResponse:
... Zum Beispiel, um einen Printer zu erstellen, der einige Details zur Konsolenanforderung ausdruiert:
from lightbug_http import *
@value
struct Printer ( HTTPService ):
fn func ( inout self , req : HTTPRequest) raises -> HTTPResponse:
var uri = req.uri
print ( " Request URI: " , to_string(uri.request_uri))
var header = req.headers
print ( " Request protocol: " , req.protocol)
print ( " Request method: " , req.method)
print (
" Request Content-Type: " , to_string(header[HeaderKey. CONTENT_TYPE ])
)
var body = req.body_raw
print ( " Request Body: " , to_string(body))
return OK(body)Starten Sie einen Server, der einen Port mit Ihrem Dienst so anhört.
from lightbug_http import Welcome, Server
fn main () raises :
var server = Server()
var handler = Welcome()
server.listen_and_serve( " 0.0.0.0:8080 " , handler) Fühlen Sie sich frei, die Einstellungen in listen_and_serve() zu ändern, um in einem bestimmten Host und Port zu dienen.
Senden Sie nun eine Anfrage 0.0.0.0:8080 . Sie sollten einige Details zu der an die Konsole ausgedruckten Anfrage sehen.
Glückwunsch ? Sie verwenden Lightbug!
Routing ist für diese Bibliothek nicht im Rahmen, aber Sie können sich problemlos selbst Routen einrichten:
from lightbug_http import *
@value
struct ExampleRouter ( HTTPService ):
fn func ( inout self , req : HTTPRequest) raises -> HTTPResponse:
var body = req.body_raw
var uri = req.uri
if uri.path == " / " :
print ( " I'm on the index path! " )
if uri.path == " /first " :
print ( " I'm on /first! " )
elif uri.path == " /second " :
print ( " I'm on /second! " )
elif uri.path == " /echo " :
print (to_string(body))
return OK(body) Wir planen, in einer zukünftigen Bibliothek namens lightbug_api fortgeschrittenere Routing -Funktionen hinzuzufügen. Weitere Informationen finden Sie in Roadmap.
(zurück nach oben)
Der Standard -Begrüßungsbildschirm zeigt ein Beispiel für das Servieren von Dateien wie Bildern oder HTML mit LightBug. Mojo verfügt über integrierte Methoden open , read und read_bytes , mit denen Sie Dateien lesen und auf einer Route servieren können. Vorausgesetzt, Sie kopieren eine HTML -Datei und ein Bild aus dem Lightbug -Repo in ein static Verzeichnis am Root Ihres Repo:
from lightbug_http import *
@value
struct Welcome ( HTTPService ):
fn func ( inout self , req : HTTPRequest) raises -> HTTPResponse:
var uri = req.uri
if uri.path == " / " :
var html : Bytes
with open ( " static/lightbug_welcome.html " , " r " ) as f:
html = f.read_bytes()
return OK(html, " text/html; charset=utf-8 " )
if uri.path == " /logo.png " :
var image : Bytes
with open ( " static/logo.png " , " r " ) as f:
image = f.read_bytes()
return OK(image, " image/png " )
return NotFound(uri.path) Erstellen Sie eine Datei, z. B. client.mojo mit dem folgenden Code. Führen Sie magic run mojo client.mojo aus, um die Anfrage an eine bestimmte URL auszuführen.
from lightbug_http import *
from lightbug_http.client import Client
fn test_request ( inout client : Client) raises -> None :
var uri = URI .parse_raises( " http://httpbin.org/status/404 " )
var headers = Header( " Host " , " httpbin.org " )
var request = HTTPRequest(uri, headers)
var response = client.do(request ^ )
# print status code
print ( " Response: " , response.status_code)
# print parsed headers (only some are parsed for now)
print ( " Content-Type: " , response.headers[ " Content-Type " ])
print ( " Content-Length " , response.headers[ " Content-Length " ])
print ( " Server: " , to_string(response.headers[ " Server " ]))
print (
" Is connection set to connection-close? " , response.connection_close()
)
# print body
print (to_string(response.body_raw))
fn main () -> None :
try :
var client = Client()
test_request(client)
except e:
print (e)Der reine Mojo-basierte Client ist standardmäßig verfügbar. Dieser Client wird auch intern zum Testen des Servers verwendet.
Standardmäßig verwendet LightBug die reine Mojo -Implementierung für die Vernetzung. Um stattdessen die socket -Bibliothek von Python zu verwenden, importieren Sie einfach den PythonServer anstelle des Server mit der folgenden Zeile:
from lightbug_http.python.server import PythonServer Sie können dann alle regulären Serverbefehle auf die gleiche Weise wie beim Standardserver verwenden. Hinweis: Ab September 2024 werfen PythonServer und PythonClient beim Starten einen Kompilierungsfehler. Es gibt ein offenes Problem, um dies zu beheben - Beiträge willkommen!

Wir arbeiten an der Unterstützung für Folgendes (Mitwirkende Willkommen!):
Es ist geplant, zu einem Feature -Set zu gelangen, der Python -Frameworks wie Starlette ähnelt, jedoch mit einer besseren Leistung.
Unsere Vision ist es, drei Bibliotheken mit lightbug_http (dieses Repo) als Ausgangspunkt zu entwickeln:
lightbug_http - HTTP -Infrastruktur und grundlegende API -Entwicklunglightbug_api - (später im Jahr 2024!) Tools, um großartige APIs schnell zu machen, mit Unterstützung für OpenAPI -Spezifikation und domänengesteuerte Designlightbug_web - (Veröffentlichungsdatum TBD) Full -Stack -Web -Framework für Mojo, ähnlich wie bei NextJs oder SufleKitDie Idee ist, an einen Punkt zu gelangen, an dem die gesamte Codebasis einer einfachen modernen Webanwendung in Mojo geschrieben werden kann.
Wir machen jedoch keine Versprechen - dies ist nur eine Vision, und ob wir dort ankommen oder nicht, hängt von vielen Faktoren ab, einschließlich der Unterstützung der Gemeinschaft.
Sehen Sie sich die offenen Probleme an und geben Sie Ihre eigenen ein, um die Entwicklung von LightBug zu fördern.
(zurück nach oben)
Beiträge machen die Open -Source -Community zu einem erstaunlichen Ort, um zu lernen, zu inspirieren und zu kreieren. Alle Beiträge, die Sie leisten, werden sehr geschätzt . Weitere Informationen zum Beitrag leisten weiter.
Wenn Sie einen Vorschlag haben, der dies besser machen würde, geben Sie bitte das Repo und erstellen Sie eine Pull -Anfrage. Sie können auch einfach ein Problem mit dem Tag "Verbesserung" eröffnen. Vergessen Sie nicht, dem Projekt einen Stern zu geben!
git checkout -b feature/AmazingFeature ).git commit -m 'Add some AmazingFeature' )git push origin feature/AmazingFeature )(zurück nach oben)
Unter der MIT -Lizenz verteilt. Weitere Informationen finden Sie LICENSE.txt .
(zurück nach oben)
Valentin Erokhin
Projektlink: https://github.com/saviorand/mojo-web
(zurück nach oben)
Wir haben viel auf die folgenden Projekte gezogen:
(zurück nach oben)
Möchten Sie, dass Ihr Name hier auftaucht? Siehe Beitrag.md!
Mit Beitragsröcken gemacht.