Beego之Beego快速入门

1、beego快速入门

1.1 新建项目

新建一个项目:

[root@zsx src]# bee new quickstart
2023/02/19 15:55:50.370 [D]  init global config instance failed. If you do not use this, just ignore it.  open conf/app.conf: no such file or directory
2023/02/19 15:55:50 INFO     ▶ 0001 Generate new project support go modules.
2023/02/19 15:55:50 INFO     ▶ 0002 Creating application...create   /home/zhangshixing/go_work_space/src/quickstart/go.modcreate   /home/zhangshixing/go_work_space/src/quickstart/create   /home/zhangshixing/go_work_space/src/quickstart/conf/create   /home/zhangshixing/go_work_space/src/quickstart/controllers/create   /home/zhangshixing/go_work_space/src/quickstart/models/create   /home/zhangshixing/go_work_space/src/quickstart/routers/create   /home/zhangshixing/go_work_space/src/quickstart/tests/create   /home/zhangshixing/go_work_space/src/quickstart/static/create   /home/zhangshixing/go_work_space/src/quickstart/static/js/create   /home/zhangshixing/go_work_space/src/quickstart/static/css/create   /home/zhangshixing/go_work_space/src/quickstart/static/img/create   /home/zhangshixing/go_work_space/src/quickstart/views/create   /home/zhangshixing/go_work_space/src/quickstart/conf/app.confcreate   /home/zhangshixing/go_work_space/src/quickstart/controllers/default.gocreate   /home/zhangshixing/go_work_space/src/quickstart/views/index.tplcreate   /home/zhangshixing/go_work_space/src/quickstart/routers/router.gocreate   /home/zhangshixing/go_work_space/src/quickstart/tests/default_test.gocreate   /home/zhangshixing/go_work_space/src/quickstart/main.go
2023/02/19 15:55:50 SUCCESS  ▶ 0003 New application successfully created!

启动项目:

[root@zsx src]# cd quickstart/
[root@zsx quickstart]# go mod tidy
[root@zsx quickstart]# bee run
______
| ___ \
| |_/ /  ___   ___
| ___ \ / _ \ / _ \
| |_/ /|  __/|  __/
\____/  \___| \___| v2.0.4
2023/02/19 15:56:46 INFO     ▶ 0001 Using 'quickstart' as 'appname'
2023/02/19 15:56:46 INFO     ▶ 0002 Initializing watcher...
quickstart/controllers
quickstart/routers
quickstart
2023/02/19 15:56:49 SUCCESS  ▶ 0003 Built Successfully!
2023/02/19 15:56:49 INFO     ▶ 0004 Restarting 'quickstart'...
2023/02/19 15:56:49 SUCCESS  ▶ 0005 './quickstart' is running...
2023/02/19 15:56:49.917 [I] [parser.go:413]  generate router from comments
2023/02/19 15:56:49.917 [I] [server.go:241]  http server Running on http://:8080

1.2 项目路由设置

前面我们已经创建了beego项目,而且我们也看到它已经运行起来了,那么是如何运行起来的呢?让我们从入口文

quickstart/main.go先分析起来吧:

package mainimport (_ "quickstart/routers"beego "github.com/beego/beego/v2/server/web"
)func main() {beego.Run()
}

我们看到 main 函数是入口函数,但是我们知道 Go 的执行过程是如下图所示的方式:

在这里插入图片描述

这里我们就看到了我们引入了一个包_ "quickstart/routers",这个包只引入执行了里面的init函数,那么让

我们看看这个里面做了什么事情:

package routersimport ("quickstart/controllers"beego "github.com/beego/beego/v2/server/web"
)func init() {beego.Router("/", &controllers.MainController{})
}

路由包里面我们看到执行了路由注册 beego.Router,这个函数的功能是映射 URL 到 controller,第一个参数是

URL (用户请求的地址),这里我们注册的是 /,也就是我们访问的不带任何参数的 URL,第二个参数是对应的

Controller,也就是我们即将把请求分发到那个控制器来执行相应的逻辑,我们可以执行类似的方式注册如下路

由:

beego.Router("/user", &controllers.UserController{})

这样用户就可以通过访问 /user 去执行 UserController 的逻辑。这就是我们所谓的路由,更多更复杂的路由

规则请查询后面的web的路由设置。

再回来看看 main 函数里面的 beego.Runbeego.Run 执行之后,我们看到的效果好像只是监听服务端口这个

过程,但是它内部做了很多事情:

  • 解析配置文件

    beego会自动解析在 conf 目录下面的配置文件 app.conf,通过修改配置文件相关的属性,我们可以定义:

    开启的端口,是否开启 session,应用名称等信息。

  • 执行用户的 hookfunc

    beego会执行用户注册的 hookfunc,默认的已经存在了注册 mime,用户可以通过函数 AddAPPStartHook

    注册自己的启动函数。

  • 是否开启 session

    会根据上面配置文件的分析之后判断是否开启 session,如果开启的话就初始化全局的 session。

  • 是否编译模板

    beego 会在启动的时候根据配置把 views 目录下的所有模板进行预编译,然后存在 map 里面,这样可以有效

    的提高模板运行的效率,无需进行多次编译。

  • 是否开启文档功能

    根据 EnableDocs 配置判断是否开启内置的文档路由功能

  • 是否启动管理模块

    beego 目前做了一个很酷的模块,应用内监控模块,会在 8088 端口做一个内部监听,我们可以通过这个端口

    查询到 QPS、CPU、内存、GC、goroutine、thread 等统计信息。

  • 监听服务端口

    这是最后一步也就是我们看到的访问 8080 看到的网页端口,内部其实调用了 ListenAndServe,充分利用了

    goroutine 的优势。

一旦 run 起来之后,我们的服务就监听在两个端口了,一个服务端口 8080 作为对外服务,另一个 8088 端口实行

对内监控。

通过这个代码的分析我们了解了 beego 运行起来的过程,以及内部的一些机制。接下来让我们去剥离 Controller

如何来处理逻辑的。

1.3 controller 逻辑

前面我们了解了如何把用户的请求分发到控制器,这小节我们就介绍大家如何来写控制器,首先我们还是从源码分

析入手quickstart/controllers/default.go

package controllersimport (beego "github.com/beego/beego/v2/server/web"
)type MainController struct {beego.Controller
}func (c *MainController) Get() {c.Data["Website"] = "beego.me"c.Data["Email"] = "astaxie@gmail.com"c.TplName = "index.tpl"
}

上面的代码显示首先我们声明了一个控制器 MainController,这个控制器里面组合了 web.Controller,这就

是 Go 的组合方式,也就是 MainController 自动拥有了所有 web.Controller 的方法。

web.Controller 拥有很多方法,其中包括 InitPreparePostGetDeleteHead 等方法。我们

可以通过重写的方式来实现这些方法,而我们上面的代码就是重写了 Get 方法。

我们先前介绍过 beego 是一个 RESTful 的框架,所以我们的请求默认是执行对应 req.Method 的方法。例如浏览

器的是 GET 请求,那么默认就会执行 MainController 下的 Get 方法。这样我们上面的 Get 方法就会被执行

到,这样就进入了我们的逻辑处理。(用户可以改变这个行为,通过注册自定义的函数名,更加详细的请参考路由

设置)。

里面的代码是需要执行的逻辑,这里只是简单的输出数据,我们可以通过各种方式获取数据然后赋值到 c.Data

中,这是一个用来存储输出数据的 map,可以赋值任意类型的值,这里我们只是简单举例输出两个字符串。

最后一个就是需要去渲染的模板,c.TplName 就是需要渲染的模板,这里指定了 index.tpl,如果用户不设置

该参数,那么默认会去到模板目录的 controller/<方法名>.tpl 查找,文件和文件夹必须小写,例如上面的方法

会去查找 maincontroller/get.tpl

用户设置了模板之后系统会自动的调用 Render 函数(这个函数是在 web.Controller 中实现的),所以无需用

户自己来调用渲染。

当然也可以不使用模版,直接用 c.Ctx.WriteString 输出字符串,如:

func (c *MainController) Get() {c.Ctx.WriteString("hello")
}

至此我们的控制器分析基本完成了,接下来让我们看看如何来编写 model。

1.4 model 分析

我们知道 Web 应用中我们用的最多的就是数据库操作,而 model 层一般用来做这些操作,我们的 bee new 例子

不存在 Model 的演示,但是 bee api 应用中存在 model 的应用。说的简单一点,如果您的应用足够简单,那么

Controller 可以处理一切的逻辑,如果您的逻辑里面存在着可以复用的东西,那么就抽取出来变成一个模块。因此

Model 就是逐步抽象的过程,一般我们会在 Model 里面处理一些数据读取,如下是一个日志分析应用中的代码片

段:

package models
import ("path/filepath""strings"
)
var (NotPV []string = []string{"css", "js", "class", "gif", "jpg", "jpeg", "png", "bmp", "ico", "rss", "xml", "swf"}
)
const big = 0xFFFFFF
func LogPV(urls string) bool {ext := filepath.Ext(urls)if ext == "" {return true}for _, v := range NotPV {if v == strings.ToLower(ext) {return false}}return true
}

所以如果您的应用足够简单,那么就不需要 Model 了;如果你的模块开始多了,需要复用,需要逻辑分离了,那

么 Model 是必不可少的。接下来我们将分析如何编写 View 层的东西。

1.5 View 编写

在前面编写 Controller 的时候,我们在 Get 里面写过这样的语句 c.TplName = "index.tpl",设置显示的模板

文件,默认支持 tplhtml 的后缀名,如果想设置其他后缀你可以调用 beego.AddTemplateExt 接口设置,

那么模板如何来显示相应的数据呢?beego 采用了 Go 语言默认的模板引擎,所以和 Go 的模板语法一样。

我们看看快速入门里面的代码(去掉了 css 样式):

<!DOCTYPE html><html>
<head><title>Beego</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><style type="text/css"></style>
</head><body><header><h1 class="logo">Welcome to Beego</h1><div class="description">Beego is a simple & powerful Go web framework which is inspired by tornado and sinatra.</div></header><footer><div class="author">Official website:<a href="http://{{.Website}}">{{.Website}}</a> /Contact me:<a class="email" href="mailto:{{.Email}}">{{.Email}}</a></div></footer><div class="backdrop"></div><script src="/static/js/reload.min.js"></script>
</body>
</html>

我们在 Controller 里面把数据赋值给了 data(map 类型),然后我们在模板中就直接通过 key 访问 .Website

.Email 。这样就做到了数据的输出,接下来我们讲解如何让静态文件输出。

1.6 静态文件处理

前面我们介绍了如何输出静态页面,但是我们的网页往往包含了很多的静态文件,包括图片、JS、CSS 等,刚才创

建的应用里面就创建了如下目录:

[root@zsx quickstart]# tree static/
static/
├── css
├── img
└── js└── reload.min.js3 directories, 1 file

beego 默认注册了 static 目录为静态处理的目录,注册样式:URL 前缀和映射的目录(在/main.go文件中

beego.Run()之前加入):

StaticDir["/static"] = "static"

用户可以设置多个静态文件处理目录,例如你有多个文件下载目录 download1、download2,你可以这样映射

(在 /main.go 文件中 beego.Run() 之前加入):

beego.SetStaticPath("/download1", "download1")
beego.SetStaticPath("/download2", "download2")

这样用户访问 URL http://localhost:8080/download1/1.txt 则会请求 download1 目录下的 1.txt 文件。

[root@zsx quickstart]# curl http://localhost:8080/download1/1.txt
1
[root@zsx quickstart]# curl http://localhost:8080/download2/2.txt
2

比较好的选择是将上述的操作放在quickstart/routers/router.go

package routersimport ("quickstart/controllers"beego "github.com/beego/beego/v2/server/web"
)func init() {beego.SetStaticPath("/download1", "download1")beego.SetStaticPath("/download2", "download2")beego.Router("/", &controllers.MainController{})
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/636289.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

接口自动化框架搭建-写在前面

从今天开始&#xff0c;我将带领大家一起学习接口自动化框架的搭建&#xff0c;在学习之前&#xff0c;我们先了解搭建一个接口自动化框架需要具备哪些知识&#xff0c;应该做哪些准备工作 测试开发工程师的入门条件 近几年比较流行测试开发岗位&#xff0c;很多小伙伴都不知…

消息队列介绍

什么是 MQ MQ(message queue)&#xff0c;本质是个队列&#xff0c;FIFO 先入先出&#xff0c;只不过队列中存放的内容是 message 而已&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递消息。在互联网架构中&#xff0c;MQ 是一种非常常 见的上下游“逻辑解耦…

SpringBoot 项目中后端实现跨域的5种方式!!!

文章目录 SpringBoot 项目中后端实现跨域的5种方式&#xff01;&#xff01;&#xff01;一、为什么会出现跨域问题二、什么是跨域三、非同源限制四、Java后端 实现 CORS 跨域请求的方式1、返回新的 CorsFilter(全局跨域)2、重写 WebMvcConfigurer(全局跨域)3、使用注解 (局部跨…

实战纪实 | 某配送平台zabbix 未授权访问 + 弱口令

本文由掌控安全学院 - 17828147368 投稿 找到一个某src的子站&#xff0c;通过信息收集插件wappalyzer&#xff0c;发现ZABBIX-监控系统&#xff1a; 使用谷歌搜索历史漏洞&#xff1a;zabbix漏洞 通过目录扫描扫描到后台&#xff0c;谷歌搜索一下有没有默认弱口令 成功进去了…

LeetCode:206. 反转链表

力扣链接 算法思想&#xff1a;由于单链表是单向的&#xff0c;想要对当前元素进行操作&#xff0c;需找到前一个元素。本题利用双指针&#xff0c;初始pre指针指向NULL&#xff0c;cur指针指向head.再对局部翻转之前&#xff0c;先把下一个结点存到temp指针中。当进行完如下代…

构建中国人自己的私人GPT

创作不易&#xff0c;请大家多鼓励支持。 在现实生活中&#xff0c;很多人的资料是不愿意公布在互联网上的&#xff0c;但是我们又要使用人工智能的能力帮我们处理文件、做决策、执行命令那怎么办呢&#xff1f;于是我们构建自己或公司的私人GPT变得非常重要。 先看效果 他的…

YOLOv8全网首发:新一代高效可形变卷积DCNv4如何做二次创新?高效结合SPPF

💡💡💡本文独家改进:DCNv4更快收敛、更高速度、更高性能,与YOLOv8 SPPF高效结合 收录 YOLOv8原创自研 https://blog.csdn.net/m0_63774211/category_12511737.html?spm=1001.2014.3001.5482 💡💡💡全网独家首发创新(原创),适合paper !!! 💡💡💡…

视频水平翻转,开启创意之旅

想象一下&#xff0c;一段普通的视频在瞬间被水平翻转&#xff0c;画面中的一切仿佛被镜子所反射&#xff0c;给人一种惊艳而又奇妙的感受。在这个充满无限可能的数字时代&#xff0c;我们不应被传统的视觉效果所束缚&#xff0c;尝试运用水平翻转技术&#xff0c;为你的作品注…

pytest文档内置fixture的request详情

前言 request 是 pytest 的内置 fixture &#xff0c; "为请求对象提供对请求测试上下文的访问权&#xff0c;并且在fixture被间接参数化的情况下具有可选的“param”属性。"这是官方文档对request的描述&#xff0c;可参考的文档不多。 一、FixtureRequest Fixtur…

Spring Bean 生命周期的执行流程?

一、问题解析 Spring 生命周期全过程大致分为五个阶段&#xff1a;创建前准备阶段、创建实例阶段、依赖注入阶段、容器缓存阶段和销毁实例阶段。 这张是 Spring Bean 生命周期完整流程图&#xff0c;其中对每个阶段的具体操作做了详细介绍&#xff1a; &#xff08;把这张图按…

【Linux】Linux进程间通信(四)

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【Linux】…

Lua 快速入门 · 教程笔记

Lua语言快速入门 教程笔记 前言1. Lua 语言介绍2. Lua 语言基础之基本语法声明变量声明方法使用 if - else使用 for使用 while 3. Lua 语言基础之表4. Lua 语言基础之数组插入元素移除元素获取表的长度全局表 5. Lua 语言面向对象之复制表的方式面向对象实现继承和重写父类方法…

Prompt高级技巧:Few-Shots、COT、SC、TOT、Step-Back

CRISPE框架 如图所示。所谓CRISPE框架&#xff0c;指的是&#xff1a; CR&#xff1a;Capacity and Role&#xff08;能力与角色&#xff09;。你希望 ChatGPT 扮演怎样的角色。I&#xff1a;Insight&#xff08;洞察&#xff09;&#xff0c;背景信息和上下文。S:&#xff08…

递归、搜索与回溯算法(专题二:深搜)

往期文章&#xff08;希望小伙伴们在看这篇文章之前&#xff0c;看一下往期文章&#xff09; &#xff08;1&#xff09;递归、搜索与回溯算法&#xff08;专题零&#xff1a;解释回溯算法中涉及到的名词&#xff09;【回溯算法入门必看】-CSDN博客 &#xff08;2&#xff09…

实验七 RMAN恢复管理器

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

利用appium自动控制移动设备并提取数据

安装appium-python-client模块并启动已安装好的环境 安装appium-python-client模块 在window的虚拟环境下执行pip install appium-python-client 启动夜神模拟器&#xff0c;进入夜神模拟器所在的安装路径的bin目录下&#xff0c;进入cmd终端&#xff0c;使用adb命令建立adb…

Kubernetes (十五) 认证与授权

一. 访问控制 二.UserAccount与serviceaccount区别 将认证信息添加…

关闭Windows自动更新的6种方法

关闭Windows自动更新的6种方法&#xff01; 方法一&#xff1a;通过Windows设置关闭Windows自动更新 步骤1. 按WinI打开Windows设置页面。步骤2. 单击“更新和安全”>“Windows更新”&#xff0c;然后在右侧详情页中选择“暂停更新7天”选项即可在此后7天内关闭Windows更新…

【Linux】相关背景及环境搭建

前言&#xff1a; 认识 Linux, 了解 Linux 的相关背景&#xff0c;学会如何使用云服务器&#xff0c;掌握使用远程终端工具 xshell 登陆 Linux 服务器 文章目录 一、Linux介绍1.1 关于UNIX1.2 Linux的诞生及发展历程1.3 Linux开源1.4 Linux在各个行业的现状1.5 发行版本 二、Li…

LeetCode 热题 100 | 双指针(上)

目录 1 283. 移动零 2 11. 盛最多水的容器 3 15. 三数之和 菜鸟做题第一周&#xff0c;语言是 C 1 283. 移动零 解题思路&#xff1a; 两个指针一前一后遍历数组前者永远指向 0&#xff0c;后者永远在寻找非 0 数的路上后者找到一个非 0 数就和前者进行一个数值交换 …