ningle - README 訳
ningle(2018年8月14日時点)のREADMEの和訳です。READMEの更新に合わせて、こちらの和訳も更新します。
ningle
ningleは、Common Lisp製の軽量Webアプリケーションフレームワークです。
使い方
(defvar *app* (make-instance 'ningle:<app>)) (setf (ningle:route *app* "/") "Welcome to ningle!") (setf (ningle:route *app* "/login" :method :POST) #'(lambda (params) (if (authorize (cdr (assoc "username" params :test #'string=)) (cdr (assoc "password" params :test #'string=))) "Authorized!" "Failed...Try again."))) (clack:clackup *app*)
ここまで進めてブラウザで http://localhost:5000/ にアクセスすると、ningleが"Welcome to ningle!"と表示してくれます。
インストール
(ql:quickload :ningle)
ningleについて
ningleは、Cavemanのフォークプロジェクトです。Cavemanではプロジェクトの雛形を生成しますが、ningleでは生成しません。
ningleは軽量のフレームワークなので、Clackについて少し知識が必要です。Clackは、ningleの元になっているサーバ・インターフェイスです。
はじめに
ルーティング
ningleはSinatraのようなルーティングシステムをもっています。
;; GET request (デフォルト) (setf (ningle:route *app* "/" :method :GET) ...) ;; POST request (setf (ningle:route *app* "/" :method :POST) ...) ;; PUT request (setf (ningle:route *app* "/" :method :PUT) ...) ;; DELETE request (setf (ningle:route *app* "/" :method :DELETE) ...) ;; OPTIONS request (setf (ningle:route *app* "/" :method :OPTIONS) ...)
ルーティングのパターンには、引数に値を設定するために、キーワードを含むことができます。
(setf (ningle:route *app* "/hello/:name") #'(lambda (params) (format nil "Hello, ~A" (cdr (assoc :name params)))))
上のコントローラでは、"/hello/Eitaro"や"/hello/Tomohiro"にアクセスしたときに呼び出されます。(cdr (assoc :name params))`は、"Eitaro"と"Tomohiro"になります。
ワイルドカードを含めることも可能です。(assoc :splat params)
でアクセスできます。
(setf (ningle:route *app* "/say/*/to/*") #'(lambda (params) ; matches /say/hello/to/world (cdr (assoc :splat params)) ;=> ("hello" "world") )) (setf (ningle:route *app* "/download/*.*") #'(lambda (params) ; matches /download/path/to/file.xml (cdr (assoc :splat params)) ;=> ("path/to/file" "xml") ))
正規表現を使うことも可能です:
(setf (ningle:route *app* "/hello/([\\w]+)" :regexp t) #'(lambda (params) (format nil "Hello, ~A!" (first (cdr (assoc :captures params))))))
必要条件
Routeは、様々な整合条件を含むことができます。例えば、Acceptの場合は次のようになります:
(setf (ningle:route *app* "/" :accept '("text/html" "text/xml")) #'(lambda (params) (declare (ignore params)) "<html><body>Hello, World!</body></html>")) (setf (ningle:route *app* "/" :accept "text/plain") #'(lambda (params) (declare (ignore params)) "Hello, World!"))
独自に条件を定義することも簡単にできます。
(setf (ningle:requirement *app* :probability) #'(lambda (value) (<= (random 100) value))) (setf (ningle:route *app* "/win_a_car" :probability 10) #'(lambda (params) (declare (ignore params)) "You won!")) (setf (ningle:route *app* "/win_a_car") #'(lambda (params) (declare (ignore params)) "Sorry, you lost."))
リクエストとレスポンス
ningleには特別な変数が2つあります。*request*
と*response*
です。これらは、毎回のリクエストの度に、Lack.RequestとLack.Responseに束縛されます。
例えば、これらを使うことで、それぞれのコントローラにおいて、レスポンスのステータスコードやContent-Type等を変更できます。
(setf (lack.response:response-headers *response*) (append (lack.response:response-headers *response*) (list :content-type "application/json"))) (setf (lack.response:response-headers *response*) (append (lack.response:response-headers *response*) (list :access-control-allow-origin "*"))) (setf (lack.response:response-status *response*) 201)
Context
ningleには、context
という便利な機能があります。context
は、内部のハッシュテーブルにアクセスするために使います。
(setf (context :database) (dbi:connect :mysql :database-name "test-db" :username "nobody" :password "nobody")) (context :database) ;;=> #<DBD.MYSQL:<DBD-MYSQL-CONNECTION> #x3020013D1C6D>
セッションを利用する
ningle自体にセッションの仕組みはありませんが、Lack.Builderと一緒にLack.Middleware.Sessionを使うことをおすすめします。
(import 'lack.builder:builder) (clack:clackup (builder :session *app*))
もちろん、ningleとあわせて、他のLackミドルウェアを使うこともできます。
参考
作者
- Eitaro Fukamachi (e.arrows@gmail.com)
著作権
Copyright (c) 2012-2014 Eitaro Fukamachi (e.arrows@gmail.com)
ライセンス
Licensed under the LLGPL License.