
? Un cadre mojo http avec des ailes
Lightbug est un framework HTTP simple et doux pour Mojo qui s'appuie sur les meilleures pratiques à partir de la programmation de systèmes, comme le Golang Fasthtp et Rust May_minihttp.
Ce n'est pas encore prêt à la production. Nous visons à suivre les nouveaux développements dans Mojo, mais il peut prendre un certain temps pour arriver à un point où cela est sûr à utiliser dans les applications du monde réel.
Lightbug a actuellement les fonctionnalités suivantes:
def utilisées(retour en haut)
La seule dépendance dure pour lightbug_http est Mojo. Apprenez à être opérationnel avec Mojo sur le site Web modulaire. Une fois que vous avez un projet Mojo configuré localement,
Ajoutez le canal mojo-community à votre mojoproject.toml , par exemple:
[ project ]
channels = [ " conda-forge " , " https://conda.modular.com/max " , " https://repo.prefix.dev/mojo-community " ] Ajouter lightbug_http comme dépendance:
[ dependencies ]
lightbug_http = " >=0.1.5 " Exécutez magic install à la racine de votre projet, où se trouve mojoproject.toml
Lightbug doit désormais être installé comme dépendance. Vous pouvez importer toutes les importations par défaut à la fois, par exemple:
from lightbug_http import *ou importer des structures et des fonctions individuelles, par exemple
from lightbug_http.service import HTTPService
from lightbug_http.http import HTTPRequest, HTTPResponse, OK , NotFoundIl y a des gestionnaires par défaut avec lesquels vous pouvez jouer:
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 Ajoutez votre gestionnaire dans lightbug. En passant une structure qui satisfait le trait suivant:
trait HTTPService :
fn func ( inout self , req : HTTPRequest) raises -> HTTPResponse:
... Par exemple, pour créer un service Printer qui imprime quelques détails sur la demande de console:
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)Démarrez un serveur à écouter sur un port avec votre service comme ça.
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) N'hésitez pas à modifier les paramètres dans listen_and_serve() pour servir sur un hôte et un port en particulier.
Envoyez maintenant une demande 0.0.0.0:8080 . Vous devriez voir quelques détails sur la demande imprimée à la console.
Bravo ? Vous utilisez Lightbug!
Le routage n'est pas dans la portée de cette bibliothèque, mais vous pouvez facilement configurer les routes vous-même:
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) Nous prévoyons d'ajouter des fonctionnalités de routage plus avancées dans une future bibliothèque appelée lightbug_api , voir la feuille de route pour plus de détails.
(retour en haut)
L'écran de bienvenue par défaut montre un exemple de la façon de servir des fichiers comme des images ou HTML à l'aide de Lightbug. Mojo propose des méthodes open , read et read_bytes que vous pouvez utiliser pour lire des fichiers et les servir sur un itinéraire. En supposant que vous copiez un fichier HTML et une image du repo Lightbug dans un répertoire static à la racine de votre référentiel:
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) Créez un fichier, par exemple client.mojo avec le code suivant. Exécutez magic run mojo client.mojo pour exécuter la demande à une URL donnée.
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)Le client basé sur Pure Mojo est disponible par défaut. Ce client est également utilisé en interne pour tester le serveur.
Par défaut, Lightbug utilise l'implémentation Pure Mojo pour le réseautage. Pour utiliser la bibliothèque socket de Python à la place, importez simplement le PythonServer au lieu du Server avec la ligne suivante:
from lightbug_http.python.server import PythonServer Vous pouvez ensuite utiliser toutes les commandes de serveur régulières de la même manière qu'avec le serveur par défaut. Remarque: En septembre 2024, PythonServer et PythonClient lancent une erreur de compilation au démarrage. Il y a un problème ouvert pour résoudre ce problème - les contributions sont les bienvenues!

Nous travaillons sur le soutien de ce qui suit (les contributeurs sont les bienvenus!):
Le plan consiste à accéder à un ensemble de fonctionnalités similaire à Python Frameworks comme Starlette, mais avec de meilleures performances.
Notre vision est de développer trois bibliothèques, avec lightbug_http (ce repo) comme point de départ:
lightbug_http - Infrastructure HTTP et développement d'API de baselightbug_api - (à venir en 2024!) Outils pour faire de grandes API rapidement, avec une prise en charge des spécifications OpenAPI et de la conception axée sur le domainelightbug_web - (Date de sortie TBD) Framework Web Full-Stack pour Mojo, similaire à NextJS ou SveltekitL'idée est d'arriver à un point où toute la base de code d'une simple application Web moderne peut être écrite en Mojo.
Nous ne faisons aucune promesse, cependant - ce n'est qu'une vision, et si nous y arrivons ou non dépend de nombreux facteurs, y compris le soutien de la communauté.
Voir les problèmes ouverts et soumettre les vôtres pour aider à stimuler le développement de Lightbug.
(retour en haut)
Les contributions font de la communauté open source un endroit incroyable pour apprendre, inspirer et créer. Toutes les contributions que vous faites sont grandement appréciées . Voir contribution.md pour plus de détails sur la façon de contribuer.
Si vous avez une suggestion qui améliorerait cela, veuillez débarquer le dépôt et créer une demande de traction. Vous pouvez également ouvrir simplement un problème avec la balise "amélioration". N'oubliez pas de donner une étoile au projet!
git checkout -b feature/AmazingFeature )git commit -m 'Add some AmazingFeature' )git push origin feature/AmazingFeature )(retour en haut)
Distribué sous la licence du MIT. Voir LICENSE.txt pour plus d'informations.
(retour en haut)
Valentin Erokhin
Lien du projet: https://github.com/saviorand/mojo-web
(retour en haut)
Nous dessinions beaucoup sur les projets suivants:
(retour en haut)
Vous voulez que votre nom apparaisse ici? Voir contribution.md!
Fait avec contribution.