
? Http -структура моджо с крыльями
Lightbug - это простая и сладкая HTTP -структура для Mojo, которая основана на наилучшей практике программирования систем, такую как Golang Fastttp и Rust May_minihttp.
Это еще не готово производства. Мы стремимся идти в ногу с новыми разработками в Mojo, но может потребоваться некоторое время, чтобы добраться до того момента, когда это безопасно использовать в реальных приложениях.
Lightbug в настоящее время имеет следующие функции:
def(Вернуться к вершине)
Единственная жесткая зависимость для lightbug_http - это mojo. Узнайте, как вставать и работать с Mojo на модульном веб -сайте. Как только у вас будет проект Mojo, созданный локально,
Добавьте канал mojo-community в свой mojoproject.toml , например:
[ project ]
channels = [ " conda-forge " , " https://conda.modular.com/max " , " https://repo.prefix.dev/mojo-community " ] Добавьте lightbug_http в качестве зависимости:
[ dependencies ]
lightbug_http = " >=0.1.5 " Запустите magic install в корне вашего проекта, где находится mojoproject.toml
Lightbug теперь должен быть установлен как зависимость. Вы можете импортировать весь импорт по умолчанию одновременно, например:
from lightbug_http import *или импортировать отдельные структуры и функции, например
from lightbug_http.service import HTTPService
from lightbug_http.http import HTTPRequest, HTTPResponse, OK , NotFoundЕсть несколько обработчиков по умолчанию, с которыми вы можете играть:
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 Добавьте свой обработчик в lightbug. Пропустив структуру, которая удовлетворяет следующей черте:
trait HTTPService :
fn func ( inout self , req : HTTPRequest) raises -> HTTPResponse:
... Например, чтобы сделать услугу Printer , которая печатает некоторые подробности о запросе на консоли:
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)Начните сервер, слушающий на порту с вашей службой так.
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) Не стесняйтесь менять настройки в listen_and_serve() , чтобы служить на конкретном хосте и порте.
Теперь отправьте запрос 0.0.0.0:8080 . Вы должны увидеть некоторые подробности о запросе, распечатанном на консоли.
Поздравляю ? Вы используете Lightbug!
Маршрутизация не является в рамках этой библиотеки, но вы можете легко настроить маршруты самостоятельно:
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) Мы планируем добавить более продвинутую функциональность маршрутизации в будущей библиотеке под названием lightbug_api , см. Дорога для получения более подробной информации.
(Вернуться к вершине)
Экран приветствия по умолчанию показывает пример того, как обслуживать такие файлы, как изображения или HTML с использованием LightBug. Mojo имеет встроенные методы open , read и read_bytes , которые вы можете использовать для чтения файлов и обслуживания их по маршруту. Предполагая, что вы копируете HTML -файл и изображение из репо Lightbug в static каталог в корне вашего репо:
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) Создайте файл, например, client.mojo со следующим кодом. Запустите magic run mojo client.mojo , чтобы выполнить запрос на заданный URL.
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)Pure Mojo Client доступен по умолчанию. Этот клиент также используется внутренне для тестирования сервера.
По умолчанию Lightbug использует реализацию Pure Mojo для сети. Чтобы использовать библиотеку socket Python, просто импортируйте PythonServer вместо Server со следующей строкой:
from lightbug_http.python.server import PythonServer Затем вы можете использовать все обычные команды сервера так же, как и с сервером по умолчанию. Примечание. По состоянию на сентябрь 2024 года PythonServer и PythonClient бросают ошибку компиляции при запуске. Есть открытая проблема, чтобы исправить это - взносы приветствуются!

Мы работаем над поддержкой следующего (приветствуются участники!):
План состоит в том, чтобы добраться до набора функций, похожих на рамки Python, такие как Starlette, но с лучшей производительностью.
Наше видение состоит в том, чтобы разработать три библиотеки, с lightbug_http (This Repo) в качестве отправной точки:
lightbug_http - HTTP Инфраструктура и базовая разработка APIlightbug_api - (Позже в 2024 году!)lightbug_web - (Дата выпуска TBD) Полная платформа для моджо.Идея состоит в том, чтобы добраться до точки, когда вся кодовая база простого современного веб -приложения может быть написана в Mojo.
Однако мы не даем никаких обещаний - это просто видение, и независимо от того, добираемся ли мы туда или нет, зависит от многих факторов, включая поддержку сообщества.
Посмотрите на открытые проблемы и отправьте свои собственные, чтобы помочь развивать Lightbug.
(Вернуться к вершине)
Вклад - это то, что делает сообщество с открытым исходным кодом таким удивительным местом для изучения, вдохновения и создания. Любой вклад, которые вы вносите, высоко ценится . См. Appling.md для получения более подробной информации о том, как внести свой вклад.
Если у вас есть предложение, которое сделает это лучше, пожалуйста, разделите репо и создайте запрос на тягу. Вы также можете просто открыть проблему с тегом «Улучшение». Не забудьте дать проекту звезду!
git checkout -b feature/AmazingFeature )git commit -m 'Add some AmazingFeature' )git push origin feature/AmazingFeature )(Вернуться к вершине)
Распределено по лицензии MIT. См. LICENSE.txt для получения дополнительной информации.
(Вернуться к вершине)
Валентин Эрокхин
Ссылка на проект: https://github.com/saviorand/mojo-web
(Вернуться к вершине)
Мы много рисовали на следующих проектах:
(Вернуться к вершине)
Хотите, чтобы ваше имя появилось здесь? Смотрите appling.md!
Сделано из ouctrib.rocks.