【玩转Golang】beego下实现martini中的透明式静态文件服务(static folder)效果。
出于效率等原因,最近将web框架由martini切换为了beego,其他地方都很平顺,只是两个框架的handler签名不一致,需要修改,所以耗时较长,这是预计到的。但是有一个地方没有预计到,也耗费了较多时间,那就是静态文件的服务。
用过martini的tx都知道,在mairtini中如果我们设置一个目录为静态文件目录,只需添加martini的Static插件,如设置web子目录为应用的静态文件路径:
m.Use(martini.Static("web"))
此时,如果我们访问一个url,此url并没有在martini中注册,但是如果位于web目录中,就可以得到响应,例如:
http://127.0.0.1:8088/
//返回web目录下的index.html
http://127.0.0.1:8088/ js/jquery.js
//返回web/js/jquery.js
但是,切换为beego之后,却没有找到这样的功能。发现beego对于静态文件的支持设计的有点不够友好,比如我进行如下设置
beego.SetStaticPath("/web", "web")
这时候访问结果如下
http://127.0.0.1:8088/
//返回404页面
http://127.0.0.1:8088/web
//返回404页面
http://127.0.0.1:8088/web/index.html
//返回403 (Forbidden)
http://127.0.0.1:8088/web/chat.html
//返回正常
http://127.0.0.1:8088/web/images/test.png
//返回正常
据此结果,有两点不满意:
- 必须添加该staticdir 映射的path访问,设置为“/” 无效
- 竟然不能返回默认页面!看文档需要设置”
beego.DirectoryIndex=true
“ ,不是我需要的!
因此,我着手自己实现该需求。通过学习beego文档,发现可以设置Filter。于是,编写如下代码:
//main中如下设置filter
beego.InsertFilter("/*", beego.BeforeRouter, TransparentStatic)
.
.
.
func TransparentStatic(ctx *context.Context) {
defInd :=
maxInd := len(defHomes) -
orpath := ctx.Request.URL.Path
beego.Debug(" in trasparentstatic filter orpath", orpath)
if strings.Index(orpath, "api/") >= || strings.Index(orpath, "web/") >= {
return
}
DefaultStartPage:
p := orpath
if strings.EqualFold(p, "/") {
p += defHomes[defInd]
defInd++
}
ps := strings.Split(p, "/")
ps = append([]string{"web"}, ps...)
rp := strings.Join(ps, "/")
fp := fw.MapPath(rp)
beego.Debug("test fp", fp)
if !fileutils.Exists(fp) {
if defInd > && defInd < maxInd {
goto DefaultStartPage
}
return
} else {
beego.Debug("found static ", fp)
http.ServeFile(ctx.ResponseWriter, ctx.Request, fp)
//cannot use Redirect! will lead loop
//http.Redirect(ctx.ResponseWriter, ctx.Request, rp, http.StatusFound)
return
}
// }
运行之后,发现访问服务地址,带不带末尾的"/",都不能返回默认页面,如果明确访问/index.html可以实现访问。后经探索发现,虽然beego说明中说"/*"可以适配所有url,但是实际上不能适配"/",因此需要在注册一个filter到”/":
beego.InsertFilter("/", beego.BeforeRouter, TransparentStatic) //must has this for default page
beego.InsertFilter("/*", beego.BeforeRouter, TransparentStatic)
至此,一切正常了。
【玩转Golang】beego下实现martini中的透明式静态文件服务(static folder)效果。的更多相关文章
- django模版中配置和使用静态文件方法
1 在项目根路径下创建静态文件目录static: test3 是我的项目名,根目录下面: booktest 是一个应用 static是我建立的静态文件目录(这个名字其实可以叫其他的),静态文件都放在这 ...
- [小技巧]ASP.NET Core中如何预压缩静态文件
原文地址:Pre-compressed static files with ASP.NET Core 作者:Gunnar Peipman 译者:Lamond Lu 译文:https://www.cnb ...
- 当Django中Debug=False,静态文件处理方式。
Django设置DEBUG为False时,'django.contrib.staticfiles'会关闭,即Django不会自动搜索静态文件,静态文件不能加载导致的问题有两个: 1.页面排版不正常,即 ...
- springboot项目中js、css静态文件路径访问
springboot静态文件访问的问题,相信大家也有遇到这个问题,如下图项目结构. 项目结构如上所示,静态页面引入js.css如下所示. 大家肯定都是这样写的,但是运行的话就是出不来效果,图片也不显示 ...
- Django -> debug模式下的静态文件服务(/media/)
正式公布django项目的时候,假设存在静态文件(通常会统一放在名称为media或static的文件夹下),则须要建立url到文件系统的映射,比如.使用nginx的时候我们须要进行这种配置. # Dj ...
- gin中提供静态文件服务
package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { // 静 ...
- 基于 Vue.js 之 iView UI 框架非工程化实践记要 使用 Newtonsoft.Json 操作 JSON 字符串 基于.net core实现项目自动编译、并生成nuget包 webpack + vue 在dev和production模式下的小小区别 这样入门asp.net core 之 静态文件 这样入门asp.net core,如何
基于 Vue.js 之 iView UI 框架非工程化实践记要 像我们平日里做惯了 Java 或者 .NET 这种后端程序员,对于前端的认识还常常停留在 jQuery 时代,包括其插件在需要时就引 ...
- ASP.NET Core 中文文档 第三章 原理(3)静态文件处理
原文:Working with Static Files 作者:Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay).孟帅洋(书缘) 静态文 ...
- NodeJS中的静态资源管理服务
欢迎大家指导与讨论 : ) 一.什么是静态资源 静态资源就是放在服务器中的特定的文件.比较常见的有.css,.png, .js的这一些后缀的文件.下图中的这个html页面便要获取到logo.png和a ...
随机推荐
- RelativeLayout.LayoutParams
通过id设置相对兄弟元素对齐. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...
- iOS开发:一个瀑布流的设计与实现(已实现缓存池功能,该功能使得瀑布流cell可以循环利用)
一个瀑布流的实现有三种方式: 继承自UIScrollView,仿写UITableView的dataSource和delegate,创造一个缓存池用来实现循环利用cell 写多个UITableview( ...
- iOS 使用Masonry介绍与使用实践:快速上手Autolayout
介绍 Masonry 源码:https://github.com/Masonry/Masonry Masonry是一个轻量级的布局框架 拥有自己的描述语法 采用更优雅的链式语法封装自动布局 简洁明了 ...
- andriod创建用户界面(1)
一.UI知识Activity 将UI放在一个Activity上面,可以在Activity的onCreate方法中添加UI. @Override public void onCreate(Bundle ...
- PHP数据库连接失败--could not find driver 解决办法
数据库连接失败could not find driver在调试一个PHP程序时,报了这个错误, could not find driver 经过一番查找,结合自己的思考和实践,终于找到了问题所在. 原 ...
- THEOS的第一个TWeak的成功创建
THEOS的第一个TWeak的成功创建html, body {overflow-x: initial !important;}.CodeMirror { height: auto; } .CodeMi ...
- 手写体识别中用到的Tensorflow函数复习
tf.truncated_normal(shape, stddev=0.1) 从截断的正态分布中输出随机值. 生成的值服从具有指定平均值和标准偏差的正态分布,如果生成的值大于平均值2个标准偏差的值则丢 ...
- Java编程的逻辑 (66) - 理解synchronized
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- SparkSQL---实战应用
SparkSQL---实战应用 数据集 :http://grouplens.org/datasets/movielens/ MovieLens 1M Datase 相关数据文件 : users.dat ...
- c#设计应用程序单实例运行
利用WindowsFormsApplicationBase的IsSingleInstance来控制应用程序只能单实例运行. [DllImport("user32.dll", Ent ...