
?翼のあるMojo HTTPフレームワーク
Lightbugは、Golang FastttpやRust May_minihttpなどのシステムプログラミングからベストプラクティスに基づいているMojo向けのシンプルで甘いHTTPフレームワークです。
これはまだ生産準備ができていません。モジョの新しい開発に遅れずについていくことを目指していますが、実際のアプリケーションで安全に使用できるポイントに到達するには時間がかかるかもしれません。
LightBugには現在、次の機能があります。
def関数は使用されていません(トップに戻る)
lightbug_httpの唯一のハード依存関係はMojoです。モジュラーWebサイトで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 " mojoproject.tomlが配置されているプロジェクトのrootで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送信します。コンソールに印刷されたリクエストに関するいくつかの詳細が表示されます。
おめでとう?ライトバグを使用しています!
ルーティングはこのライブラリのスコープではありませんが、自分でルートを簡単にセットアップできます。
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ファイルと画像をリポジトリのルートにある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ベースのクライアントはデフォルトで利用できます。このクライアントは、サーバーのテストにも内部で使用されます。
デフォルトでは、LightBugはNetworkingにPure Mojo実装を使用します。代わりにPythonのsocketライブラリを使用するには、次の行でServerの代わりにPythonServerをインポートするだけです。
from lightbug_http.python.server import PythonServerその後、デフォルトのサーバーと同じ方法で、すべての通常のサーバーコマンドを使用できます。注:2024年9月現在、 PythonServerとPythonClient 、開始時にコンピレーションエラーを投げます。これを修正するための未解決の問題があります - 貢献を歓迎します!

私たちは以下のサポートに取り組んでいます(貢献者を歓迎します!):
計画は、StarletteのようなPythonフレームワークに似た機能セットに到達することですが、パフォーマンスが向上します。
私たちのビジョンは、3つのライブラリを開発することですlightbug_http (このレポ)を出発点として:
lightbug_http -HTTPインフラストラクチャと基本的なAPI開発lightbug_api (2024年後半に来ます!)Openapi SpecとDomain駆動型のデザインをサポートして、素晴らしいAPIを速くするためのツールlightbug_web (リリース日TBD)MojoのフルスタックWebフレームワーク、nextjsまたはsveltekitに似ていますアイデアは、単純な最新のWebアプリケーションのコードベース全体をMojoで書くことができるポイントに到達することです。
しかし、私たちは約束をしません - これは単なるビジョンであり、私たちがそこにたどり着くかどうかは、コミュニティのサポートを含む多くの要因に依存します。
オープンな問題を見て、LightBugの開発を促進するために独自の問題を提出してください。
(トップに戻る)
貢献は、オープンソースコミュニティを学び、インスピレーションを与え、創造するのに驚くべき場所にするものです。あなたがする貢献はどんな貢献も大歓迎です。貢献方法の詳細については、Contributing.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
(トップに戻る)
私たちは次のプロジェクトについて多くを描いていました:
(トップに戻る)
あなたの名前をここに表示したいですか? Convributing.mdを参照してください!
contrib.rocksで作られています。