add to function & write docs
Showing
3 changed files
with
132 additions
and
10 deletions
| ... | @@ -221,6 +221,16 @@ func RouterHandler(path string, c http.Handler) *App { | ... | @@ -221,6 +221,16 @@ func RouterHandler(path string, c http.Handler) *App { |
| 221 | return BeeApp | 221 | return BeeApp |
| 222 | } | 222 | } |
| 223 | 223 | ||
| 224 | func SetViewsPath(path string) *App { | ||
| 225 | BeeApp.SetViewsPath(path) | ||
| 226 | return BeeApp | ||
| 227 | } | ||
| 228 | |||
| 229 | func SetStaticPath(url string, path string) *App { | ||
| 230 | StaticDir[url] = path | ||
| 231 | return BeeApp | ||
| 232 | } | ||
| 233 | |||
| 224 | func Filter(filter http.HandlerFunc) *App { | 234 | func Filter(filter http.HandlerFunc) *App { |
| 225 | BeeApp.Filter(filter) | 235 | BeeApp.Filter(filter) |
| 226 | return BeeApp | 236 | return BeeApp | ... | ... |
| ... | @@ -8,16 +8,17 @@ | ... | @@ -8,16 +8,17 @@ |
| 8 | - [开发模式](#-3) | 8 | - [开发模式](#-3) |
| 9 | - [路由设置](#-4) | 9 | - [路由设置](#-4) |
| 10 | - [静态文件](#-5) | 10 | - [静态文件](#-5) |
| 11 | - [模板处理](#-6) | 11 | - [过滤和中间件](#-6) |
| 12 | - [request处理](#-7) | 12 | - [模板处理](#-7) |
| 13 | - [跳转和错误](#-8) | 13 | - [request处理](#-8) |
| 14 | - [response处理](#-9) | 14 | - [跳转和错误](#-9) |
| 15 | - [Sessions](#-10) | 15 | - [response处理](#-10) |
| 16 | - [Cache设置](#-11) | 16 | - [Sessions](#-11) |
| 17 | - [安全的Map](#-12) | 17 | - [Cache设置](#-12) |
| 18 | - [日志处理](#-13) | 18 | - [安全的Map](#-13) |
| 19 | - [第三方应用集成](#-14) | 19 | - [日志处理](#-14) |
| 20 | - [部署编译应用](#-15) | 20 | - [第三方应用集成](#-15) |
| 21 | - [部署编译应用](#-16) | ||
| 21 | 22 | ||
| 22 | ## 最小应用 | 23 | ## 最小应用 |
| 23 | 一个最小最简单的应用如下代码所示: | 24 | 一个最小最简单的应用如下代码所示: |
| ... | @@ -88,9 +89,120 @@ | ... | @@ -88,9 +89,120 @@ |
| 88 | 89 | ||
| 89 | ## 开发模式 | 90 | ## 开发模式 |
| 90 | 91 | ||
| 92 | 通过bee创建的项目,beego默认情况下是开发模式。 | ||
| 93 | |||
| 94 | 我们可以通过如下的方式改变我们的模式: | ||
| 95 | |||
| 96 | beego.RunMode = "pro" | ||
| 97 | |||
| 98 | 或者我们在conf/app.conf下面设置如下: | ||
| 99 | |||
| 100 | runmode = pro | ||
| 101 | |||
| 102 | 以上两种效果一样。 | ||
| 103 | |||
| 104 | 开发模式中 | ||
| 105 | |||
| 106 | - 开发模式下,如果你的目录不存在views目录,那么会出现类似下面的错误提示: | ||
| 107 | |||
| 108 | 2013/04/13 19:36:17 [W] [stat views: no such file or directory] | ||
| 109 | |||
| 110 | - 模板会自动重新加载不缓存。 | ||
| 111 | - 如果服务端出错,那么就会在浏览器端显示如下类似的截图: | ||
| 112 | |||
| 113 |  | ||
| 114 | |||
| 91 | ## 路由设置 | 115 | ## 路由设置 |
| 92 | 116 | ||
| 117 | 路由的主要功能是实现从请求地址到实现方法,beego中封装了`Controller`,所以路由是从路径到`ControllerInterface`的过程,`ControllerInterface`的方法有如下: | ||
| 118 | |||
| 119 | type ControllerInterface interface { | ||
| 120 | Init(ct *Context, cn string) | ||
| 121 | Prepare() | ||
| 122 | Get() | ||
| 123 | Post() | ||
| 124 | Delete() | ||
| 125 | Put() | ||
| 126 | Head() | ||
| 127 | Patch() | ||
| 128 | Options() | ||
| 129 | Finish() | ||
| 130 | Render() error | ||
| 131 | } | ||
| 132 | |||
| 133 | 这些方法`beego.Controller`都已经实现了,所以只要用户定义struct的时候匿名包含就可以了。当然更灵活的方法就是用户可以去自定义类似的方法,然后实现自己的逻辑。 | ||
| 134 | |||
| 135 | 用户可以通过如下的方式进行路由设置: | ||
| 136 | |||
| 137 | beego.Router("/", &controllers.MainController{}) | ||
| 138 | beego.Router("/admin", &admin.UserController{}) | ||
| 139 | beego.Router("/admin/index", &admin.ArticleController{}) | ||
| 140 | beego.Router("/admin/addpkg", &admin.AddController{}) | ||
| 141 | |||
| 142 | 为了用户更加方便的路由设置,beego参考了sinatra的路由实现,支持多种方式的路由: | ||
| 143 | |||
| 144 | - beego.Router("/api/:id([0-9]+)", &controllers.RController{}) | ||
| 145 | 自定义正则匹配 //匹配 /api/123 :id= 123 | ||
| 146 | |||
| 147 | - beego.Router("/news/:all", &controllers.RController{}) | ||
| 148 | 全匹配方式 //匹配 /news/path/to/123.html :all= path/to/123.html | ||
| 149 | |||
| 150 | - beego.Router("/user/:username([\w]+)", &controllers.RController{}) | ||
| 151 | 正则字符串匹配 //匹配 /user/astaxie :username = astaxie | ||
| 152 | |||
| 153 | - beego.Router("/download/*.*", &controllers.RController{}) | ||
| 154 | *匹配方式 //匹配 /download/file/api.xml :path= file/api :ext=xml | ||
| 155 | |||
| 156 | - beego.Router("/download/ceshi/*", &controllers.RController{}) | ||
| 157 | *全匹配方式 //匹配 /download/ceshi/file/api.json :splat=file/api.json | ||
| 158 | |||
| 159 | - beego.Router("/:id:int", &controllers.RController{}) | ||
| 160 | int类型设置方式 //匹配 :id为int类型,框架帮你实现了正则([0-9]+) | ||
| 161 | |||
| 162 | - beego.Router("/:hi:string", &controllers.RController{}) | ||
| 163 | string类型设置方式 //匹配 :hi为string类型。框架帮你实现了正则([\w]+) | ||
| 164 | |||
| 93 | ## 静态文件 | 165 | ## 静态文件 |
| 166 | Go语言内部其实已经提供了`http.ServeFile`,通过这个函数可以实现静态文件的服务。beego针对这个功能进行了一层封装,通过下面的方式进行静态文件注册: | ||
| 167 | |||
| 168 | beego.SetStaticPath("/static","public") | ||
| 169 | |||
| 170 | - 第一个参数是路径,url路径信息 | ||
| 171 | - 第二个参数是静态文件目录(相对应用所在的目录) | ||
| 172 | |||
| 173 | beego支持多个目录的静态文件注册,用户可以注册如下的静态文件目录: | ||
| 174 | |||
| 175 | beego.SetStaticPath("/images","images") | ||
| 176 | beego.SetStaticPath("/css","css") | ||
| 177 | beego.SetStaticPath("/js","js") | ||
| 178 | |||
| 179 | 设置了如上的静态目录之后,用户访问`/images/login/login.png`,那么就会访问应用对应的目录下面的`images/login/login.png`文件。如果是访问`/static/img/logo.png`,那么就访问`public/img/logo.png`文件。 | ||
| 180 | |||
| 181 | ## 过滤和中间件 | ||
| 182 | beego支持自定义过滤中间件,例如安全验证,强制跳转等 | ||
| 183 | |||
| 184 | 如下例子所示,验证用户名是否是admin,应用于全部的请求: | ||
| 185 | |||
| 186 | var FilterUser = func(w http.ResponseWriter, r *http.Request) { | ||
| 187 | if r.URL.User == nil || r.URL.User.Username() != "admin" { | ||
| 188 | http.Error(w, "", http.StatusUnauthorized) | ||
| 189 | } | ||
| 190 | } | ||
| 191 | |||
| 192 | beego.Filter(FilterUser) | ||
| 193 | |||
| 194 | 还可以通过参数进行过滤,如果匹配参数就执行 | ||
| 195 | |||
| 196 | beego.Router("/:id([0-9]+)", &admin.EditController{}) | ||
| 197 | beego.FilterParam("id", func(rw http.ResponseWriter, r *http.Request) { | ||
| 198 | dosomething() | ||
| 199 | }) | ||
| 200 | |||
| 201 | 当然你还可以通过前缀过滤 | ||
| 202 | |||
| 203 | beego.FilterPrefixPath("/admin", func(rw http.ResponseWriter, r *http.Request) { | ||
| 204 | dosomething() | ||
| 205 | }) | ||
| 94 | 206 | ||
| 95 | ## 模板处理 | 207 | ## 模板处理 |
| 96 | 208 | ... | ... |
docs/zh/images/dev.png
0 → 100644
68 KB
-
Please register or sign in to post a comment