Crow(类 Flask 的轻量级 C++ Web 框架)入坑笔记

65次阅读
没有评论

共计 4067 个字符,预计需要花费 11 分钟才能阅读完成。

1)Crow 是什么(为什么选它)

  • 定位:用 C++ 写 HTTP / WebSocket 服务的微框架,语法风格接近 Flask(CROW_ROUTE(app, "/")([]{ ...});),上手门槛低。提供内置 JSON、Mustache 模板、Middlewares、静态文件、Blueprints 等。且为 header-only(也提供单头文件 crow_all.h)。(GitHub)
  • 人气 / 活跃:GitHub 约 4.4k⭐ / 494 forks(以 2025-10-10 为准)。(GitHub)
  • 依赖 / 版本:需要 C++17、Asio(1.28–1.30)。可启用 Zlib(压缩)与 OpenSSL(HTTPS)。(crowcpp.org)
  • 状态提示:README 中标注 HTTP/2 与更完善的 Async 支持仍在进行中。(GitHub)

2)安装与环境(Linux / macOS / Windows)

Linux(推荐 CMake 或发行版包)

  • 依赖:C++17、Asio;可选 Zlib、OpenSSL。(crowcpp.org)
  • 方式一:包管理器(Deb/Ubuntu .deb、Arch AUR)。(crowcpp.org)
  • 方式二:源码 + CMake 安装 git clone https://github.com/CrowCpp/Crow.git cd Crow && mkdir build && cd build cmake .. -DCROW_BUILD_EXAMPLES=OFF -DCROW_BUILD_TESTS=OFF make -j && sudo make install 若要启用 HTTPS/ 压缩,可在 CMake 中打开 CROW_ENABLE_SSL / CROW_ENABLE_COMPRESSION,并在你的项目里 find_package(OpenSSL) / find_package(ZLIB) 后链接对应 target。(crowcpp.org)

CMake 集成到你的项目

find_package(Crow)
target_link_libraries(your_project PUBLIC Crow::Crow)

(crowcpp.org)

macOS

  • 一条命令装包:brew install crow。也可下载 release 或源码,仅拷 include/ 或使用单头 crow_all.h。(crowcpp.org)

Windows

  • vcpkgvcpkg install crow;或按文档用 VS + vcpkg 的 Manifest 来拉依赖。(crowcpp.org)

另外,官网列出多种渠道(.deb/AUR/vcpkg/Homebrew/Nix/Conan/ 直接下载单头文件)可获取 Crow。(crowcpp.org)


3)10 分钟跑通:最小可运行示例

main.cpp

#include "crow.h"  // 或 "crow_all.h"

int main() {
  crow::SimpleApp app;

  CROW_ROUTE(app, "/")([](){ return "Hello world";});

  // 不指定端口则缺省 80;multithreaded 可省略
  app.port(18080).multithreaded().run();
}

编译(Linux/macOS 示例)

g++ -std=c++17 main.cpp -lpthread -o demo
./demo
# 浏览器打开 http://localhost:18080

示例与要点来自官方「Your First Application」。(crowcpp.org)


4)常用功能速查

(1) 路由与参数 / 方法

// /add/1/2 -> "3"
CROW_ROUTE(app, "/add/<int>/<int>")
([](int a, int b){return std::to_string(a + b); })
.methods("GET"_method, "POST"_method);

Crow 支持 <int>/<uint>/<double>/<string>/<path> 参数、方法限定与请求 / 响应对象(crow::request / crow::response)等。(crowcpp.org)

(2) JSON(读写)

// 返回 JSON
CROW_ROUTE(app, "/json")([]{crow::json::wvalue x({{"message", "Hello"}});
  x["count"] = 42;
  return x;   // 自动设置 content-type: application/json
});

// 读取 JSON(POST)CROW_ROUTE(app, "/sum").methods("POST"_method)
([](const crow::request& req){auto j = crow::json::load(req.body);
  if(!j) return crow::response(crow::status::BAD_REQUEST);
  int s = j["a"].i() + j["b"].i();
  return crow::response(std::to_string(s));
});

内置 rvalue/wvalue 类型、初始化列表构造、异常控制宏等。(crowcpp.org)

(3) 模板(Mustache)

// ./templates/hello.html:  Hello {{name}}!
CROW_ROUTE(app, "/tpl")([]{auto page = crow::mustache::load("hello.html");
  crow::mustache::context ctx; ctx["name"] = "Crow";
  return page.render(ctx);  // 正确的 Content-Type
});

模板目录可全局 /Blueprint 局部设置,支持从字符串编译与安全路径控制。(crowcpp.org)

(4) 静态文件

  • 约定目录 ./static,访问路径 /static/...(宏可重定义目录或端点)。
  • 也可显式返回文件:res.set_static_file_info("path/to/file")。(crowcpp.org)

(5) 中间件(全局 / 局部)

struct AdminGuard {struct context {};
  void before_handle(crow::request& req, crow::response& res, context&) {if (req.remote_ip_address != "127.0.0.1") {res.code = 403; res.end(); }
  }
};

// 注册顺序即调用顺序
crow::App<AdminGuard> app;

亦支持 局部中间件(只作用于某些路由 /Blueprint)。(crowcpp.org)

(6) WebSocket

CROW_WEBSOCKET_ROUTE(app, "/ws")
  .onopen([&](crow::websocket::connection& conn){/* ... */})
  .onmessage([&](crow::websocket::connection& c, const std::string& msg, bool bin){if (bin) {/*...*/} else {/* echo / broadcast ... */}
  });

注意:生产环境建议开启协议校验:#define CROW_ENFORCE_WS_SPEC;可设置最大载荷和子协议。(crowcpp.org)


5)开启 HTTPS(可选)

  • 生成 / 配置证书后,应用链式设置:
    app.ssl_file("cert.crt", "key.key").run(); 或使用 ssl_chainfile() 处理 fullchain;编译期需启用 CROW_ENABLE_SSL(CMake 或编译宏)。(crowcpp.org)

6)生产部署建议

  • 反向代理:推荐放在 Nginx/Apache 后,SSL 交给代理,Crow 保持非 SSL,反代到你的端口。文档含最小可用的 location / {proxy_pass ...} 配置示例。(crowcpp.org)
  • 开机自启:Systemd .service 模板示例见文档,可 systemctl enable/start 管理。(crowcpp.org)
  • 性能:使用 multithreaded()、Release 构建;按需启用压缩;静态文件可交给 Nginx。(功能点见官方特性与指南总览。)(crowcpp.org)

7)一份最小 CMake 项目骨架

CMakeLists.txt

cmake_minimum_required(VERSION 3.14)
project(crow_demo CXX)
set(CMAKE_CXX_STANDARD 17)

find_package(Crow)                   # 由安装的 Crow 提供
add_executable(crow_demo main.cpp)
target_link_libraries(crow_demo PUBLIC Crow::Crow)

# 可选:开启 HTTPS/ 压缩(并自己 find OpenSSL/ZLIB 后链接)# set(CROW_ENABLE_SSL ON)
# set(CROW_ENABLE_COMPRESSION ON)

find_package(Crow) 与链接写法来自官方 Linux 指南。)(crowcpp.org)


参考 / 官方资源

  • 官网(Getting Started / Guides / API)与包管理入口。(crowcpp.org)
  • GitHub 仓库(特性清单、示例、Star/Fork)。(GitHub)
  • 平台安装:Linux、macOS(含 Homebrew)、Windows(含 vcpkg)。(crowcpp.org)
  • 功能指南:Routes / JSON / Mustache / Static / Middleware / Websockets。(crowcpp.org)
  • HTTPS / 反代与自启:SSL、Proxies、Systemd。(crowcpp.org)

正文完
 1
一诺
版权声明:本站原创文章,由 一诺 于2025-10-10发表,共计4067字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码