Compojureで静的ファイルを配信


前回、DB接続、テンプレート利用まで書いたんですが、静的ファイルを配信する仕組みがまだなかったので、調べてみると下記が簡単でした。

Clojureの入門がてら、Herokuに自分のプロフィールサイトを作ってみる そのいち – 蟲!虫!蟲! – #!/usr/bin/bugrammer

静的ファイルの配置場所

project.cljに「web-content」という項目を追加し、静的コンテンツのディレクトリがどこかを指定します。今回の場合は、プロジェクトディレクトリ直下のpublicディレクトリに配置するものとします。

(defproject compojureexample "1.0.0-SNAPSHOT"
  :description "Compojure Example"
  :dependencies [[org.clojure/clojure "1.2.0"]
                 [org.clojure/clojure-contrib "1.2.0"]
                 [compojure "0.6.5"]
                 [ring/ring-jetty-adapter "0.3.9"]]
;; 静的コンテンツの配置ディレクトリ
  :web-content "public")

ルーティング

次に、静的ファイルを配信するためにルーティングの設定を行います。
今回は、public直下に配置したファイルを、URLとしては、static以下がpublic直下を参照する感じで、「https://localhost:8080/static/***」のようにアクセスさせたいと思います。

src/compojureexample/core.clj

(ns compojureexample.core
  (:use compojure.core
        compojure.response
        ring.adapter.jetty)
  (:require [compojure.route :as route]))
 
;; =============================================
;; Routes
;; =============================================
(defroutes app
  (GET "/" _ "Hello World")
;; https://localhost:8080/***としてアクセスさせたい場合は、「/」だけでよい。
  (route/files "/static/"))
 
;; =============================================
;; Run Server
;; =============================================
(defn -main []
  (let [port (Integer/parseInt (get (System/getenv) "PORT" "8080"))]
    (run-jetty app {:port port})))

以上となります。

関連記事