
? 날개가있는 모조 HTTP 프레임 워크
Lightbug는 Mojo를위한 간단하고 달콤한 HTTP 프레임 워크로 Golang Fasthttp 및 Rust May_Minihttp와 같은 시스템 프로그래밍의 모범 사례를 구축합니다.
이것은 아직 생산 준비가되어 있지 않습니다. 우리는 모조의 새로운 발전을 목표로하고 있지만 실제 응용 프로그램에서 사용하기에 안전한 시점에 도달하는 데 시간이 걸릴 수 있습니다.
Lightbug는 현재 다음과 같은 기능을 가지고 있습니다.
def 기능이 사용되지 않으면 서 모든 것이 완전히 타이핑됩니다(뒤로 맨 위로)
lightbug_http 의 유일한 단단한 의존성은 Mojo입니다. 모듈 식 웹 사이트에서 Mojo와 함께 일어나고 실행하는 방법을 알아보십시오. 모조 프로젝트가 현지에서 설치되면
mojoproject.toml 에 mojo-community 채널을 추가하십시오.
[ project ]
channels = [ " conda-forge " , " https://conda.modular.com/max " , " https://repo.prefix.dev/mojo-community " ] lightbug_http 종속성으로 추가하십시오.
[ dependencies ]
lightbug_http = " >=0.1.5 " mojoproject.toml 이있는 프로젝트의 루트에서 magic install 실행하십시오.
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 라는 향후 라이브러리에서 고급 라우팅 기능을 추가 할 계획입니다. 자세한 내용은 로드맵을 참조하십시오.
(뒤로 맨 위로)
기본 환영 화면은 Lightbug를 사용하여 이미지 또는 HTML과 같은 파일을 제공하는 방법의 예를 보여줍니다. Mojo는 파일을 읽고 경로에서 제공하는 데 사용할 수있는 open , read 및 읽기 및 read_bytes 방법이 있습니다. Lightbug Repo의 HTML 파일과 이미지를 Repo의 루트의 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)순수한 모조 기반 클라이언트는 기본적으로 사용할 수 있습니다. 이 클라이언트는 서버 테스트에 내부적으로 사용됩니다.
기본적으로 Lightbug는 네트워킹에 순수한 모조 구현을 사용합니다. 대신 Python의 socket 라이브러리를 사용하려면 다음 줄이있는 Server 대신 PythonServer 가져 오십시오.
from lightbug_http.python.server import PythonServer 그런 다음 기본 서버와 동일한 방식으로 모든 일반 서버 명령을 사용할 수 있습니다. 참고 : 2024 년 9 월 현재 PythonServer 와 PythonClient 시작할 때 컴파일 오류를 던집니다. 이 문제를 해결하기위한 공개 문제가 있습니다 - 기부금을 환영합니다!

우리는 다음을위한 지원을 위해 노력하고 있습니다 (기고자 환영합니다!) :
이 계획은 Starlette와 같은 Python 프레임 워크와 유사한 기능 세트에 도달하는 것입니다.
우리의 비전은 lightbug_http (이 repo)를 시작점으로 3 개의 라이브러리를 개발하는 것입니다.
lightbug_http HTTP 인프라 및 기본 API 개발lightbug_api (2024 년 후반에 출시) OpenAPI 사양 및 도메인 구동 설계를 지원하여 훌륭한 API를 빠르게 만들기위한 도구lightbug_web (출시일 TBD) Mojo 용 Full -Stack 웹 프레임 워크, Nextjs 또는 Sveltekit과 유사합니다.아이디어는 간단한 최신 웹 애플리케이션의 전체 코드베이스를 Mojo로 작성할 수있는 시점에 도달하는 것입니다.
그러나 우리는 약속을하지 않습니다. 이것은 단지 비전 일 뿐이며, 우리가 그곳에 도착하는지 여부는 커뮤니티의 지원을 포함하여 많은 요소에 달려 있습니다.
공개 문제를보고 직접 제출하여 Lightbug 개발을 유도하십시오.
(뒤로 맨 위로)
공헌은 오픈 소스 커뮤니티를 배우고, 영감을주고, 창조 할 수있는 놀라운 장소입니다. 당신이하는 모든 기여는 대단히 감사합니다 . 기여 방법에 대한 자세한 내용은 Contributing.md를 참조하십시오.
이를 더 좋게 만드는 제안이 있다면, repo를 포크하고 풀 요청을 만듭니다. "Enhancement"태그에 문제를 열면 간단히 문제를 열 수도 있습니다. 프로젝트에 별을주는 것을 잊지 마십시오!
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
(뒤로 맨 위로)
우리는 다음 프로젝트에 대해 많은 것을 그리고있었습니다.
(뒤로 맨 위로)
당신의 이름이 여기에 나타나길 원하십니까? Contributing.md를 참조하십시오!
Contrib.rocks로 만들어졌습니다.