技术资讯

使用 beego 搭建 web 应用之一

TIME:2019-11-17

介绍

你是一个从PHP,Python,Ruby等动态语言转移到Go的web应用开发人员吗?想知道怎样使用Go开发基于web的应用程序吗?你想要知道怎样使用类似于已知的框架的方式进行开发,在那儿你能重复的利用已知的知识?

如果是这样,那么你可能已经做了一些搜索,无论是在谷歌,StackOverflow的或其他网站,以寻求一个框架来帮助你;你可能已经看到了有许多可能的选择,包括Beego,Martini和Gorilla,另外还有net/http包。

这四个当中,我尝试的最多的就是Beego。我认为,它的功能十分的丰富,但是不太复杂,因此上手是相对较快的。

地狱星星
地狱星星
翻译于 3 个月 前

0人顶

 翻译的不错哦!

Beego不是一般的web开发包。它构建在大量已存在的Go之上,提供了许多的功能,以下是提供的功能:

  • 一个完整的ORM

  • 缓存

  • 支持session

  • 国际化(i18n)

  • 实时监测和重载

  • 发布支持

但是同时在Beego和以前提到的动态语言的框架也有一些相似性。他们之间有足够的差异,在成为真正的生产力和精通之前需要投入一些时间。

此外,虽然Beego的文档是比较全面的,我还是感觉到它的文档在某些地方有所缺失,因为我写了这两个部分的系列文章帮助克服这个问题并帮助你学习Beego的基础。

地狱星星
地狱星星
翻译于 3 个月 前

0人顶

 翻译的不错哦!

在这个系列中,你将会了解到它是一个多么出色的框架以及它是多么的为我们这些开发者着想。具体到部分一中,我们将会包含以下内容:

  • 安装Beego以及命令行工具Bee

  • 创建一个项目Creating a project

  • 动作(Actions)

  • 视图于模板(Views / Templates)

  • 路由

  • 请求参数(Request Parameters)

如果你想要阅读这个系列的全部的源码,你可以在Github中查看。你可以随意的在线浏览或者克隆到本地并且拿它做实验。让我们开始吧!

在我们开始之前,确保你已经将GO语言环境配置好了。如果没有,或者你不明白我在说什么,先去看一下 Getting Started with Go 或者 this post from Bill Kennedy,然后再回来继续。

中奖啦
中奖啦
翻译于 3 个月 前

0人顶

 翻译的不错哦!

1. 安装 Beego

Ok,让我们从安装Beego开始。像其他一些框架和工具包(toolkit)一样,通过使用bee命令行工具来创建项目框架,Bee可以完成一些工作:

  • 创建一个新的应用程序

  • 运行一个应用程序

  • 测试一个应用程序

  • 创建路由以及其他

Bee并不是运行Beego应用的唯一一个方法,但是我在这两部分的系列教程中将着重讲它的使用。你可以通过运行go get github.com/beego/bee来安装它。

2. 创建核心项目

安装完之后,在你的$GOPATH所在的目录中运行下面的命令,将会生成一个项目的框架结构,我们将其命名为sitepointgoapp

bee new sitepointgoapp

这将会输出类似于下面的内容:

[INFO] Creating application...
/Users/matthewsetter/Documents/workspace/Golang/src/sitepointgoapp/
/Users/matthewsetter/Documents/workspace/Golang/src/sitepointgoapp/conf/
/Users/matthewsetter/Documents/workspace/Golang/src/sitepointgoapp/controllers/
/Users/matthewsetter/Documents/workspace/Golang/src/sitepointgoapp/models/
/Users/matthewsetter/Documents/workspace/Golang/src/sitepointgoapp/routers/
/Users/matthewsetter/Documents/workspace/Golang/src/sitepointgoapp/tests/
/Users/matthewsetter/Documents/workspace/Golang/src/sitepointgoapp/static/
/Users/matthewsetter/Documents/workspace/Golang/src/sitepointgoapp/static/js/
/Users/matthewsetter/Documents/workspace/Golang/src/sitepointgoapp/static/css/
/Users/matthewsetter/Documents/workspace/Golang/src/sitepointgoapp/static/img/
/Users/matthewsetter/Documents/workspace/Golang/src/sitepointgoapp/views/
/Users/matthewsetter/Documents/workspace/Golang/src/sitepointgoapp/conf/app.conf
/Users/matthewsetter/Documents/workspace/Golang/src/sitepointgoapp/controllers/default.go
/Users/matthewsetter/Documents/workspace/Golang/src/sitepointgoapp/views/index.tpl
/Users/matthewsetter/Documents/workspace/Golang/src/sitepointgoapp/routers/router.go
/Users/matthewsetter/Documents/workspace/Golang/src/sitepointgoapp/tests/default_test.go
/Users/matthewsetter/Documents/workspace/Golang/src/sitepointgoapp/main.go
14-05-14 06:02:59 [SUCC] New application successfully created!

现在,你将看到下面的文件目录结构:

sitepointgoapp    
    ├── conf   
|   └── app.conf
├── controllers
|    └── default.go
├── main.go
├── models
├── routers   
|    └── router.go
├── static
│   ├── css
│   ├── img
│   └── js
├── tests
│   └── default_test.go
└── views    
    └── index.tpl

观察一下这些文件,我们有:

  • 主文件main.go

  • 主要配置文件conf/app.conf

  • 一个默认的控制器controllers/default.go

  • 一个默认的测试集合tests/default_test.go

  • 一个默认的视图模板views/index.tpl

OK,最基本的程序以及准备好了,让我们运行一下它。在项目目录$GOPATH/src/sitepointgoapp/下,运行下面的命令:

bee run

这将会加载我们的新程序。除此之外,bee还监控源文件的改动。如果检测到改动,bee将会自动的重新加载应用程序。运行完上面的命令之后,你应该会看到类似于下面的输出信息:

14-05-05 11:34:17 [INFO] Start building...
14-05-05 11:34:20 [SUCC] Build was successful
14-05-05 11:34:20 [INFO] Restarting sitepointgoapp ...
14-05-05 11:34:20 [INFO] ./sitepointgoapp is running...
2014/05/05 11:34:20 [I] Running on :8080

你可以看到应用程序已经在8080端口上运行了。在浏览器中访问http://localhost:8080/将会显示下面的输出:

Beego App Home Page

这并没有什么特别的地方,但是它的确可以正常工作了。那么,让我们动手修改扩展一下默认的控制器,添加一个新的action,以及一些自定义的路由。

中奖啦
中奖啦
翻译于 3 个月 前

0人顶

 翻译的不错哦!

3. 添加一个新的action

打开controllers/default.go,你可以看到一个非常简单的控制器。这是因为所有的显示逻辑被放在了视图模板中。让我们稍微修改一下这个控制器,看看如何添加视图模板变量以及如何指定一个模板文件。在default.go中,添加如下方法:

func (main *MainController) HelloSitepoint() {
    main.Data["Website"] = "My Website"
    main.Data["Email"] = "your.email.address@example.com"
    main.Data["EmailName"] = "Your Name"
    main.TplNames = "default/hello-sitepoint.tpl"
}

然我们看一下每一步的作用。我们所做的是给当前的控制器添加了一个新的方法(或action)Get,通过将main *MainController指定为这个方法的接收器。

紧接着,我们初始化了三个模板变量,WebsiteEmail 和 EmailName,把它们保存在Controller的一个叫Data的字段里面,该字段是一个map用来表示模板变量和值。

之后,我将this.TplNames的值设置为default/hello-sitepoint.tpl来指定模板文件的名称。默认情况下,Beego会在views文件夹下查找指定的文件。

因此,当这个路由起作用的时候,Beego将会填充views/default/hello-sitepoint.tpl模板,并渲染它。

中奖啦
中奖啦
翻译于 3 个月 前

0人顶

 翻译的不错哦!

视图

好了,让我们创建和它对应的视图。在views文件夹下,创建一个新的文件夹default,然后在其中创建一个名为hello-sitepoint.tpl的新文件,将下面的代码写在里面:

<header class="hero-unit">
    <div class="container">
        <div class="row">
            <div class="hero-text">
                <h1>Welcome to the Sitepoint / Beego App!</h1>
                <h2>This is My Test Version</h2>
                <p>{{.Website}} {{.Email}} {{.EmailName}}</p>
            </div>
        </div>
    </div>
</header>

如果这是你第一次在Go中使用模板,要知道一点,Beego的模板层继承自 Go 的 html/template package。想了解更多在模板中使用变量的例子,请参考text/template包中的例子

和大多数Go的包一样,html/template的功能很多,所以我在这里介绍几个相关的功能。所有的模板变量都属于全局的上下文,可以通过点操作符来访问,通过{{}}语法来嵌入。

所以,想要访问我们在之前在controller的action中定义的那山歌模板变量,可以使用{{.Website}},{{.Email}}, 和 {{.EmailName}}。

中奖啦
中奖啦
翻译于 3 个月 前

0人顶

 翻译的不错哦!

路由

Ok,我们现在有了一个新的action和对应的视图。但是我们还不能进行路由。如果我们像访问默认action之外的任何东西都会得到一个404错误页面,如下面这个截图所示。

Beego 404 Page

所以,我们需要给它添加一个路由。在routers/router.go 中,将init方法改为下面这样:

func init() {
    beego.Router("/", &controllers.MainController{})
    beego.Router("/hello-world", &controllers.MainController{}, "get:HelloSitepoint")
}

注意最后一行,它所做的事是当我们尝试去访问/hello-world的时候,它会调用MainController中的HelloSitepoint action。保存并等一小下以便完成重新编译,之后在浏览器中打开http://localhost:8080/hello-world。如果所有的都没有问题的话,会显示出下面的页面:

Beego Hello World Route

中奖啦
中奖啦
翻译于 3 个月 前

0人顶

 翻译的不错哦!

请求参数

到目前为止,我们对这个简单的action所做的都没有问题。但是,在一个真实的程序中,我们要和请求交互,检查query string 和 POST的数据,之后做出相应的反应。那么,我们怎么在Beego中访问这些信息呢?

我们先从在query string中取出数据开始。Beego中另一个已经预定义好的值是Context Module,它包含了输入的值,封装了一个请求。

它为我们提供了以下可以访问的内容:

  • 方法

  • 协议

  • user agent

  • query (Get and Post data)

  • session 信息以及更多

让我们将这个程序变得更有趣一些,我们修改路由让它需要传入一个id的值,我们可以在action中取出改值,并将其输出。在router.go中,将/get路由修改为下面这样:

beego.Router("/hello-world/:id([0-9]+)", &controllhers.MainController{}, "get:HelloSitepoint")

现在,我们需要提供一个全部为数字的GET的值,因为我们在路由的正则中使用了([0-9]+)。保存它,并且尝试再次加载不带id的/hello-world。你有没有看到错误出现?

现在,将它改为/hello-world/213,就应该可以正常工作了。既然它没问题了,让我们保存请求信息。在Get方法中,this.TplNames之前添加下面的内容:

this.Data["Id"] = this.Ctx.Input.Param(":id")

之后,在hello-world.tpl 将{{.Id}}添加到现有的模板变量的下面。重新加载页面将会在Email Name的下面显示出213

中奖啦
中奖啦
翻译于 3 个月 前

0人顶

 翻译的不错哦!

其它翻译版本(1)

通过方法类型限制Action

Ok,今天的任务差不多完成了,但在离开前我希望介绍最后一个东西。通常,你希望将某个action的访问限制到一个或多个特定的方法。例如,你只希望通过POST请求访问一个删除路由;你只希望通过GET请求显示搜索结果。

Beego简化了通过所有方法类型的action访问,或将某个action的访问限制到一个或几个方法类型。也是在router.go中,将/hello-world路由做如下改变:

beego.Router("/hello-world/:id([0-9]+)", &controllers.中MainController{}, "get,post:Get")

这样可以允许GET或POST请求分发到/hello-world/。试使用curl进行PUT或DELETE访问,使用如下的示例并查看结果

# PUT request
curl -X PUT http://localhost:8080/hello-world/213

# DELETE request
curl -X DELETE http://localhost:8080/hello-world/213

上一篇

大牛手把手教你区块链项目开发

下一篇

区块链开发主流编程语言居然是Go语言详解以及GO语言的web应用开发