t-cool

ningle - README 訳


ningle(2018年8月14日時点)のREADMEの和訳です。READMEの更新に合わせて、こちらの和訳も更新します。


ningle

Build Status

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.RequestLack.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.