
? Kerangka kerja mojo http dengan sayap
Lightbug adalah kerangka kerja HTTP yang sederhana dan manis untuk mojo yang dibangun berdasarkan praktik terbaik dari pemrograman sistem, seperti Golang Fasthttp dan Rust May_Minihttp.
Ini belum siap produksi. Kami bertujuan untuk mengikuti perkembangan baru di Mojo, tetapi mungkin perlu waktu untuk mencapai titik ketika ini aman untuk digunakan dalam aplikasi dunia nyata.
Lightbug saat ini memiliki fitur berikut:
def yang digunakan(kembali ke atas)
Satu -satunya ketergantungan yang sulit untuk lightbug_http adalah mojo. Pelajari cara bangun dan berjalan dengan mojo di situs web modular. Setelah Anda menyiapkan proyek mojo secara lokal,
Tambahkan Saluran mojo-community ke mojoproject.toml , misalnya:
[ project ]
channels = [ " conda-forge " , " https://conda.modular.com/max " , " https://repo.prefix.dev/mojo-community " ] Tambahkan lightbug_http sebagai ketergantungan:
[ dependencies ]
lightbug_http = " >=0.1.5 " Jalankan magic install di akar proyek Anda, tempat mojoproject.toml berada
Lightbug sekarang harus dipasang sebagai ketergantungan. Anda dapat mengimpor semua impor default sekaligus, misalnya:
from lightbug_http import *atau mengimpor struktur dan fungsi individu, misalnya
from lightbug_http.service import HTTPService
from lightbug_http.http import HTTPRequest, HTTPResponse, OK , NotFoundAda beberapa penangan default yang bisa Anda mainkan:
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 Tambahkan pawang Anda di lightbug. Dengan melewati struct yang memenuhi sifat berikut:
trait HTTPService :
fn func ( inout self , req : HTTPRequest) raises -> HTTPResponse:
... Misalnya, untuk membuat layanan Printer yang mencetak beberapa detail tentang permintaan ke konsol:
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)Mulailah server mendengarkan di port dengan layanan Anda seperti itu.
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) Jangan ragu untuk mengubah pengaturan di listen_and_serve() untuk melayani pada host dan port tertentu.
Sekarang kirim permintaan 0.0.0.0:8080 . Anda harus melihat beberapa detail tentang permintaan yang dicetak ke konsol.
Selamat ? Anda menggunakan Lightbug!
Routing tidak dalam ruang untuk perpustakaan ini, tetapi Anda dapat dengan mudah mengatur rute sendiri:
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) Kami berencana untuk menambahkan fungsi perutean yang lebih canggih di perpustakaan masa depan yang disebut lightbug_api , lihat peta jalan untuk lebih jelasnya.
(kembali ke atas)
Layar selamat datang default menunjukkan contoh cara melayani file seperti gambar atau HTML menggunakan LightBug. Mojo memiliki metode open , read , dan read_bytes yang dapat Anda gunakan untuk membaca file dan menyajikannya di rute. Dengan asumsi Anda menyalin file dan gambar html dari repo lightbug ke direktori static di akar repo Anda:
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) Buat file, misalnya client.mojo dengan kode berikut. Jalankan magic run mojo client.mojo untuk melaksanakan permintaan ke URL yang diberikan.
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)Klien yang berbasis di Mojo murni tersedia secara default. Klien ini juga digunakan secara internal untuk menguji server.
Secara default, LightBug menggunakan implementasi Murni Murni untuk jaringan. Untuk menggunakan pustaka socket Python sebagai gantinya, cukup impor PythonServer alih -alih Server dengan baris berikut:
from lightbug_http.python.server import PythonServer Anda kemudian dapat menggunakan semua perintah server biasa dengan cara yang sama seperti dengan server default. Catatan: Pada bulan September, 2024, PythonServer dan PythonClient melempar kesalahan kompilasi saat memulai. Ada masalah terbuka untuk memperbaikinya - kontribusi selamat datang!

Kami sedang mengerjakan dukungan untuk yang berikut (kontributor selamat datang!):
Rencananya adalah untuk mendapatkan set fitur yang mirip dengan kerangka kerja Python seperti Starlette, tetapi dengan kinerja yang lebih baik.
Visi kami adalah mengembangkan tiga perpustakaan, dengan lightbug_http (repo ini) sebagai titik awal:
lightbug_http - Infrastruktur HTTP dan Pengembangan API Dasarlightbug_api - (datang nanti di tahun 2024!) untuk membuat API yang hebat dengan cepat, dengan dukungan untuk spesifikasi openapi dan desain yang digerakkan domainlightbug_web - (Tanggal Rilis TBD) Kerangka kerja Web Full -Stack untuk Mojo, Mirip dengan NextJs atau SveltekitIdenya adalah untuk mencapai titik di mana seluruh basis kode dari aplikasi web modern sederhana dapat ditulis dalam mojo.
Kami tidak membuat janji apa pun - ini hanya sebuah visi, dan apakah kami sampai di sana atau tidak tergantung pada banyak faktor, termasuk dukungan masyarakat.
Lihat masalah terbuka dan kirimkan sendiri untuk membantu mendorong pengembangan Lightbug.
(kembali ke atas)
Kontribusi inilah yang membuat komunitas open source menjadi tempat yang luar biasa untuk belajar, menginspirasi, dan menciptakan. Kontribusi apa pun yang Anda buat sangat dihargai . Lihat Kontribusi.MD untuk detail lebih lanjut tentang cara berkontribusi.
Jika Anda memiliki saran yang akan membuat ini lebih baik, silakan garukan repo dan buat permintaan tarik. Anda juga bisa membuka masalah dengan tag "peningkatan". Jangan lupa memberi proyek bintang!
git checkout -b feature/AmazingFeature )git commit -m 'Add some AmazingFeature' )git push origin feature/AmazingFeature )(kembali ke atas)
Didistribusikan di bawah lisensi MIT. Lihat LICENSE.txt untuk informasi lebih lanjut.
(kembali ke atas)
Valentin Erokhin
Tautan Proyek: https://github.com/saviorand/mojo-web
(kembali ke atas)
Kami banyak menggambar pada proyek -proyek berikut:
(kembali ke atas)
Ingin nama Anda muncul di sini? Lihat Contributing.md!
Dibuat dengan contrib.rocks.