beego框架之路由实践

  近日在学习beego框架,今天把beego框架中的路由设置这一块进行了动手实践,感觉beego框架的路由功能还是蛮强大的。参考原文:http://beego.me/docs/mvc/controller/router.md#namespace

  修改过程中主要是修改了routers/router.go文件,当然也有修改controllers/default.go,views/index.tpl和自己追加了一个login.html页面。这里主要是动手实践路由配置,所以仅仅保持路由的代码。

routers/router.go

  1 package routers
  2
  3 import (
  4     "beegorouter/controllers"
  5     "github.com/astaxie/beego"
  6     "github.com/astaxie/beego/context"
  7 )
  8
  9 func init() {
 10     // bee 工具自动生成的固定路由
 11     beego.Router("/", &controllers.MainController{})
 12
 13     // beego路由实践,参考文档:http://beego.me/docs/mvc/controller/router.md
 14
 15     /**
 16      * 基础路由实践
 17      */
 18
 19     /**
 20      * 基本Get路由实践
 21      * 注意事项:需要导入包:github.com/astaxie/beego/context
 22      *           否则【context.Context】会编译出错
 23      * 测试用例:浏览器里输入:http://localhost:8080/get
 24      * 输出结果:在浏览器页面里显示:基本Get路由实践。
 25      */
 26     beego.Get("/get", func(ctx *context.Context) {
 27         ctx.Output.Body([]byte("基本Get路由实践。"))
 28     })
 29
 30     /**
 31      * 基本Post路由实践
 32      * 注意事项:需要修改或是追加html页面,从页面提交一个post请求
 33      * 测试用例:修改index.tpl模板,追加一按钮,指定method="post",点击该按钮
 34      * 输出结果:基本Post路由实践。
 35      */
 36     beego.Post("/post", func(ctx *context.Context) {
 37         ctx.Output.Body([]byte("基本Post路由实践。"))
 38     })
 39
 40     /**
 41      * 正则路由实践
 42      */
 43
 44     /**
 45     * 正则路由实践
 46     * 注意事项:1. 第二个参数需要传递一个控制器:Controller
 47     *           2. 【?:id】 中的id也可以换成其他字符,如:【?:abc】
 48     * 测试用例:能 匹 配:/api ; /api/123 ; /api/abc ; /api/abc.html ; /api/abc/
 49                 不能匹配:/api/123/456 :即/api/之后只能再接一个参数
 50     * 输出结果:具体输出结果需要看第二个参数的Get()方法所指定的模板和数据。
 51     */
 52     beego.Router("/api/?:id", &controllers.MainController{})
 53
 54     /**
 55     * 正则路由实践
 56     * 注意事项:【:id】前面没有了 ?
 57     * 测试用例:能 匹 配:/api/123 ; /api/abc ; /api/abc.html ; /api/abc/
 58                 不能匹配:/api ; /api/123/456 :即/api/之后只能再接一个参数
 59     * 输出结果:具体输出结果需要看第二个参数的Get()方法所指定的模板和数据。
 60     */
 61     beego.Router("/api/:id", &controllers.MainController{})
 62
 63     /**
 64     * 正则路由实践
 65     * 注意事项:【:id】前面没有了 ?
 66     * 测试用例:能 匹 配:/api/123 ; /api/0
 67                 不能匹配:/api ; /api/123/456 ; /api/abc ; /api/123.html
 68     * 输出结果:具体输出结果需要看第二个参数的Get()方法所指定的模板和数据。
 69     */
 70     beego.Router("/api/:id:int", &controllers.MainController{})
 71
 72     /**
 73     * 正则路由实践
 74     * 注意事项::id([0-9]+) 之中有个 + 号。有+号时表示可以是多位数字,无+号表示就只能匹配一位数字
 75     * 测试用例:能 匹 配:/api/123 ; /api/0
 76                 不能匹配:/api ; /api/abc ; /api/123/456 :即/api/之后只能再接一个参数
 77     * 输出结果:具体输出结果需要看第二个参数的Get()方法所指定的模板和数据。
 78     */
 79     beego.Router("/api/:id([0-9]+)", &controllers.MainController{})
 80
 81     /**
 82     * 正则路由实践
 83     * 注意事项::[\\w] 之中的w不能替换为别的字符
 84     * 测试用例:能 匹 配:/api/123 ; /api/hezhixiong
 85                 不能匹配:/api ; /api/abc.html
 86     * 输出结果:具体输出结果需要看第二个参数的Get()方法所指定的模板和数据。
 87     */
 88     beego.Router("/api/:username([\\w]+)", &controllers.MainController{})
 89
 90     /**
 91     * 正则路由实践
 92     * 注意事项:: :username:string表示 username为string型
 93     * 测试用例:能 匹 配:/api/123 ; /api/hezhixiong
 94                 不能匹配:/api ; /api/abc.html
 95     * 输出结果:具体输出结果需要看第二个参数的Get()方法所指定的模板和数据。
 96     */
 97     beego.Router("/api/:username:string", &controllers.MainController{})
 98
 99     /**
100     * 正则路由实践
101     * 注意事项::无
102     * 测试用例:能 匹 配:/api/123 ; /api/hezhixiong ; /api/abc.html ; /api/abc/123/efg/ddd
103                 不能匹配:/api
104     * 输出结果:具体输出结果需要看第二个参数的Get()方法所指定的模板和数据。
105     */
106     beego.Router("/api/*.*", &controllers.MainController{})
107
108     /**
109     * 正则路由实践
110     * 注意事项::无
111     * 测试用例:能 匹 配:/api/123 ; /api/hezhixiong ; /api/abc.html ; /api/abc/123/efg/ddd
112                 不能匹配:/api
113     * 输出结果:具体输出结果需要看第二个参数的Get()方法所指定的模板和数据。
114     */
115     beego.Router("/api/*", &controllers.MainController{})
116
117     /**
118     * 正则路由实践
119     * 注意事项::无
120     * 测试用例:能 匹 配:/api/bei_123.html ; /api/bei_0.html
121                 不能匹配:/api/bei_.html ; /api/bei_123 ; /api/bei_12a.html
122     * 输出结果:具体输出结果需要看第二个参数的Get()方法所指定的模板和数据。
123     */
124     beego.Router("/api/bei_:id([0-9]+).html", &controllers.MainController{})
125
126     /**
127      * 自定义方法及RESTful规则的实践
128      */
129
130     /**
131     * 自定义方法实践
132     * 注意事项:第三个参数"*:MyMethod"之中,不能有空格(如:"* : MyMethod"),否则编译报错
133     * 测试用例:客户端进行Get,Post,Put,Delete请求
134     * 输出结果:执行 MainController的MyMethod方法,不再执行RESTful的规则:即Get请求执行Get方法……
135      */
136     beego.Router("/bei", &controllers.MainController{}, "*:MyMethod")
137     /**
138     * Get请求不再执行Get()函数,而是执行指定的MyGet()函数,没指定的其他请求(如Post),则按照RESTful规则执行
139     * beego.Router("/bei", &controllers.MainController{}, "get:MyGet")
140     *
141     * 多个 HTTP Method 指向同一个函数
142     * beego.Router("/bei", &controllers.MainController{}, "get,post:MyGetPost")
143     *
144     * 不同的 method 对应不同的函数,通过 ;进行分割
145     * beego.Router("/bei", &controllers.MainController{}, "get:GetFunc;post:PostFunc")
146      *
147     * 如果同时存在 * 和对应的 HTTP Method,那么优先执行 HTTP Method 的方法
148     * beego.Router("/bei", &controllers.MainController{}, "*:AllFunc;post:PostFunc")
149     */
150
151     /**
152      * 自动路由
153      */
154
155     /**
156     * 正则路由实践
157     * 注意事项:控制器的名称为:MainController,那么【main】为路径中的第一个参数
158     * 测试用例:路径为:/main/login      将会调用 MainController 中的Login()函数
159                 路径为:/main/login/123  将会调用 MainController 中的Login()函数
160                 路径为:/hello/login.htm 将会调用 MainController 中的Login()函数
161                 路径为:/hello/login     不能调用 MainController 中的Login()函数
162                 路径为:/hellologin      不能调用 MainController 中的Login()函数
163     * 输出结果:具体输出结果需要看控制器(MainController)的Login函数所指定的模板和数据。
164     */
165     beego.AutoRouter(&controllers.MainController{}) // 把需要的路由注册到自动路由中
166
167     /**
168      * 注解路由
169      */
170
171     /**
172     * 注解路由实践
173     * 注意事项:重要comments:// @router
174     * 测试用例:
175     * 输出结果:具体输出结果需要看控制器(MainController)的函数所指定的模板和数据。
176      */
177     beego.Include(&controllers.MainController{})
178
179     /**
180      * namespace路由
181      */
182
183     /**
184     * namespace路由实践
185     * 注意事项:必须要把NewNamespace的对象注册到AddNamespace中去,否则无效
186     * 测试用例:仅仅匹配:/aaa/go
187     * 输出结果:get请求的情况下,执行指定函数Login;其他HTTP method则按照RESTful规则
188      */
189     ns_1 := beego.NewNamespace("aaa", beego.NSRouter("/go", &controllers.MainController{}, "get:Login"))
190     // beego.AddNamespace(ns_1)
191
192     /**
193      * 域名如果不是:127.0.0.1,则不可以匹配 /bbb/go
194      * 仅仅匹配:/bbb/go
195      */
196     ns_2 := beego.NewNamespace("bbb",
197         beego.NSCond(func(ctx *context.Context) bool {
198             if ctx.Input.Domain() == "127.0.0.1" {
199                 return true
200             }
201             return false
202         }),
203         beego.NSRouter("/go", &controllers.MainController{}, "get:Login"),
204     )
205
206     ns_3 := beego.NewNamespace("ccc",
207         beego.NSRouter("/go", &controllers.MainController{}, "get:Login"),
208         // 条件判断,如果为真,则可以匹配上下文的路由,如果为假,则上下文的路由都不能匹配
209         beego.NSCond(func(ctx *context.Context) bool {
210             if ctx.Input.Domain() == "127.0.0.1" {
211                 return true
212             }
213             return false
214         }),
215         beego.NSRouter("php", &controllers.MainController{}),
216         beego.NSGet("java", func(ctx *context.Context) {
217             ctx.Output.Body([]byte("显示Get追加的内容"))
218         }),
219
220         // nasespace嵌套示例
221         beego.NSNamespace("room",
222             beego.NSCond(func(ctx *context.Context) bool {
223                 // 如果子namespace的判断条件为假,那么仅仅是子namespace的url不能匹配,不影响夫namespace的匹配结果
224                 if ctx.Input.Request.Method != "GET" {
225                     return true
226                 }
227                 return false
228             }),
229             beego.NSRouter("/shanghai", &controllers.MainController{}), // 匹配地址:/ccc/room/shanghai
230         ),
231     )
232
233     beego.AddNamespace(ns_1, ns_2, ns_3)
234 }

时间: 2024-10-08 22:09:10

beego框架之路由实践的相关文章

Beego 框架学习(一)

Beego官网本身已经整理的非常详细了,但是作为一个学习者,我还是决定自己好好整理一下,这样在后面使用的时候自己对每部分才能非常熟悉,即使忘记了,也可以迅速定位自己要用的知识在哪里.当然也是对官网的一个精简整理,同时结合一些例子,更好的理解和学习Beego Beego官网地址:https://beego.me 这次整理也是一个初步的整理,正好在这个之后把之前通过net/http实现的短url项目通过beego框架实现一遍 Beego的安装 go get github.com/astaxie/be

beego 框架基本使用 && 知识点整理

beego 官网的教程已经整理的非常详细了,但作为一个刚接触的学习者,还是有必要做一下整理,这样在后面使用的时候遇到了不太熟悉的地方,还能反过头来看下自己整理的内容,快速的把知识再捞回来,下面是对官网的一个精简整理,同时结合一些例子,更好的理解和使用 beego 这个框架去做一些 web 开发 beego 官网地址:https://beego.me beego 与 bee 的安装 //beego 框架 go get github.com/astaxie/beego //bee工具 go get

golang的beego框架开发时出现的问题纪录

golang的beego框架开发时出现的问题纪录1.数据库并发时问题:[ORM]2017/02/20 23:44:05 -[Queries/default] - [FAIL / db.Query / 15.9ms] - [SELECT mp_wx_account.app_id, mp_wx_account.app_secret FROM mp_wx_develop INNER JOIN mp_wx_account ON mp_wx_account.app_id = mp_wx_develop.a

Go beego框架使用笔记(一)

Beego介绍 beego我认为是go初学者比较容易上手的一门MVC Web框架.简单易懂,最重要的一点就是提供了中文文档,这对于我这种英语能力比较差的人来说就是福音. beego的官网上是这么介绍beego的:"beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API.Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计灵感来源于 tornado.sinatra 和 flask 这三个框架,但是结合了 Go 本身的一些特性(interface.st

atitit. 统计功能框架的最佳实践(1)---- on hibernate criteria

atitit. 统计功能框架的最佳实践(1)---- on hibernate criteria 1. 关键字 1 2. 统计功能框架普通有有些条件选项...一个日期选项..一个日期类型(日,周,月份,年等) 1 3. 元数据的位置,不需要绑定class 1 4. 设置聚合字段... @reduce(" sum(timLen) "),@reduce(" Avg(timLen) ") 2 5. 设置groupby  字段  @GroupBy 2 6. 设置groupb

beego框架之orm模块——sqlite

今天基于beego ORM演示sqlite3数据库时,遇到了一小问题. 问题现象1:下载go-sqlite3(go get github.com/mattn/go-sqlite3)驱动时报错说 gcc 不在 PATH 目录里. 问题现象2:运行导入了go-sqlite3驱动的文件时编译报错说 gcc 不在 PATH 目录里. 问题发生的原因:sqlitle3是个cgo库,需要gcd编译c代码. 问题的解决办法:安装tdm-gcc或Mingw.(备注:本人安装的是tdm-gcc,下载地址:http

开源调度框架Quartz最佳实践

开源调度框架Quartz最佳实践 Quartz是一个Java调度框架,当前的最新版本为2.2.1. 以Quartz 2.2.1版为例,Quartz最佳实践(用于生产系统)总结如下: 1.跳过更新检查Quartz内置了一个“更新检查”特性,因此Quartz项目每次启动后都会检查官网,Quartz是否存在新版本.这个检查是异步的,不影响Quartz项目本身的启动和初始化.可以在Quartz配置文件中,设置org.quartz.scheduler.skipUpdateCheck的属性为true来跳过更

beego框架之orm模块——PostgreSQL

beego框架默认支持三种数据库类型(MySQL,Sqlite,PostgreSQL).这三种数据库的配置虽然大同小异,但也有各自的差别.如今该总结下了. 以下是基于beego框架对PostgreSQL数据库进行操作. models/models.go 1 package models 2 3 import ( 4 "github.com/astaxie/beego/orm" 5 ) 6 7 type Student struct { 8 Id int64 9 Name string

beego框架之日志模块

参考beego开发文档:http://beego.me/docs/module/logs.md beego框架之日志模块默认支持4种记录方式: 1. 终端输出(console) :这种方式一般用在开发环境下面,方便调试. 2. 本地文件(file)       :这种方式一般用来保存常规日志,为生产环境中常用的方式. 3. 网络方式(network):这种方式可以用来将日志发送到指定服务器,一般可以用来根据日志触发事件等. 4. 发送邮件(email)   :这种方式一般是将生产环境下比较重要的