css文件修改后没变化 static_Go Web编程使用Go语言创建静态文件服务器

上篇关于Go模板库应用实践的文章最后我们留下一个问题,页面模板是通过 CDN引用的 BootStrapcssjs文件。到目前位置我们的服务器还无法伺服客户端的静态文件请求把服务器磁盘上的文件响应给客户端。使用和配置过 Nginx服务器的一定知道 Nginx天然支持静态资源的访问,那么我们是不是也要借助 Nginx才能实现处理静态文件请求呢?其实不是,在最开始的文章我们说过“Go语言不需要依赖任何第三方组件就能构建并启动一个高并发的 HTTP 服务器。”,这篇文章就让我们了解一下如何用 Go语言的 net/http库实现处理静态资源请求的问题。

我们先用一个简单的例子学习一下使用 net/http如何创建一个静态资源服务器,然后再应用到我们的 http_demo项目中。

Go Web 编程系列的每篇文章的源代码都打了对应版本的软件包,供大家参考。公众号中回复 gohttp08获取本文源代码

创建静态资源服务器

我们新建一个 main.go存放创建静态资源服务器和监听请求的代码,同时在相同目录下创建 assets/cssassets/js目录用于存放上篇文章页面模板使用到的静态文件。

main.go

assets/

└── css

└── bootstrap.min.css

└── js

└── bootstrap.min.js

main.go中的代码如下:

package main

import "net/http"

func main() {

fs := http.FileServer(http.Dir("assets/"))

http.Handle("/static/", http.StripPrefix("/static/", fs))

http.ListenAndServe(":8080", nil)

}

  • 首先我们使用 http.FileServer创建一个使用给定文件系统的内容响应所有 HTTP请求的处理程序。

  • http.Handle("/static/",http.StripPrefix("/static/",fs))让文件服务器使用 assets目录下的文件响应 URL路径以 /static/开头的所有 HTTP请求。

  • assets被设置为文件服务器的文件系统根目录,文件服务器会处理以 /static开头的 URL的请求,所以我们需要使用 http.StripPrefix()把 static前缀去掉才能在 assets目录中搜索到请求的文件。

运行程序,然后用 cURL请求一下 css文件,看看有没有奏效。

$ go run main.go

$ curl -s http://localhost:8080/static/css/styles.css

/*!

* Bootstrap v3.3.7 (http://getbootstrap.com)

* Copyright 2011-2016 Twitter, Inc.

......

结合 gorillia/mux使用文件服务器

上面的例子中文件服务器的处理程序是注册到 net/http库提供的标准的 ServeMux(服务复用器)中的,我们 http_demo项目为了支持复杂的路由注册使用的是 gorillia/mux库提供的服务复用器。两者的工作方式不太一样,所以把文件服务器应用到我们项目里还需要做些调整才能起作用。

首先我们先把 assets目录整个拷贝到项目的根目录。

func RegisterRoutes(r *mux.Router) {

// serve static file request

fs := http.FileServer(http.Dir("assets/"))

serveFileHandler := http.StripPrefix("/static/", fs)

r.PathPrefix("/static/").Handler(serveFileHandler)

......

}

  • 使用 router.PathPrefix("/static")创建一个匹配有 /static前缀请求的路由。

  • 然后使用 route.Handler方法将文件服务器注册成路由对应的处理程序( Handler是 *mux.Route上的方法)。

注册好文件服务器后,我们把之前页面模板引用的 CDN上的 jscss文件换成自己服务器上的文件链接。

lang="en">

......

href="/static/css/bootstrap.min.css" rel="stylesheet">

{{ template "nav" .}}

class="container">

{{template "content" .}}

然后重启服务器,访问之前的页面 http:localhost:/view/index,验证一下我们的服务器现在是否能伺服静态文件的请求了。

308ebc5b3e85b56b420226c7ad26f0ee.png

页面样式正常,现在只要在服务器这个 assets目录下的文件,我们都可以通过 http://localhost:8000/static/*路径的 URL访问到。

今天的文章对应的源码已经打包上传,公众号回复 gohttp08获取下载链接,赶快下载下来动手练习一下吧。如果文章能帮助到你,不要忘记转发、点在看分享给更多人啊。关注公众号每周第一时间获取文章更新。

另外今天的题图是不是很有趣,两个小地鼠和背景都来自一部非常经典的电影。你能说出他们三个的名字吗?快来留言吧,让我看看你们都能给出什么答案c2db784d2f909f7174dd70e07bb0076e.png001a2f0073751939beea49c53776bd84.png

推荐阅读

  • Go Web 编程--超详细的模板库应用指南


喜欢本文的朋友,欢迎关注“Go语言中文网”:

42158a858e46737bd4494dc0aeaa7d4d.png

Go语言中文网启用微信学习交流群,欢迎加微信:274768166,投稿亦欢迎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【linux】学习2

鸟哥那本书的第6章 文件权限: ^ ^ ^ ^ ^ ^ ^ 1 2 3 4 5 6 7 文件有 文件所有者、文件所属用户组 的概念如上图. 1. 十个字母表示文件…

IE 8 开发人员工具详解 【转载】

我的体会,IE 8 较之前面的的版本还是有不少改进的。使用体验上好很多,速度也不错。IE 要继续加油, 对于网页开发人员,IE8也提供了一个所谓的开发人员工具,通过F12可以调用出来 关于这套工具的使用细节,我就…

scrollwidth ,clientwidth ,offsetwidth 三者的区别

clientwidth:内容可视区域的宽度 offsetwidth:元素整体宽度 scrollwidth:实际内容的宽度 转载于:https://www.cnblogs.com/cuijin-book/p/10760656.html

python运算符与表达式

2019独角兽企业重金招聘Python工程师标准>>> 运算符用于连接两个相同类型的序列,s*n用于创建一个序列的n个副本。但是这些都是仅仅复制元素引用的浅复制。 例: a[3,4,5] b[a] c2*b 则c[[3,4,5],[3,4,5]] a[0]-7; 则c[[-7,4,5],[-7,4,5]]. 也…

3d翻转 ios_iOS自定义转场详解04——实现3D翻转效果

这是自定义转场系列的第四篇。由于具有一定的连续性,我会忽略一些基础,所以如果你是第一次看这个系列,可以先过目之前的几篇 ——— UIViewControllerTransitioning的用法 、实现Keynote中的神奇移动效果、实现通过圆圈放大缩小的转场动画。老…

[转]算术编码+统计模型=数据压缩 - 第二部分:统计模型

转自:http://deercrane.spaces.live.com/blog/cns!8BEF692B75EB8095!189.entry 算术编码 统计模型 数据压缩 - 第二部分:统计模型 (撼庭秋译自http://compression.graphicon.ru/download/articles/ppm/nelson/arithmetic2.htm) …

链式栈的实现(头文件及源程序)

链式栈的实现(头文件及源程序) Linkedstack.h #ifndef __LINKEDSTACK_H__ #define __LINKEDSTACK_H__//元素类型定义 typedef int ElemType_stack;//结点结构体类型定义 typedef struct Node_stack {ElemType_stack data;struct Node_stack *next;stru…

phper必知必会之类库自动加载的七种方式(三)

## php自动加载 下面显示例子的文件目录结构图 一、没有使用命名空间的几种实现 test/oneClass.php class oneClass{public function show(){echo "这里是oneClass.php的show方法<br/>";}} test/twoClass.php <?phpclass twoClass{public function show(){…

怎样的项目才算是一个成功的项目 于病视神,未有形而除之

http://www.nowamagic.net/librarys/veda/detail/2466参与各种项目已经好几年了&#xff0c;大大小小的项目也做过了很多。经历了很多&#xff0c;也明白了很多。现在反思下&#xff0c;什么样的项目才是成功的项目&#xff1f; 是把项目按照必要的约束&#xff08;时间&#x…

sqlserver55555_sqlserver把小数点后面多余的0去掉

Sql中想把小数点后多余的0去掉,怎么办?select 5000/10000.0 --想变成0.5select 5500/10000.0 --想变成0.55select 5550/10000.0 --想变成0.555select 5555/10000.0 --想变成0.5555其结果分别为&#xff1a;0.5000000 0.5500000 0.5550000 0.5555000一、如果想去掉数字5后…

一个产品留言统计查寻的分析比较

有产品表Product(ProductId,Name,Username,AddTime...) 留言表 Agency(AgencyId, ProductId, TargetUsername,IsRead...)其中Agency.TargetUsername与Product.Username指这个产品的发布用户(以及这条留言的目标用户--不是指发留言的人), 现在要打印某一指定用户的如下列表…

链式队列的实现(头文件及源程序)

链式队列的实现&#xff08;头文件及源程序&#xff09; Linkedqueue.h #ifndef __LINKEDQUEUE_H__ #define __LINKEDQUEUE_H__//元素类型定义 typedef int ElemType_Queue;//结点结构体类型定义 typedef struct Node_Queue {ElemType_Queue data;struct Node_Queue *next;}N…

单点登录的实现

单点登录的实现 token验证&#xff1a;https://blog.csdn.net/sleepwalker_1992/article/details/82974703转载于:https://www.cnblogs.com/yishenweilv/p/10764653.html

c++ 箭头符号怎么打_焊接图纸符号标注图解示例,焊接符号标注实例及方法

基本坡口符号坡口符号(注&#xff1a;图中“破”应为“坡”)焊接图纸符号标注图解示例焊接符号标注实例及方法在焊接结构图样上&#xff0c;焊接方法可按国家标准GB5185-85的规定用阿拉伯效字表示&#xff0c;标注在指引线的尾部。常用焊接方法代号见表3-9所示。如果是组合焊接…

Tekson的数据结构程序9——搜索

9. 搜索 搜索方法有&#xff1a;顺序搜索法&#xff08;即链表搜索法&#xff09;、二分搜索法、二叉树搜索法、哈希表搜索法、TRIE树搜索法。 其中&#xff0c;链表搜索法的搜索速度为&#xff1b;二分搜索法与二叉树搜索法的搜索速度为&#xff1b;哈希表的搜索速度为&#x…

演示: GTS流量×××和CAR流量监管的效果及相关实践计划

演示&#xff1a; GTS流量和CAR流量监管的效果及相关实践计划演示目标&#xff1a;1 理解clock rate(时钟频率)和bandwidth&#xff08;带宽&#xff09;与接入速率的关系2 在模拟运营商的接入路由器ISP上配置CAR监管用户流量到认购速率64K3 取证模拟的企业网络以128K的接入速率…

给所有的交叉编译工具创建软链接

给所有的交叉编译工具创建软链接 #!/bin/bash #给所有的交叉编译工具创建软链接echo "正在给所有的交叉编译工具创建软链接..." filenamsls arm-linux-gnueabi-* #获取当前文件夹下的所有以arm-linux-gnueabi-文件名开头的文件名 cont0 #记录软链接完成个数…

写在前面

硕士毕业在即&#xff0c;我的纯CV之路即将开始&#xff0c;老师提到了潜在的研究方向&#xff0c;一个全新的领域&#xff0c;可以说是新的起点。未来四年&#xff0c;我要想不碌碌而为&#xff0c;不像硕士期间一样“泛泛而学”&#xff0c;我必须从理论到实践都做好非常扎实…

httpclient封装获取响应实体_Httpclient 接口自动化

好久木写啦&#xff01;&#xff01;&#xff01;好久木写啦&#xff01;&#xff01;&#xff01;心血来潮分享点小白的东西&#xff01;&#xff01;&#xff01;废话少说直接干货&#xff01;&#xff01;&#xff01;本文核心是将如何从数据驱动开始&#xff0c;以报告结尾…