css不会修改clojure / heroku web-app中的html

时间:2014-02-13 04:10:23

标签: heroku clojure compojure ring html-rendering

我正在制作一个简单的Clojure网络应用程序,部署在Heroku上,由一个html和一个css文件组成。我使用" lein new heroku MYAPP"创建了该文件。命令,我试图从一个简单的" hello world"让它在启动时在另一个文件夹中呈现一个html文件。我已经设法在我的浏览器中将html加载到本地主机上,但是当我这样做时它没有被css修改。我需要更改什么才能让css修改html以使其在浏览器中正确呈现,然后部署到heroku?

HTML:

<!DOCTYPE html>
<html>
    <head>
        <link rel="stylesheet" href="style.css" />
    </head>

    <body>
        <img id="sun" src="http://goo.gl/dEEssP">
        <div id='earth-orbit'>
            <img id="earth" src="http://goo.gl/o3YWu9">
        </div>
    </body>
</html>

project.clj

(defproject solar_system "1.0.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://solar_system.herokuapp.com"
  :license {:name "FIXME: choose"
            :url "http://example.com/FIXME"}
  :dependencies [[org.clojure/clojure "1.5.1"]
                 [compojure "1.1.1"]
                 [ring/ring-jetty-adapter "1.1.0"]
                 [ring/ring-devel "1.1.0"]
                 [ring-basic-authentication "1.0.1"]
                 [environ "0.2.1"]
                 [com.cemerick/drawbridge "0.0.6"]]
  :uberjar-name "solar_system-standalone.jar"
  :min-lein-version "2.0.0"
  :plugins [[environ/environ.lein "0.2.1"]]
  :hooks [environ.leiningen.hooks]
  :profiles {:production {:env {:production true}}})

web.clj:

(ns solar_system.web
  (:require [compojure.core :refer [defroutes GET PUT POST DELETE ANY]]
            [compojure.handler :refer [site]]
            [compojure.route :as route]
            [clojure.java.io :as io]
            [ring.middleware.stacktrace :as trace]
            [ring.middleware.session :as session]
            [ring.middleware.session.cookie :as cookie]
            [ring.adapter.jetty :as jetty]
            [ring.middleware.basic-authentication :as basic]
            [cemerick.drawbridge :as drawbridge]
            [environ.core :refer [env]]))

(defn- authenticated? [user pass]
  ;; TODO: heroku config:add REPL_USER=[...] REPL_PASSWORD=[...]
  (= [user pass] [(env :repl-user false) (env :repl-password false)]))

(def ^:private drawbridge
  (-> (drawbridge/ring-handler)
      (session/wrap-session)
      (basic/wrap-basic-authentication authenticated?)))

(defroutes app
  (ANY "/repl" {:as req}
       (drawbridge req))
  (GET "/" []
       {:status 200
        :headers {"Content-Type" "text/html"}
        :body (slurp (io/resource "index.html"))})  
  (ANY "*" []
       (route/not-found (slurp (io/resource "404.html")))))

(defn wrap-error-page [handler]
  (fn [req]
    (try (handler req)
         (catch Exception e
           {:status 500
            :headers {"Content-Type" "text/html"}
            :body (slurp (io/resource "500.html"))}))))

(defn -main [& [port]]
  (let [port (Integer. (or port (env :port) 5000))
        ;; TODO: heroku config:add SESSION_SECRET=$RANDOM_16_CHARS
        store (cookie/cookie-store {:key (env :session-secret)})]
    (jetty/run-jetty (-> #'app
                         ((if (env :production)
                            wrap-error-page
                            trace/wrap-stacktrace))
                         (site {:session {:store store}}))
                     {:port port :join? false})))

;; For interactive development:
;; (.stop server)
;; (def server (-main))

这是目录树。 html和css文件在资源中(带有error.html文件),web.clj在src / solar_system中,project.clj在根文件夹中:

solar_system
├── resources
├── src
│   └── solar_system
├── target
│   ├── classes
│   └── stale
└── test
    └── solar_system

3 个答案:

答案 0 :(得分:1)

我不知道为什么lein new heroku _模板不会为您执行此操作。

使用compojure.route/resources告诉处理程序在哪里查找静态文件。

(defroutes app
  (ANY "/repl" ...)
  (GET "/" [] ...)  
  (route/resources "/")
  (ANY "*" [] ...))

现在,如果您访问http://example.com/style.css,则会看到resources/public/style.css

除此之外:从resources/public/而不是resources/提供静态资产更好,因为您可能希望resources/secrets.txt没有任何人能够访问它。

答案 1 :(得分:0)

你有一个css文件,但没有服务它的路线!你的浏览器正在寻找一个CSS文件,但服务器说“404,伙计,从来没有听说过那个文件。”您可以添加另一个路径,例如index.html,也可以使用compojure的resourcesfiles路径来提供目录中的所有文件。

答案 2 :(得分:0)

正如其他人所说,你错过了{c}文件的route

(defroutes app
  (ANY "/repl" {:as req}
       (drawbridge req))
  (GET "/" []
       {:status 200
        :headers {"Content-Type" "text/html"}
        :body (slurp (io/resource "index.html"))})  
  (route/resources "/") ; special route for serving static files like css
                        ; default root directory is resources/public/
  (ANY "*" []
       (route/not-found (slurp (io/resource "404.html")))))

http://my-website.com/style.css应显示您的css文件。如果没有,您的路线有问题或者您的档案不存在。它期望resources/public/style.css。确保您正在重新启动应用程序并在浏览器中进行无缓存刷新(在大多数情况下为shift F5),以确保没有任何奇怪的结果给您带来奇怪的结果。