C++ Web框架Drogon初体验笔记

这段时间研究了一下C++的Web框架Drogon。从设计原理上面来说和Python的Web框架是大同小异的,但是难点在于编译项目上面,所以现在记录一下编译的过程。下面图是我项目的目录。其中include放的是头文件,src放的是视图文件,static放的是网页渲染的模板,drogon是框架名字,这里直接把drogon放到项目里面一起编译,CMake上面会引入。
在这里插入图片描述

1. 编写第一个视图

下面我们编写一个最简单Helloworld视图,这个视图直接集成到main.cpp里面。

#include <drogon/drogon.h>
#include "greeting.h"
#include "upload_font.h"
#include "upload_endpoint.h"
using namespace drogon;int main(){// 直接注册视图函数app().registerHandler("/",[](const HttpRequestPtr &,std::function<void(const HttpResponsePtr &)> &&callback) {auto resp = HttpResponse::newHttpResponse();resp->setBody("Hello, this is homepage!");callback(resp);},{Get});app().setLogPath("./").setLogLevel(trantor::Logger::kWarn).addListener("0.0.0.0", 8085).setThreadNum(16).run();
}

上面代码除了业务逻辑返回hello以外,其他都是固定写法的,包括服务器的启动等等。但是把所有的views写在main里面显然是不合理的,所以需要用到controller去解耦。
在这里插入图片描述

2. 通过drogon_ctl创建controller

使用下面命令可以快速创建一个controller,通俗点说就是视图函数。

drogon_ctl create controller greeting

上面的语句就生成了一个greeting.h头文件,用于申明视图函数,以及一个greeting.cc文件,用于写相关的业务逻辑。
greeting.h

#pragma once#include <drogon/HttpSimpleController.h>using namespace drogon;class greeting : public drogon::HttpSimpleController<greeting>
{public:void asyncHandleHttpRequest(const HttpRequestPtr& req, std::function<void (const HttpResponsePtr &)> &&callback) override;PATH_LIST_BEGIN// list path definitions here;// PATH_ADD("/path", "filter1", "filter2", HttpMethod1, HttpMethod2...);PATH_ADD("/greeting",Get);PATH_LIST_END
};

可以看到greeting.h中是可以定义我们的路由的,我们把它移动到include文件夹下面。

greeting.cc

#include "greeting.h"void greeting::asyncHandleHttpRequest(const HttpRequestPtr& req, std::function<void (const HttpResponsePtr &)> &&callback)
{// write your application logic hereauto resp = HttpResponse::newHttpResponse();resp->setBody("hello, this is a greeting page created by drogon_ctl.");resp->setExpiredTime(0);callback(resp);
}

greeting.cc 是执行相应处理函数,我们把它放在src文件夹下面,这样一个完成的controller就建好了,我们也不需要做什么去注册到程序中,只需要再CMake中添加source的路径和inclue的路径就OK了,最后我们来讲一下项目的关键CMake.txt要如何写。

CMake

上面的项目的CMake应该是这样子的。

cmake_minimum_required(VERSION 3.0.0)
project(drogon_demo VERSION 0.1.0 LANGUAGES C CXX)include(CTest)
enable_testing()# 导入项目的头文件
include_directories(${PROJECT_SOURCE_DIR}/include)
# 导入项目的代码文件
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_LIST)# 连接DROGON框架
# 方法一:使用find_package自动查找在系统安装好的DROGON库,一般都找不到
# 因为DROGON的CMake不像OpenCV这种顶级库那么规范,所以对find_package不友好
# find_package(Drogon)
# if (DROGON_FOUND)
#     target_include_directories(web_demo PUBLIC ${DROGON_INCLUDE_DIR})
#     target_link_libraries(web_demo ${DROGON_LIBRARY})
#     message(${DROGON_INCLUDE_DIR})
#     message(${DROGON_LIBRARY})
# else(DROGON_FOUND)
#     message("DROGON NOT FOUND IN SYSTEM, COMPLIE IT IN LOACAL PROJECT.")
# endif(DROGON_FOUND)# 方法二:把依赖项目于放入项目文件夹并一起编译
add_subdirectory(${PROJECT_SOURCE_DIR}/drogon)add_executable(drogon_demo ${SRC_LIST})
# 第二个参数:加入csp的source文件目录,用于渲染模板
drogon_create_views(drogon_demo${CMAKE_CURRENT_SOURCE_DIR}/static${CMAKE_CURRENT_BINARY_DIR})# 链接已经编译好的DROGON库
target_link_libraries(drogon_demo PUBLIC drogon)set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

上面的文件最关键是include_directories引入刚刚controller的头文件,aux_source_directory引入代码的文件。add_subdirectory引入我们的Drogon框架,add_executable指定入口文件夹,这个文件夹里面必须有个main.cpp唯一入口,CMake回去扫描。drogon_create_views这个用于设置模板文件的路径,我把csp的html模板文件放在static下面。有这句话才能找到csp模板,我模板渲染也成功了,但是drogon中upload_file的那个demo里面的upload_enpoint接口还是有问题,浏览器调用失败了,目前还没有解决办法,我感觉还是我CMake写的不对,呜呜,CMake真难!如果有大师知道怎么解决,非常感谢评论区可以不吝赐教。

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

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

相关文章

函数战争(栈帧)之创建与销毁(c语言)(vs2022)

首先&#xff0c;什么是函数栈帧&#xff1f; C语言中&#xff0c;每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。栈帧也叫过程活动记录&#xff0c;是编译器用来实现过程函数调用的一种数据结构。 以问答的方式解释编译器与解释器-CSDN博客htt…

了解ASP.NET Core 中的文件提供程序

写在前面 ASP.NET Core 通过文件提供程序来抽象化文件系统访问。分为物理文件提供程序(PhysicalFileProvider)和清单嵌入的文件提供程序(ManifestEmbeddedFileProvider)还有复合文件提供程序(CompositeFileProvider )&#xff1b;其中PhysicalFileProvider 提供对物理文件系统…

Hyperledger Fabric Peer 配置解析

文中使用的 fabric 版本为 2.4.1 在 Fabric 网络中&#xff0c;用户可以设定 Peer 节点、排序节点、CA 节点的行为&#xff0c;以及管理通道、组织身份等多种资源&#xff0c;这都涉及网络内配置。 Fabric 节点在启动时可通过加载本地配置文件或环境变量等方式获取配置信息&am…

智数融合|低代码入局,推动工业数字化转型走"深"向"实"

当下&#xff0c;“数字化、智能化”已经不再是新鲜词汇。事实上&#xff0c;早在几年前&#xff0c;就有企业开始大力推动数字化转型&#xff0c;并持续进行了一段时间。一些业内人士甚至认为&#xff0c;“如今的企业数字化已经走过了成熟期&#xff0c;进入了深水区。” 但事…

加密流量分析的过程

1. 流量收集 什么是流量收集 流量采集是指在计算机网络中收集和记录网络流量数据的过程。这一过程通常由网络管理员、安全专业人员、网络分析师或研究人员使用特定工具和技术来执行。流量采集对于理解网络性能、进行故障排除、进行安全监控和进行网络分析都非常重要。 流量收…

【算法Hot100系列】下一个排列

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

java字符串常用方法day02

StringBuilder类 由于String是不变对象,每次修改内容都要创建新对象,因此String不适合做频繁修改操作.为了解决这个问题,java提供了StringBuilder类. package string;/*** 频繁修改字符串带来的性能损耗.*/ public class StringDemo2 {public static void main(String[] args…

openGauss系新增市场份额达21.9%,跨越生态拐点

[中国&#xff0c;北京&#xff0c;2023年12月28日] 以“汇聚数据库创新力量&#xff0c;打造千行万业数据基石”为主题的openGauss Summit 2023在北京望京凯悦酒店举办。本次大会由国家工业信息安全发展研究中心软件所、中国软件行业协会、中国计算机学会数据库专业委员会指导…

DDL关于数据库和表操作的语法

1. DDL-数据库操作 &#xff08;1&#xff09;SHOW DATABASES ; (查看当前有哪些数据库 &#xff08;2&#xff09;CREATE DATABASES 数据库名; (创建数据库的语法 &#xff08;3&#xff09;USE 数据库名; (切换到某个数据库 &#xff08;4&#xff09;SEL…

safari缓存清理

safari缓存清理 点击顶端Safari浏览器–>点击偏好设置 点击隐私–>管理网站数据 全部移除

python系列教程218——生成器表达式

朋友们&#xff0c;如需转载请标明出处&#xff1a;https://blog.csdn.net/jiangjunshow 声明&#xff1a;在人工智能技术教学期间&#xff0c;不少学生向我提一些python相关的问题&#xff0c;所以为了让同学们掌握更多扩展知识更好地理解AI技术&#xff0c;我让助理负责分享…

python筛选数据库中表的数量

import pymysqldb pymysql.connect(host,port,user,password) cursor db.cursor()def get_table_list(in_db, in_table_name):"""获取数据库中的表数量"""sql fshow tables from {in_db};cursor.execute(sql)data cursor.fetchall()table_li…

C++qt-信号-信号槽

1、概念 信号和槽是两种函数&#xff0c;这是Qt在C基础上新增的特性&#xff0c;类似于其他技术中的回调的概念。 信号和槽通过程序员提前设定的“约定”&#xff0c;可以实现对象之间的通信&#xff0c;有两个先决的条件&#xff1a; 通信的对象必须都是从QObject类中派生出来…

3.C语言:函数与程序结构

Function 函数定义与声明外部变量与作用域头文件静态变量static寄存器变量程序块结构&#xff08;作用域&#xff09;初始化递归C预处理器 函数定义与声明 函数定义形式&#xff1a; 返回值类型函数明(参数声明表) {声明和语句 }函数定义中的各构成部分都可以省略。 不执行任…

数据库开发工具Navicat Premium 15 mac软件特色

Navicat Premium 15 mac版是一款数据库开发工具&#xff0c;Navicat Premium 15 Mac版可以让你以单一程序同時连接到 MySQL、MariaDB、SQL Server、SQLite、Oracle 和 PostgreSQL 数据库。 Navicat Premium mac软件特色 无缝数据迁移 数据传输&#xff0c;数据同步和结构同步…

婚恋/社交娱乐/同城相亲/红娘相亲交友软件开发小程序

需求分析&#xff1a;首先明确小程序的目标、功能和用户需求。确定小程序的主要功能&#xff0c;例如用户注册、登录、个人资料编辑、浏览其他用户资料、发送消息等。 技术选型&#xff1a;选择适合的开发框架和技术工具。在小程序开发中&#xff0c;可以使用微信小程序原生开…

电脑开启虚拟化如何查看自己的主机主板型号

问题描述 在使用virtualbox、vmware安装虚拟机的时候&#xff0c;需要本机电脑能够支持虚拟化。 但是不同厂家的主机&#xff08;主板&#xff09;幸好并不一致&#xff0c;所以需要先了解自己的电脑主板型号 操作方法 1、win r 键打开运行窗口&#xff0c;输入cmd并确定打开…

3D PDF查看器HOOPS Publish助力Smartscape拓展日本AEC市场!

​ 公司&#xff1a;Smartscape Co., Ltd. 行业&#xff1a;建筑、工程和施工(AEC) 软件&#xff1a;适用于AEC行业的3D PDF工具 软件开发工具包&#xff1a;Hoops Publish HOOPS_3D软件开发工具_HOOPS中文网慧都科技是HOOPS全套产品中国地区指定授权经销商&#xff0c;提供3D…

流畅芯视界 | 极海APM32F411 OLED驱动方案

随着技术的不断革新与进步&#xff0c;OLED显示技术以其在显示画质、设备厚度和能耗方面的显著表现&#xff0c;正在改变着人们的视觉体验。相较于传统液晶显示技术&#xff0c;OLED凭借更好的色彩表现力、更高对比度、以及能够实现更加轻薄的产品设计而日益受到消费者的青睐。…

zabbix部署

zabbix部署 部署zabbix服务被监测主机部署zabbix-agent2 使用版本 组件版本centos7.9zabbix5.0php7.2.24MariaDB5.5.68 部署zabbix服务 关闭防火墙和selinux [rootnode ~]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemonLoaded: …