• 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 }
    View Code
  • 相关阅读:
    Django 登录页面重定向
    python 调试命令
    错误
    错误
    图算法之图的创建
    Git 常用命令详解(三)
    Git 常用命令详解(二)
    如何提问
    项目常用jquery/easyui函数小结
    我是怎么发现并解决项目页面渲染效率问题的(IE调试工具探查器的使用)
  • 原文地址:https://www.cnblogs.com/hezhixiong/p/4602671.html
Copyright © 2020-2023  润新知