FastAPI 和 MongoDB 实现请求头参数处理的示例,并在 React 中进行渲染

FastAPI 和 MongoDB 后端

  1. 安装必要的库
    安装 FastAPI、Uvicorn、Motor(用于 MongoDB 的异步驱动)和 Pydantic(用于数据验证)。

    pip install fastapi uvicorn motor pydantic
    
  2. 创建 FastAPI 应用

    创建一个文件 main.py,并在其中定义一个接口,该接口通过请求头参数获取博客文章的详细信息。

    # main.py
    from fastapi import FastAPI, Request, HTTPException
    from motor.motor_asyncio import AsyncIOMotorClient
    from pydantic import BaseModel
    from bson import ObjectId
    from typing import Optional, Listapp = FastAPI()# MongoDB 连接
    client = AsyncIOMotorClient("mongodb://localhost:27017")
    db = client["blogdb"]
    collection = db["blogs"]# 定义博客模型
    class Blog(BaseModel):title: strcontent: strauthor: strcreated_at: str# 写入100条测试数据
    async def create_test_data():for i in range(100):blog = Blog(title=f"测试博客 {i+1}",content=f"这是第 {i+1} 篇博客的内容",author=f"作者 {i+1}",created_at="2025-05-10 12:33:33")await collection.insert_one(blog.dict())# 初始化时创建测试数据
    @app.on_event("startup")
    async def startup_event():await create_test_data()# 通过请求头参数获取博客
    @app.get("/blogs/")
    async def get_blogs(request: Request):# 从请求头中获取参数api_key = request.headers.get("X-API-Key")if not api_key or api_key != "your_api_key":raise HTTPException(status_code=401, detail="Invalid API Key")blogs = await collection.find().to_list(length=100)return [{"_id": str(blog["_id"]), **blog} for blog in blogs]
    

React 前端

  1. 创建 React 应用
    如果你还没有创建一个 React 应用,可以使用 Create React App 来快速创建一个。

    npx create-react-app my-react-app
    cd my-react-app
    npm start
    
  2. 修改 App.js 文件
    App.js 文件中,我们将实现通过请求头参数获取博客数据,并动态渲染博客列表。

    import React, { useState, useEffect } from 'react';
    import './App.css';function App() {const [blogs, setBlogs] = useState([]);const [apiKey, setApiKey] = useState('your_api_key');useEffect(() => {fetchBlogs();}, [apiKey]);const fetchBlogs = () => {fetch('http://127.0.0.1:8000/blogs/', {headers: {'X-API-Key': apiKey}}).then(response => {if (!response.ok) {throw new Error('Request failed');}return response.json();}).then(data => setBlogs(data)).catch(error => console.error('Error fetching blogs:', error));};return (<div className="App"><header className="App-header"><h1>博客列表</h1><div><inputtype="text"value={apiKey}onChange={(e) => setApiKey(e.target.value)}placeholder="API Key"/><button onClick={fetchBlogs}>获取博客</button></div><div>{blogs.map(blog => (<div key={blog._id} className="blog-card"><h2>{blog.title}</h2><p>{blog.content}</p><p>作者: {blog.author}</p><p>创建时间: {blog.created_at}</p></div>))}</div></header></div>);
    }export default App;
    
  3. 添加样式
    为了使博客卡片看起来更好,可以在 App.css 文件中添加一些样式。

    .App {text-align: center;
    }.App-header {background-color: #282c34;min-height: 100vh;display: flex;flex-direction: column;align-items: center;justify-content: center;font-size: calc(10px + 2vmin);color: white;
    }.blog-card {background-color: #333;padding: 20px;margin: 10px 0;border-radius: 8px;box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
    }.blog-card h2 {margin-top: 0;
    }.blog-card p {margin: 10px 0;
    }input {margin: 10px 0;padding: 8px;border-radius: 4px;border: 1px solid #ccc;
    }button {padding: 8px 16px;background-color: #61dafb;border: none;border-radius: 4px;cursor: pointer;
    }button:hover {background-color: #007bff;
    }
    

运行 React 应用

确保你的 React 应用正在运行。如果你之前已经启动了 npm start,那么它应该已经在运行了。

打开浏览器访问 http://localhost:3000,你应该能看到通过请求头参数获取的博客列表。

注意事项

  1. 跨域问题
    如果你在开发环境中遇到跨域问题(CORS),可以在 FastAPI 应用中添加 CORS 中间件来解决。修改 main.py 文件:

    from fastapi.middleware.cors import CORSMiddlewareapp = FastAPI()app.add_middleware(CORSMiddleware,allow_origins=["*"],allow_credentials=True,allow_methods=["*"],allow_headers=["*"],
    )
    
  2. 生产环境
    在生产环境中,你需要将 React 应用构建为静态文件,并将其部署到一个 Web 服务器上。同时,FastAPI 应用也需要部署到一个生产级的服务器上,如 Gunicorn 或 Uvicorn。

通过以上步骤,你可以在 React 中实现通过请求头参数获取 FastAPI 和 MongoDB 提供的数据,并动态渲染博客列表。

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

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

相关文章

技术伦理双轨认证如何重构AI工程师能力评估体系——基于AAIA框架的技术解析与行业实证研究

引言&#xff1a;AI工程师能力评估的范式转型 2025年全球人工智能产业呈现出两大特征&#xff1a;技术迭代加速与监管框架完善。据Gartner数据显示&#xff0c;全球75%的企业在AI项目部署中遭遇技术伦理混合型难题&#xff0c;传统单维度技术认证体系已无法满足产业需求。本文…

03.Golang 切片(slice)源码分析(二、append实现)

Golang 切片&#xff08;slice&#xff09;源码分析&#xff08;二、append实现&#xff09; 前言&#xff1a; Golang 切片&#xff08;slice&#xff09;源码分析&#xff08;一、定义与基础操作实现&#xff09; 在前面的文章我们介绍了&#xff0c;切片的结构体与创建\扩容…

mysql常用方法

mysql常用方法 一、基本用法 -- MySQL创建唯一索引 CREATE UNIQUE INDEX 索引名 ON 表名(列名1,列名2,...); --也可以使用ALTER TABLE语句给现有表添加唯一索引&#xff08;UNIQUE&#xff09; ALTER TABLE 表名 ADD CONSTRAINT 索引名 UNIQUE KEY(列名1,列名2,...); alter t…

STM32F103C8T6板子使用说明

第一章 计算机体系结构(了解) 后续在板子上开发的时候&#xff0c;需要考虑是否有操作系统 方式一&#xff1a;有操作系统&#xff0c;通过c库通过os api操作硬件方式二&#xff1a;无操作系统&#xff0c; 通过c库通过固件库操作硬件 第二章 STM32开发板概述 板子/开发板&…

PBR材质-Unity/Blender/UE

目录 前言&#xff1a; 一、Unity&#xff1a; 二、Blender&#xff1a; 三、UE&#xff1a; 四、全家福&#xff1a; 五、后记&#xff1a; 前言&#xff1a; PBR流程作为表达物理效果的经典方式&#xff0c;很值得一学。纹理贴图使用的是上一期的Textures | cgbookcas…

【生产实践】Linux中/usr/bin、/usr/sbin与/usr/local的关系解析(2025年技术规范)

一、核心定位与功能划分 /usr/bin&#xff1a;用户级通用命令库 • 定位&#xff1a;存储系统预装的用户级可执行文件&#xff0c;这些命令通常由Linux发行版官方软件包管理器&#xff08;如APT、YUM&#xff09;安装&#xff0c;属于系统默认功能的一部分。 • 示例命令&#…

智能网联汽车 “中央计算” 博弈:RTOS 与跨域融合的算力分配挑战

一、引言 随着智能驾驶技术的飞速发展&#xff0c;汽车逐渐从传统的交通工具演变为移动的智能终端。智能网联汽车的核心竞争力日益体现在其强大的计算能力和高效的算力管理上。汽车电子电气架构&#xff08;EEA&#xff09;正经历从分布式架构向 “中央计算 区域控制” 架构的…

【PDF】使用Adobe Acrobat dc添加水印和加密

【PDF】使用Adobe Acrobat dc添加水印和加密 文章目录 [TOC](文章目录) 前言一、添加保护加密口令二、添加水印三、实验四、参考文章总结 实验工具&#xff1a; 1.Adobe Acrobat dc 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、添加保护加…

python面试实战经验分享

2025/3/28第一面 杭州实在智能 见习python开发工程师 1、Python方法中参数默认值可以是列表或者字典吗? 在Python中,函数参数的默认值可以是列表或字典,列表或者字典在初始化应在函数体内,如果不正确处理,可能会导致所有调用都共享同一个列表。 2、协程、线性和进程 进程…

MIST:一键解锁 macOS 历史版本,旧系统安装不再难!

在 Mac 电脑的使用过程中&#xff0c;你是否遇到过这些困扰&#xff1f;为了运行一款经典设计软件&#xff0c;新系统却无法兼容&#xff1b;或是想给老旧 Mac 设备升级&#xff0c;却找不到适配的系统版本。而 App Store 里&#xff0c;旧版 macOS 安装包就像 “隐藏副本”&am…

win10 局域网内聊天

在 Windows 10 的局域网 中&#xff0c;如果你想实现 多个用户之间的聊天功能&#xff0c;可以选择以下几种方案&#xff0c;取决于你需要的是&#xff1a; • ✅ 命令行纯文字聊天&#xff08;如 Linux talk&#xff09; • ✅ 图形界面聊天室 • ✅ 局域网广播消息 • ✅ 多人…

Android CountDownTimer重写

Android 倒计时器重写&#xff0c;实现可重复使用&#xff0c;动态修改计时时间 CountDownTimerRew 是一个可重写、动态修改计时时间的 Android 倒计时器类。它允许开发者设置倒计时总时长、间隔时间&#xff0c;并通过 onTick 和 onFinish 方法实现定时回调。该类支持动态修改…

dp自动化登陆之hCaptcha 验证码

hCaptcha 是一种常见的验证码服务&#xff0c;用于区分人类用户和自动化程序。由于其基于图像识别和行为分析&#xff0c;下面介绍如何使用自动化点击验证码完成登陆。 思路&#xff1a;登陆目标网站触发验证码&#xff0c;截图并发给打码平台返回坐标&#xff0c;模拟人工点击…

【工作记录】crmeb后端项目打开、运行

1、下载代码 1&#xff09;安装git 不再详述 2&#xff09;git拉代码 项目地址如下&#xff0c;在vscode-分支中拉代码 # 克隆项目 git clone https://gitee.com/ZhongBangKeJi/crmeb_java/ 截图如下是已经成功拉下来 注意安装对应版本 2、maven配置 安装配置见&#x…

敏捷软件开发与Scrum

目录 一、敏捷软件开发 敏捷开发原则 敏捷开发特点 二、Scrum (一)Scrum 基础知识

Three.js模型材质调整与性能优化实战

一、材质基础调整 1.1 颜色与透明度控制 通过Material.color属性可直接修改材质颜色&#xff1a; material.color new THREE.Color(0xff0000); // 红色结合opacity属性实现透明效果&#xff1a; material.opacity 0.5; // 50%透明度如需动态调整&#xff0c;可通过Color.…

Flutter速成指南:不懂编程也能10天开发专业级App

Flutter速成指南&#xff1a;不懂编程也能10天开发专业级App &#x1f680; 轻松构建漂亮的跨平台应用 &#x1f4d1; 目录 一、Flutter是什么&#xff1f; 为什么选择Flutter&#xff1f;Flutter工作原理 二、环境搭建与命令行 安装Flutter SDK常用Flutter命令创建第一个项目…

【面试真题】王者荣耀亿级排行榜,如何设计?

目录 一、数据库 order by 二、Redis 的zset 三、抗亿级数据存在的问题 3.1 热点 key 问题 3.1.1 多级缓存&#xff08;RedisJVM本地缓存&#xff09; 3.1.2 读写分离 从库负载均衡 3.1.3 分片Key设计 3.2 内存爆炸 3.2.1 缩短键名 3.2.2 分片存储 3.3 数据持久化风…

Java 语法基础(笔记)

java 的数据类型 基本类型 Java 有八种基本类型&#xff1a; byte&#xff1a;1 字节&#xff0c;-128~127short&#xff1a;2 字节&#xff0c;-32768~32767int&#xff1a;4 字节&#xff0c;-2147483648~2147483647long&#xff1a;8 字节&#xff0c;-92233720368547758…

C# 方法(栈帧)

本章内容: 方法的结构 方法体内部的代码执行 局部变量 局部常量 控制流 方法调用 返回值 返回语句和void方法 局部函数 参数 值参数 引用参数 引用类型作为值参数和引用参数 输出参数 参数数组 参数类型总结 方法重载 命名参数 可选参数 栈帧 递归 栈帧 至此&#xff0c;我们已…