6ce02f1d by astaxie

add SaveToFile & docs

1 parent e8653255
...@@ -6,10 +6,12 @@ import ( ...@@ -6,10 +6,12 @@ import (
6 "encoding/xml" 6 "encoding/xml"
7 "github.com/astaxie/beego/session" 7 "github.com/astaxie/beego/session"
8 "html/template" 8 "html/template"
9 "io"
9 "io/ioutil" 10 "io/ioutil"
10 "mime/multipart" 11 "mime/multipart"
11 "net/http" 12 "net/http"
12 "net/url" 13 "net/url"
14 "os"
13 "path" 15 "path"
14 "strconv" 16 "strconv"
15 "strings" 17 "strings"
...@@ -197,6 +199,21 @@ func (c *Controller) GetFile(key string) (multipart.File, *multipart.FileHeader, ...@@ -197,6 +199,21 @@ func (c *Controller) GetFile(key string) (multipart.File, *multipart.FileHeader,
197 return c.Ctx.Request.FormFile(key) 199 return c.Ctx.Request.FormFile(key)
198 } 200 }
199 201
202 func (c *Controller) SaveToFile(fromfile, tofile string) error {
203 file, _, err := c.Ctx.Request.FormFile(fromfile)
204 if err != nil {
205 return err
206 }
207 defer file.Close()
208 f, err := os.OpenFile(tofile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
209 if err != nil {
210 return err
211 }
212 defer f.Close()
213 io.Copy(f, file)
214 return nil
215 }
216
200 func (c *Controller) StartSession() (sess session.SessionStore) { 217 func (c *Controller) StartSession() (sess session.SessionStore) {
201 sess = GlobalSessions.SessionStart(c.Ctx.ResponseWriter, c.Ctx.Request) 218 sess = GlobalSessions.SessionStart(c.Ctx.ResponseWriter, c.Ctx.Request)
202 return 219 return
......
1 # 快速入门 1 # 快速入门
2 你对beego一无所知?没关系,这篇文档会很好的详细介绍beego的各个方面,看这个文档之前首先确认你已经安装了beego,如果你没有安装的话,请看这篇[安装指南](Install.md) 2 你对beego一无所知?没关系,这篇文档会很好的详细介绍beego的各个方面,看这个文档之前首先确认你已经安装了beego,如果你没有安装的话,请看这篇[安装指南](Install.md)
3 3
4 **导航** 4 **导航**
5 5
6 - [最小应用](#-1) 6 - [最小应用](#-1)
7 - [新建项目](#-2) 7 - [新建项目](#-2)
8 - [开发模式](#-3) 8 - [开发模式](#-3)
9 - [路由设置](#-4) 9 - [路由设置](#-4)
10 - [静态文件](#-5) 10 - [静态文件](#-5)
11 - [过滤和中间件](#-6) 11 - [过滤和中间件](#-6)
12 - [模板处理](#-7) 12 - [模板处理](#-7)
13 - [request处理](#-8) 13 - [request处理](#-8)
14 - [跳转和错误](#-9) 14 - [跳转和错误](#-9)
15 - [response处理](#-10) 15 - [response处理](#-10)
16 - [Sessions](#-11) 16 - [Sessions](#-11)
17 - [Cache设置](#-12) 17 - [Cache设置](#-12)
18 - [安全的Map](#-13) 18 - [安全的Map](#-13)
19 - [日志处理](#-14) 19 - [日志处理](#-14)
20 - [第三方应用集成](#-15) 20 - [第三方应用集成](#-15)
21 - [部署编译应用](#-16) 21 - [部署编译应用](#-16)
22 22
23 ## 最小应用 23 ## 最小应用
24 一个最小最简单的应用如下代码所示: 24 一个最小最简单的应用如下代码所示:
25 25
26 package main 26 package main
27 27
28 import ( 28 import (
29 "github.com/astaxie/beego" 29 "github.com/astaxie/beego"
30 ) 30 )
31 31
32 type MainController struct { 32 type MainController struct {
33 beego.Controller 33 beego.Controller
34 } 34 }
35 35
36 func (this *MainController) Get() { 36 func (this *MainController) Get() {
37 this.Ctx.WriteString("hello world") 37 this.Ctx.WriteString("hello world")
38 } 38 }
39 39
40 func main() { 40 func main() {
41 beego.Router("/", &MainController{}) 41 beego.Router("/", &MainController{})
42 beego.Run() 42 beego.Run()
43 } 43 }
44 44
45 把上面的代码保存为hello.go,然后通过命令行进行编译并执行: 45 把上面的代码保存为hello.go,然后通过命令行进行编译并执行:
46 46
47 $ go build main.go 47 $ go build main.go
48 $ ./hello 48 $ ./hello
49 49
50 这个时候你可以打开你的浏览器,通过这个地址浏览[http://127.0.0.1:8080](http://127.0.0.1:8080)返回“hello world” 50 这个时候你可以打开你的浏览器,通过这个地址浏览[http://127.0.0.1:8080](http://127.0.0.1:8080)返回“hello world”
51 51
52 那么上面的代码到底做了些什么呢? 52 那么上面的代码到底做了些什么呢?
53 53
54 1、首先我们引入了包`github.com/astaxie/beego`,我们知道Go语言里面引入包会深度优先的去执行引入包的初始化(变量和init函数,[更多](https://github.com/astaxie/build-web-application-with-golang/blob/master/ebook/02.3.md#maininit)),beego包中会初始化一个BeeAPP的应用,初始化一些参数。 54 1、首先我们引入了包`github.com/astaxie/beego`,我们知道Go语言里面引入包会深度优先的去执行引入包的初始化(变量和init函数,[更多](https://github.com/astaxie/build-web-application-with-golang/blob/master/ebook/02.3.md#maininit)),beego包中会初始化一个BeeAPP的应用,初始化一些参数。
55 55
56 2、定义Controller,这里我们定义了一个struct为`MainController`,充分利用了Go语言的组合的概念,匿名包含了`beego.Controller`,这样我们的`MainController`就拥有了`beego.Controller`的所有方法。 56 2、定义Controller,这里我们定义了一个struct为`MainController`,充分利用了Go语言的组合的概念,匿名包含了`beego.Controller`,这样我们的`MainController`就拥有了`beego.Controller`的所有方法。
57 57
58 3、定义RESTFul方法,通过匿名组合之后,其实目前的`MainController`已经拥有了`Get``Post``Delete``Put`等方法,这些方法是分别用来对应用户请求的Method函数,如果用户发起的是`POST`请求,那么就执行`Post`函数。所以这里我们定义了`MainController``Get`方法用来重写继承的`Get`函数,这样当用户`GET`请求的时候就会执行该函数。 58 3、定义RESTFul方法,通过匿名组合之后,其实目前的`MainController`已经拥有了`Get``Post``Delete``Put`等方法,这些方法是分别用来对应用户请求的Method函数,如果用户发起的是`POST`请求,那么就执行`Post`函数。所以这里我们定义了`MainController``Get`方法用来重写继承的`Get`函数,这样当用户`GET`请求的时候就会执行该函数。
59 59
60 4、定义main函数,所有的Go应用程序和C语言一样都是Main函数作为入口,所以我们这里定义了我们应用的入口。 60 4、定义main函数,所有的Go应用程序和C语言一样都是Main函数作为入口,所以我们这里定义了我们应用的入口。
61 61
62 5、Router注册路由,路由就是告诉beego,当用户来请求的时候,该如何去调用相应的Controller,这里我们注册了请求`/`的时候,请求到`MainController`。这里我们需要知道,Router函数的两个参数函数,第一个是路径,第二个是Controller的指针。 62 5、Router注册路由,路由就是告诉beego,当用户来请求的时候,该如何去调用相应的Controller,这里我们注册了请求`/`的时候,请求到`MainController`。这里我们需要知道,Router函数的两个参数函数,第一个是路径,第二个是Controller的指针。
63 63
64 6、Run应用,最后一步就是把在1中初始化的BeeApp开启起来,其实就是内部监听了8080端口:`Go默认情况会监听你本机所有的IP上面的8080端口` 64 6、Run应用,最后一步就是把在1中初始化的BeeApp开启起来,其实就是内部监听了8080端口:`Go默认情况会监听你本机所有的IP上面的8080端口`
65 65
66 停止服务的话,请按`ctrl+c` 66 停止服务的话,请按`ctrl+c`
67 67
68 ## 新建项目 68 ## 新建项目
69 69
70 通过如下命令创建beego项目,首先进入gopath目录 70 通过如下命令创建beego项目,首先进入gopath目录
71 71
72 bee create hello 72 bee create hello
73 73
74 这样就建立了一个项目hello,目录结构如下所示 74 这样就建立了一个项目hello,目录结构如下所示
75 75
76 . 76 .
77 ├── conf 77 ├── conf
78 │ └── app.conf 78 │ └── app.conf
79 ├── controllers 79 ├── controllers
80 │ └── default.go 80 │ └── default.go
81 ├── main.go 81 ├── main.go
82 ├── models 82 ├── models
83 ├── static 83 ├── static
84 │ ├── css 84 │ ├── css
85 │ ├── img 85 │ ├── img
86 │ └── js 86 │ └── js
87 └── views 87 └── views
88 └── index.tpl 88 └── index.tpl
89 89
90 ## 开发模式 90 ## 开发模式
91 91
92 通过bee创建的项目,beego默认情况下是开发模式。 92 通过bee创建的项目,beego默认情况下是开发模式。
93 93
94 我们可以通过如下的方式改变我们的模式: 94 我们可以通过如下的方式改变我们的模式:
95 95
96 beego.RunMode = "pro" 96 beego.RunMode = "pro"
97 97
98 或者我们在conf/app.conf下面设置如下: 98 或者我们在conf/app.conf下面设置如下:
99 99
100 runmode = pro 100 runmode = pro
101 101
102 以上两种效果一样。 102 以上两种效果一样。
103 103
104 开发模式中 104 开发模式中
105 105
106 - 开发模式下,如果你的目录不存在views目录,那么会出现类似下面的错误提示: 106 - 开发模式下,如果你的目录不存在views目录,那么会出现类似下面的错误提示:
107 107
108 2013/04/13 19:36:17 [W] [stat views: no such file or directory] 108 2013/04/13 19:36:17 [W] [stat views: no such file or directory]
109 109
110 - 模板会自动重新加载不缓存。 110 - 模板会自动重新加载不缓存。
111 - 如果服务端出错,那么就会在浏览器端显示如下类似的截图: 111 - 如果服务端出错,那么就会在浏览器端显示如下类似的截图:
112 112
113 ![](images/dev.png) 113 ![](images/dev.png)
114 114
115 ## 路由设置 115 ## 路由设置
116 116
117 路由的主要功能是实现从请求地址到实现方法,beego中封装了`Controller`,所以路由是从路径到`ControllerInterface`的过程,`ControllerInterface`的方法有如下: 117 路由的主要功能是实现从请求地址到实现方法,beego中封装了`Controller`,所以路由是从路径到`ControllerInterface`的过程,`ControllerInterface`的方法有如下:
118 118
119 type ControllerInterface interface { 119 type ControllerInterface interface {
120 Init(ct *Context, cn string) 120 Init(ct *Context, cn string)
121 Prepare() 121 Prepare()
122 Get() 122 Get()
123 Post() 123 Post()
124 Delete() 124 Delete()
125 Put() 125 Put()
126 Head() 126 Head()
127 Patch() 127 Patch()
128 Options() 128 Options()
129 Finish() 129 Finish()
130 Render() error 130 Render() error
131 } 131 }
132 132
133 这些方法`beego.Controller`都已经实现了,所以只要用户定义struct的时候匿名包含就可以了。当然更灵活的方法就是用户可以去自定义类似的方法,然后实现自己的逻辑。 133 这些方法`beego.Controller`都已经实现了,所以只要用户定义struct的时候匿名包含就可以了。当然更灵活的方法就是用户可以去自定义类似的方法,然后实现自己的逻辑。
134 134
135 用户可以通过如下的方式进行路由设置: 135 用户可以通过如下的方式进行路由设置:
136 136
137 beego.Router("/", &controllers.MainController{}) 137 beego.Router("/", &controllers.MainController{})
138 beego.Router("/admin", &admin.UserController{}) 138 beego.Router("/admin", &admin.UserController{})
139 beego.Router("/admin/index", &admin.ArticleController{}) 139 beego.Router("/admin/index", &admin.ArticleController{})
140 beego.Router("/admin/addpkg", &admin.AddController{}) 140 beego.Router("/admin/addpkg", &admin.AddController{})
141 141
142 为了用户更加方便的路由设置,beego参考了sinatra的路由实现,支持多种方式的路由: 142 为了用户更加方便的路由设置,beego参考了sinatra的路由实现,支持多种方式的路由:
143 143
144 - beego.Router("/api/:id([0-9]+)", &controllers.RController{}) 144 - beego.Router("/api/:id([0-9]+)", &controllers.RController{})
145 自定义正则匹配 //匹配 /api/123 :id= 123 145 自定义正则匹配 //匹配 /api/123 :id= 123
146 146
147 - beego.Router("/news/:all", &controllers.RController{}) 147 - beego.Router("/news/:all", &controllers.RController{})
148 全匹配方式 //匹配 /news/path/to/123.html :all= path/to/123.html 148 全匹配方式 //匹配 /news/path/to/123.html :all= path/to/123.html
149 149
150 - beego.Router("/user/:username([\w]+)", &controllers.RController{}) 150 - beego.Router("/user/:username([\w]+)", &controllers.RController{})
151 正则字符串匹配 //匹配 /user/astaxie :username = astaxie 151 正则字符串匹配 //匹配 /user/astaxie :username = astaxie
152 152
153 - beego.Router("/download/*.*", &controllers.RController{}) 153 - beego.Router("/download/*.*", &controllers.RController{})
154 *匹配方式 //匹配 /download/file/api.xml :path= file/api :ext=xml 154 *匹配方式 //匹配 /download/file/api.xml :path= file/api :ext=xml
155 155
156 - beego.Router("/download/ceshi/*", &controllers.RController{}) 156 - beego.Router("/download/ceshi/*", &controllers.RController{})
157 *全匹配方式 //匹配 /download/ceshi/file/api.json :splat=file/api.json 157 *全匹配方式 //匹配 /download/ceshi/file/api.json :splat=file/api.json
158 158
159 - beego.Router("/:id:int", &controllers.RController{}) 159 - beego.Router("/:id:int", &controllers.RController{})
160 int类型设置方式 //匹配 :id为int类型,框架帮你实现了正则([0-9]+) 160 int类型设置方式 //匹配 :id为int类型,框架帮你实现了正则([0-9]+)
161 161
162 - beego.Router("/:hi:string", &controllers.RController{}) 162 - beego.Router("/:hi:string", &controllers.RController{})
163 string类型设置方式 //匹配 :hi为string类型。框架帮你实现了正则([\w]+) 163 string类型设置方式 //匹配 :hi为string类型。框架帮你实现了正则([\w]+)
164 164
165 ## 静态文件 165 ## 静态文件
166 Go语言内部其实已经提供了`http.ServeFile`,通过这个函数可以实现静态文件的服务。beego针对这个功能进行了一层封装,通过下面的方式进行静态文件注册: 166 Go语言内部其实已经提供了`http.ServeFile`,通过这个函数可以实现静态文件的服务。beego针对这个功能进行了一层封装,通过下面的方式进行静态文件注册:
167 167
168 beego.SetStaticPath("/static","public") 168 beego.SetStaticPath("/static","public")
169 169
170 - 第一个参数是路径,url路径信息 170 - 第一个参数是路径,url路径信息
171 - 第二个参数是静态文件目录(相对应用所在的目录) 171 - 第二个参数是静态文件目录(相对应用所在的目录)
172 172
173 beego支持多个目录的静态文件注册,用户可以注册如下的静态文件目录: 173 beego支持多个目录的静态文件注册,用户可以注册如下的静态文件目录:
174 174
175 beego.SetStaticPath("/images","images") 175 beego.SetStaticPath("/images","images")
176 beego.SetStaticPath("/css","css") 176 beego.SetStaticPath("/css","css")
177 beego.SetStaticPath("/js","js") 177 beego.SetStaticPath("/js","js")
178 178
179 设置了如上的静态目录之后,用户访问`/images/login/login.png`,那么就会访问应用对应的目录下面的`images/login/login.png`文件。如果是访问`/static/img/logo.png`,那么就访问`public/img/logo.png`文件。 179 设置了如上的静态目录之后,用户访问`/images/login/login.png`,那么就会访问应用对应的目录下面的`images/login/login.png`文件。如果是访问`/static/img/logo.png`,那么就访问`public/img/logo.png`文件。
180 180
181 ## 过滤和中间件 181 ## 过滤和中间件
182 beego支持自定义过滤中间件,例如安全验证,强制跳转等 182 beego支持自定义过滤中间件,例如安全验证,强制跳转等
183 183
184 如下例子所示,验证用户名是否是admin,应用于全部的请求: 184 如下例子所示,验证用户名是否是admin,应用于全部的请求:
185 185
186 var FilterUser = func(w http.ResponseWriter, r *http.Request) { 186 var FilterUser = func(w http.ResponseWriter, r *http.Request) {
187 if r.URL.User == nil || r.URL.User.Username() != "admin" { 187 if r.URL.User == nil || r.URL.User.Username() != "admin" {
188 http.Error(w, "", http.StatusUnauthorized) 188 http.Error(w, "", http.StatusUnauthorized)
189 } 189 }
190 } 190 }
191 191
192 beego.Filter(FilterUser) 192 beego.Filter(FilterUser)
193 193
194 还可以通过参数进行过滤,如果匹配参数就执行 194 还可以通过参数进行过滤,如果匹配参数就执行
195 195
196 beego.Router("/:id([0-9]+)", &admin.EditController{}) 196 beego.Router("/:id([0-9]+)", &admin.EditController{})
197 beego.FilterParam("id", func(rw http.ResponseWriter, r *http.Request) { 197 beego.FilterParam("id", func(rw http.ResponseWriter, r *http.Request) {
198 dosomething() 198 dosomething()
199 }) 199 })
200 200
201 当然你还可以通过前缀过滤 201 当然你还可以通过前缀过滤
202 202
203 beego.FilterPrefixPath("/admin", func(rw http.ResponseWriter, r *http.Request) { 203 beego.FilterPrefixPath("/admin", func(rw http.ResponseWriter, r *http.Request) {
204 dosomething() 204 dosomething()
205 }) 205 })
206 206
207 ## 模板处理 207 ## 模板处理
208 ### 模板目录 208 ### 模板目录
209 beego中默认的模板目录是`views`,用户可以把你的模板文件放到该目录下,beego会自动在该目录下的所有模板文件进行解析并缓存,开发模式下会每次重新解析,不做缓存。当然用户可以通过如下的方式改变模板的目录: 209 beego中默认的模板目录是`views`,用户可以把你的模板文件放到该目录下,beego会自动在该目录下的所有模板文件进行解析并缓存,开发模式下会每次重新解析,不做缓存。当然用户可以通过如下的方式改变模板的目录:
210 210
211 beego.ViewsPath = "/myviewpath" 211 beego.ViewsPath = "/myviewpath"
212 ### 自动渲染 212 ### 自动渲染
213 beego中用户无需手动的调用渲染输出模板,beego会自动的在调用玩相应的method方法之后调用Render函数,当然如果你的应用是不需要模板输出的,那么你可以在配置文件或者在main.go中设置关闭自动渲染。 213 beego中用户无需手动的调用渲染输出模板,beego会自动的在调用玩相应的method方法之后调用Render函数,当然如果你的应用是不需要模板输出的,那么你可以在配置文件或者在main.go中设置关闭自动渲染。
214 214
215 配置文件配置如下: 215 配置文件配置如下:
216 216
217 autorender = false 217 autorender = false
218 218
219 main.go文件中设置如下: 219 main.go文件中设置如下:
220 220
221 beego.AutoRender = false 221 beego.AutoRender = false
222 ### 模板名称 222 ### 模板名称
223 beego采用了Go语言内置的模板引擎,所有模板的语法和Go的一模一样,至于如何写模板文件,详细的请参考[模板教程](https://github.com/astaxie/build-web-application-with-golang/blob/master/ebook/07.4.md) 223 beego采用了Go语言内置的模板引擎,所有模板的语法和Go的一模一样,至于如何写模板文件,详细的请参考[模板教程](https://github.com/astaxie/build-web-application-with-golang/blob/master/ebook/07.4.md)
224 224
225 用户通过在Controller的对应方法中设置相应的模板名称,beego会自动的在viewpath目录下查询该文件并渲染,例如下面的设置,beego会在admin下面找add.tpl文件进行渲染: 225 用户通过在Controller的对应方法中设置相应的模板名称,beego会自动的在viewpath目录下查询该文件并渲染,例如下面的设置,beego会在admin下面找add.tpl文件进行渲染:
226 226
227 this.TplNames = "admin/add.tpl" 227 this.TplNames = "admin/add.tpl"
228 228
229 我们看到上面的模板后缀名是tpl,beego默认情况下支持tpl和html后缀名的模板文件,如果你的后缀名不是这两种,请进行如下设置: 229 我们看到上面的模板后缀名是tpl,beego默认情况下支持tpl和html后缀名的模板文件,如果你的后缀名不是这两种,请进行如下设置:
230 230
231 beego.AddTemplateExt("你文件的后缀名") 231 beego.AddTemplateExt("你文件的后缀名")
232 232
233 当你设置了自动渲染,然后在你的Controller中没有设置任何的TplNames,那么beego会自动设置你的模板文件如下: 233 当你设置了自动渲染,然后在你的Controller中没有设置任何的TplNames,那么beego会自动设置你的模板文件如下:
234 234
235 c.TplNames = c.ChildName + "/" + c.Ctx.Request.Method + "." + c.TplExt 235 c.TplNames = c.ChildName + "/" + c.Ctx.Request.Method + "." + c.TplExt
236 236
237 也就是你对应的Controller名字+请求方法名.模板后缀,也就是如果你的Controller名是`AddController`,请求方法是`POST`,默认的文件后缀是`tpl`,那么就会默认请求`/viewpath/AddController/POST.tpl`文件。 237 也就是你对应的Controller名字+请求方法名.模板后缀,也就是如果你的Controller名是`AddController`,请求方法是`POST`,默认的文件后缀是`tpl`,那么就会默认请求`/viewpath/AddController/POST.tpl`文件。
238 238
239 ### lauout设计 239 ### lauout设计
240 240 beego支持layout设计,例如你在管理系统中,其实整个的管理界面是固定的,支会变化中间的部分,那么你可以通过如下的设置:
241 ### 模板函数 241
242 242 this.Layout = "admin/layout.html"
243 ## request处理 243 this.TplNames = "admin/add.tpl"
244 244
245 ## 跳转和错误 245 在layout.html中你必须设置如下的变量:
246 246
247 ## response处理 247 {{.LayoutContent}}
248 248
249 ## Sessions 249 beego就会首先解析TplNames指定的文件,获取内容赋值给LayoutContent,然后最后渲染layout.html文件。
250 250
251 ## Cache设置 251 目前采用首先把目录下所有的文件进行缓存,所以用户还可以通过类似这样的方式实现layout:
252 252
253 ## 安全的Map 253 {{template "header.html"}}
254 254 处理逻辑
255 ## 日志处理 255 {{template "footer.html"}}
256 256
257 ## 第三方应用集成 257 ### 模板函数
258 258 beego支持用户定义模板函数,但是必须在`beego.Run()`调用之前,设置如下:
259 ## 部署编译应用 259
260 260 func hello(in string)(out string){
261 - [beego介绍](README.md) 261 out = in + "world"
262 return
263 }
264
265 beego.AddFuncMap("hi",hello)
266
267 定义之后你就可以在模板中这样使用了:
268
269 {{.Content | hi}}
270
271 目前beego内置的模板函数有如下:
272
273 * markdown
274
275 实现了把markdown文本转化为html信息,使用方法{{markdown .Content}}
276 * dateformat
277
278 实现了时间的格式化,返回字符串,使用方法{{dateformat .Time "2006-01-02T15:04:05Z07:00"}}
279 * date
280
281 实现了类似PHP的date函数,可以很方便的根据字符串返回时间,使用方法{{date .T "Y-m-d H:i:s"}}
282 * compare
283
284 实现了比较两个对象的比较,如果相同返回true,否者false,使用方法{{compare .A .B}}
285 * substr
286
287 实现了字符串的截取,支持中文截取的完美截取,使用方法{{substr .Str 0 30}}
288 * html2str
289
290 实现了把html转化为字符串,剔除一些script、css之类的元素,返回纯文本信息,使用方法{{html2str .Htmlinfo}}
291 * str2html
292
293 实现了把相应的字符串当作HTML来输出,不转义,使用方法{{str2html .Strhtml}}
294 * htmlquote
295
296 实现了基本的html字符转义,使用方法{{htmlquote .quote}}
297 * htmlunquote
298
299 实现了基本的反转移字符,使用方法{{htmlunquote .unquote}}
300
301 ## request处理
302 我们经常需要获取用户传递的数据,包括Get、POST等方式的请求,beego里面会自动解析这些数据,你可以通过如下方式获取数据
303
304 - GetString
305 - GetInt
306 - GetBool
307
308
309 ### 文件上传
310
311 - GetFile
312 - SaveToFile
313
314 ## 跳转和错误
315
316 ## response处理
317
318 ## Sessions
319
320 ## Cache设置
321
322 ## 安全的Map
323
324 ## 日志处理
325
326 ## 第三方应用集成
327
328 ## 部署编译应用
329
330 - [beego介绍](README.md)
262 - [一步一步开发应用](Tutorial.md) 331 - [一步一步开发应用](Tutorial.md)
...\ No newline at end of file ...\ No newline at end of file
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!