ductとataraxyでふつうのWebサイトを作る

「ふつう」には全く深い意味はなくて、ただただHTMLをGETできてPOSTリクエストを受け付けられるふつうのWebサイトを作ろうとしてみた。 ふつうすぎて逆に情報がなかったのでまとめてみる。

バージョン情報

  • duct: 0.6.1

前提知識

やったこと

とりあえずプロジェクト生成する

lein new duct sample +site +example

DBは置いておく。作者が書いたAPIサーバーを作れるブログエントリがあるのでそれを見れば触れるようになると思う。ここで出てくるboundaryという概念もクールだなーと思ったけどそれはまたいつか。

とりあえずエディターからREPLにつなぐ

おもむろにEmacsを立ち上げてcider-jackinする。

動かしてみる

この時点で localhost:3000/example にアクセスするとサンプルページが出る。

formを書く

[hiccup "1.0.5"] を依存に追加して以下のようなコードを書いてみる

[::response/ok
 (html [:h1 "hello"]
       (form-to [:post "/example"]
                [:p (label {} "username" "username")
                 (text-field {:placeholder "username"} "username")]
                [:p (label {} "email" "email")
                 (email-field {:placeholder "foo@example.com"} "email")]
                [:p (label {} "password" "password")
                 (password-field {:placeholder "your password"} "password")]
                (anti-forgery-field)
                [:p (submit-button {} "submit")]))]

すると localhost:3000/example で

f:id:blackawa:20171201154449p:plain

みたいな画面が見える。

POSTする

ルーティングをいじる。

:duct.module/ataraxy
 {"/example"
  {[:get] [:example/new]
   [:post {user :params}] [:example/create user]}}

 :sample.handler.example/new {}
 :sample.handler.example/create {}

で、関数のnamespaceとかも書き換える。

(defmethod ig/init-key ::new [_ options]
  (fn [what-is-this]
    (println what-is-this)
    [::response/ok
     (html ;; 省略
      )]))

(defmethod ig/init-key ::create [_ options]
  (fn [{[_ user] :ataraxy/result}]
    (println user)
    [::response/ok "created"]))

この状態で localhost:3000/example にアクセスしてformを送信すると画面遷移するし、REPLにリクエスト情報が出てくる。 やったぜ。

リクエスト自体をもらいたくなったらどうする?

routing時点でのデスラクチャリングはataraxyの強みだけど、もしもっとガツッとほしくなったら? その時はhandlerの無名関数が受け取る引数を、バラさずにそのまま受け取れば中にリクエスト内容が全部入ってる。

anti-forgeryとかのミドルウェアどこで差し込まれてるの?

github.com

がconfig.ednに差し込まれてて、うまいことデフォルト値を定義してくれているよ。 定義内容が知りたければREPLで

(prep)
(pprint config)

したらわかる。

感想

しばらく前にClojure始めてよかったなーという気持ちしか沸かないくらい過去の資産をうまーく組み合わせて実現されてた。 これだけのエコシステムを数年かけて作ってきたring / ductのコミュニティとそれを牽引したweavejester本当にすごいな。