Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rendering CSS in a Go Web Application

I wrote a very basic web application, following this tutorial. I want to add css rules in an external stylesheet, but it's not working - when the HTML templates are rendered, something goes wrong and the CSS is completely ignored. If I put the rules in tags, it works, but I don't want to have to deal with that.

In a Go web application, how do I render an external CSS stylesheet?

like image 257
Lincoln Bergeson Avatar asked Nov 09 '12 04:11

Lincoln Bergeson


People also ask

How do I integrate a CSS file into my website?

CSS can be added to HTML documents in 3 ways: Inline - by using the style attribute inside HTML elements. Internal - by using a <style> element in the <head> section. External - by using a <link> element to link to an external CSS file.

Can you make websites in Go?

The Go programming language was designed with simplicity in mind. This means that you don't need to use a web framework in order to create a Golang website or web applications in Go.


1 Answers

Add a handler to handle serving static files from a specified directory.

eg. create {server.go directory}/resources/ and use

http.Handle("/resources/", http.StripPrefix("/resources/", http.FileServer(http.Dir("resources"))))  

along with /resources/somethingsomething.css

The reason for using StripPrefix is that you can change the served directory as you please, but keep the reference in HTML the same.

eg. to serve from /home/www/

http.Handle("/resources/", http.StripPrefix("/resources/", http.FileServer(http.Dir("/home/www/")))) 

Note that this will leave the resources directory listing open. If you want to prevent that, there is a good snippet on the go snippet blog:

http://gosnip.posterous.com/disable-directory-listing-with-httpfileserver

Edit: Posterous is now gone, so I just pulled the code off of the golang mailing list and will post it here.

type justFilesFilesystem struct {     fs http.FileSystem }  func (fs justFilesFilesystem) Open(name string) (http.File, error) {     f, err := fs.fs.Open(name)     if err != nil {         return nil, err     }     return neuteredReaddirFile{f}, nil }  type neuteredReaddirFile struct {     http.File }  func (f neuteredReaddirFile) Readdir(count int) ([]os.FileInfo, error) {     return nil, nil } 

Original post discussing it: https://groups.google.com/forum/#!topic/golang-nuts/bStLPdIVM6w

And use it like this in place of the line above:

 fs := justFilesFilesystem{http.Dir("resources/")}  http.Handle("/resources/", http.StripPrefix("/resources/", http.FileServer(fs))) 
like image 158
minikomi Avatar answered Sep 19 '22 12:09

minikomi