Beego之Beego MVC架构介绍

1、beego MVC架构介绍

beego 是一个典型的 MVC 框架,它的整个执行逻辑如下图所示:

在这里插入图片描述

通过文字来描述如下:

1、在监听的端口接收数据,默认监听在 8080 端口。

2、用户请求到达 8080 端口之后进入 beego 的处理逻辑。

3、初始化 Context 对象,根据请求判断是否为 WebSocket 请求,如果是的话设置 Input,同时判断请求的方法

是否在标准请求方法中(GET、POST、PUT、DELETE、PATCH、OPTIONS、HEAD),防止用户的恶意伪造请求

攻击造成不必要的影响。

4、执行 BeforeRouter 过滤器,当然在 beego 里面有开关设置。如果用户设置了过滤器,那么该开关打开,这样

可以提高在没有开启过滤器的情况下提高执行效率。如果在执行过滤器过程中,responseWriter 已经有数据输出

了,那么就提前结束该请求,直接跳转到监控判断。

5、开始执行静态文件的处理,查看用户的请求 URL 是否和注册在静态文件处理 StaticDir 中的 prefix 是否匹配。

如果匹配的话,采用 http 包中默认的 ServeFile 来处理静态文件。

6、如果不是静态文件开始初始化 session 模块(如果开启 session 的话),这个里面大家需要注意,如果你的

BeforeRouter 过滤器用到了 session 就会报错,你应该把它加入到 AfterStatic 过滤器中。

7、开始执行 AfterStatic 过滤器,如果在执行过滤器过程中,responseWriter 已经有数据输出了,那么就提前结

束该请求,直接跳转到监控判断。

8、执行过过滤器之后,开始从固定的路由规则中查找和请求 URL 相匹配的对象。这个匹配是全匹配规则,即如果

用户请求的 URL 是 /hello/world,那么固定规则中 /hello 是不会匹配的,只有完全匹配才算匹配。如果匹配

的话就进入逻辑执行,如果不匹配进入下一环节的正则匹配。

9、正则匹配是进行正则的全匹配,这个正则是按照用户添加 beego 路由顺序来进行匹配的,也就是说,如果你在

添加路由的时候你的顺序影响你的匹配。和固定匹配一样,如果匹配的话就进行逻辑执行,如果不匹配进入 Auto

匹配。

10、如果用户注册了 AutoRouter,那么会通过 controller/method 这样的方式去查找对应的 Controller 和他

内置的方法,如果找到就开始执行逻辑,如果找不到就跳转到监控判断。

11、如果找到 Controller 的话,那么就开始执行逻辑,首先执行 BeforeExec 过滤器,如果在执行过滤器过程

中,responseWriter 已经有数据输出了,那么就提前结束该请求,直接跳转到监控判断。

12、Controller 开始执行 Init 函数,初始化基本的一些信息,这个函数一般都是 beego.Controller 的初始化,不

建议用户继承的时候修改该函数。

13、是否开启了 XSRF,开启的话就调用 Controller 的 XsrfToken,然后如果是 POST 请求就调用

CheckXsrfCookie 方法。

14、继续执行 Controller 的 Prepare 函数,这个函数一般是预留给用户的,用来做 Controller 里面的一些参数初

始化之类的工作。如果在初始化中 responseWriter 有输出,那么就直接进入 Finish 函数逻辑。

15、如果没有输出的话,那么根据用户注册的方法执行相应的逻辑,如果用户没有注册,那么就调用

http.Method 对应的方法(Get/Post 等)。执行相应的逻辑,例如数据读取,数据赋值,模板显示之类的,或者

直接输出 JSON 或者 XML。

16、如果 responseWriter 没有输出,那么就调用 Render 函数进行模板输出。

17、执行 Controller 的 Finish 函数,这个函数是预留给用户用来重写的,用于释放一些资源。释放在 Init 中初始

化的信息数据。

18、执行 AfterExec 过滤器,如果有输出的话就跳转到监控判断逻辑。

19、执行 Controller 的 Destructor,用于释放 Init 中初始化的一些数据。

20、如果这一路执行下来都没有找到路由,那么会调用 404 显示找不到该页面。

21、最后所有的逻辑都汇聚到了监控判断,如果用户开启了监控模块(默认是开启一个 8088 端口用于进程内监

控),这样就会把访问的请求链接扔给监控程序去记录当前访问的 QPS,对应的链接访问的执行时间,请求链接

等。

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

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

相关文章

智能风控体系之层次分析法专家评分卡

层次分析法 (Analytic Hierarchy Process,简称 AHP) 由美国运筹学家托马斯 塞蒂 (T. L. Saaty) 于上世纪70年代中期提出,是通过定量与定性分析相结合的方法来进行多方案或多目标决策分析的一种方法。该方法的主要思想是通过将一个复杂的问题分解为若干层…

【数据库学习】pg安装与运维

1,安装与配置 #安装 yum install https:....rpm1)安装目录 bin目录:二进制可执行文件目录,此目录下有postgres、psql等可执行程序;pg_ctl工具在此目录,可以通过pg_ctl --help查看具体使用。 conf目录&…

Nginx日志检测分析工具 - WGCLOUD

WGCLOUD可以对Nginx的日志文件进行全面分析,包括IP、sql注入攻击、搜索引擎蜘蛛爬取记录、HTTP响应状态码、访问量最高的IP统计、扫描攻击统计等 效果如下图

C#winform上位机开发学习笔记13-串口助手显示系统时间功能添加

1.功能描述 在上位机中显示系统的实时时间 2.代码部分 步骤1:添加文本框控件并设置参数 #此处注意将BackColor颜色修改为非Control,即可正常显示ForeColor颜色,否则该颜色不变,原因暂且不明。 步骤2:添加timer控件…

Linux/Doctor

Enumeration nmap 已知目标开放了22,80,8089端口,扫描详细情况如下 可以看到对外开放了22,80,8089三个端口 TCP/80 SSTI 访问80端口,有一个infodoctors.htb的电子邮件,点击其他的也没有什么反应,猜测有可能需要域名访问 在/et…

[每日一题] 01.25 - 子数整数

子数整数 k int(input()) flag False for i in range(10000,30001):a,b,c [int(str(i)[j:j 3]) for j in range(3)]if a % k 0 and b % k 0 and c % k 0:print(i)flag Trueif not flag:print(No)

Python批量采集亚马逊商品数据

嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 知识点: 爬虫基本流程 非结构化数据解析 开发环境: python 3.8 解释器, 运行代码 pycharm 随便 配置 python解释器 DrissionPage >>> p…

前出深入-机器学习

文章目录 一、K近邻算法1.1 先画一个散列图1.2 使用K最近算法建模拟合数据1.3 进行预测1.4 K最近邻算法处理多元分类问题1.5 K最近邻算法用于回归分析1.6 K最近邻算法项目实战-酒的分类1.6.1 对数据进行分析1.6.2 生成训练数据集和测试数据集1.6.3 使用K最近邻算法对数据进行建…

阿里云服务器部署幻兽帕鲁联机服务器详细教程

幻兽帕鲁是一款备受欢迎的多人在线游戏,其联机服务器对于游戏的稳定运行至关重要。本文将详细介绍如何在阿里云服务器上部署幻兽帕鲁联机服务器,新手小白也能轻松搭建并管理自己的游戏环境。 还未购买阿里云服务器可以参照下面的步骤部署,已经…

Vue+OpenLayers7入门到实战:在地图上添加缩放控件、比例尺控件和鼠标经纬度位置显示控件

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 本章主要介绍如何使用OpenLayers7在地图上添加地图缩放控件,比例尺显示控件和鼠标经纬度位置展示控件这三个Control控件。 二、依赖和使用 "ol": "7.5.2"使用npm安装依赖npm install ol@7.5.…

【SpringBoot】mybatis基础操作

mybatis入门 1.mybatis准备操作 创建数据库: CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4; -- 使⽤数据数据 USE mybatis_test; -- 创建表[用户表] DROP TABLE IF EXISTS userinfo; CREATE TABLE userinfo ( id INT ( 11 ) NOT NULL AUTO_INCRE…

LeetCode刷题---分隔链表

解题思路: 根据题意对链表进行分割 创建链表l用来表示小于给定值x的链表,创建辅助链表left指向l的初始节点 创建链表r用来表示大于等于给定值x的链表,创建辅助链表right指向r的初始节点 创建辅助链表cur,指向head节点 对原链表进行遍历 如果当前节点的va…

Flink多流转换(2)—— 双流连结

双流连结(Join):根据某个字段的值将数据联结起来,“配对”去做处理 窗口联结(Window Join) 可以定义时间窗口,并将两条流中共享一个公共键(key)的数据放在窗口中进行配…

五、垃圾回收

1. 垃圾回收基础 1.1 什么是垃圾 简单说就是:内存中已经不再被使用到的内存空间就是垃圾。 1.2 如何判定是垃圾 1.2.1 引用计数法 引用计数法:给对象添加一个引用计数器,有访问就 1,引用失效就 -1 引用计数法的优缺点&#…

抖音信息流广告引流,这种方法你要知道-数灵通

随着抖音的普及,我们经常会在刷视频的过程中遇到各种广告。这些广告不仅种类繁多,而且形式各异。除了常见的开屏广告和达人合作广告,信息流广告也是抖音广告的一种重要形式。那么,什么是信息流广告呢? 信息流广告是一种…

03. 静态路由

文章目录 一. 静态路由概述1.1. 概述1.2. 路由信息获取方式1.3. 路由表的参数1.4. 路由协议的优先级1.5. 最优路由条目优先1.6. 最长前缀匹配原则 二. 实验实操2.1. 实验1:静态路由2.1.1. 实验目的2.1.2. 实验拓扑图2.1.3. 实验步骤(1)配置网…

数据结构——双链表

双链表中节点类型的描述: 双链表的初始化(带头结点) 、 双链表的插入操作 后插操作 InsertNextDNode(p, s): 在p结点后插入s结点 按位序插入操作: 思路:从头结点开始,找到某个位序的前驱结点&#xff…

周鸿祎回应坚定支持华为:因为 360 也被制裁了

在昨天的华为鸿蒙生态千帆启航仪式上,360集团创始人兼CEO周鸿祎发表演讲表示,360坚定地支持华为的决定源于双方都曾遭到制裁。周鸿祎在演讲中提到:“在华为最早被制裁的时候,我们是少数几个公开站出来坚定支持华为的公司。其实也很…

如何进行H.265视频播放器EasyPlayer.js的中性化设置?

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器,可支持多种流媒体协议播放,可支持H.264与H.265编码格式,性能稳定、播放流畅,能支持WebSocket-FLV、HTTP-FLV,HLS(m3u8&#…

【域名解析】如何将域名指向对应服务器IP

目录 🌷一、域名解析基本概念 🌼1. 定义 🌼2. 域名解析类型 🌷二、域名解析服务器IP地址 🌼1. 操作步骤 🌼2. 验证 🌷一、域名解析基础知识 🌼1. 基本概念 定义: …