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

news2025/5/14 17:22:33

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, List
    
    app = FastAPI()
    
    # MongoDB 连接
    client = AsyncIOMotorClient("mongodb://localhost:27017")
    db = client["blogdb"]
    collection = db["blogs"]
    
    # 定义博客模型
    class Blog(BaseModel):
        title: str
        content: str
        author: str
        created_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>
              <input
                type="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 CORSMiddleware
    
    app = 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.coloradmin.cn/o/2375544.html

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

相关文章

CodeBuddy 中国版 Cursor 实战:Redis+MySQL双引擎驱动〈王者荣耀〉战区排行榜

文章目录 一、引言二、系统架构设计2.1、整体架构概览2.2、数据库设计2.3、后端服务设计 三、实战&#xff1a;从零构建排行榜3.1、开发环境准备3.2、用户与战区 数据管理3.2.1、MySQL 数据库表创建3.2.2、实现用户和战区数据的 CURD 操作 3.3、实时分数更新3.4、排行榜查询3.5…

在线SQL转ER图工具

在线SQL转ER图网站 在数据库设计、软件开发或学术研究中&#xff0c;ER图&#xff08;实体-关系图&#xff09; 是展示数据库结构的重要工具。然而&#xff0c;手动绘制ER图不仅耗时费力&#xff0c;还容易出错。今天&#xff0c;我将为大家推荐一款非常实用的在线工具——SQL…

python高级特性

json.dumps({a:1,n:2}) #Python 字典类型转换为 JSON 对象。相当于jsonify data2 json.loads(json_str)#将 JSON 对象转换为 Python 字典 异步编程&#xff1a;在异步编程中&#xff0c;程序可以启动一个长时间运行的任务&#xff0c;然后继续执行其他任务&#xff0c;而无需等…

汇编:子程序设计

一、 实验要求 实验目的&#xff1a; 熟练掌握算术运算汇编指令的使用熟练掌握子程序设计的基本方法熟练掌握程序的调试方法 实验内容&#xff1a; 编程实现两个数&#xff1a;#8888H和#79H的乘除运算结合实验1的代码&#xff0c;将加减乘除四则运算写成四个子程序&#xff…

从概念表达到安全验证:智能驾驶功能迎来系统性规范

随着辅助驾驶事故频发&#xff0c;监管机制正在迅速补位。面对能力表达、使用责任、功能部署等方面的新要求&#xff0c;行业开始重估技术边界与验证能力&#xff0c;数字样机正成为企业合规落地的重要抓手。 2025年以来&#xff0c;围绕智能驾驶功能的争议不断升级。多起因辅…

DeepSeek基于注意力模型的可控图像生成

DeepSeek大模型高性能核心技术与多模态融合开发 - 商品搜索 - 京东 图像的加噪与模型训练 在扩散模型的训练过程中&#xff0c;首先需要对输入的信号进行加噪处理&#xff0c;经典的加噪过程是在图像进行向量化处理后在其中添加正态分布&#xff0c;而正态分布的值也是与时间…

“端 - 边 - 云”三级智能协同平台的理论建构与技术实现

摘要 随着低空经济与智能制造的深度融合&#xff0c;传统集中式云计算架构在实时性、隐私保护和资源效率上的瓶颈日益凸显。本文提出“端 - 边 - 云”三级智能协同平台架构&#xff0c;以“时空 - 资源 - 服务”三维协同理论为核心&#xff0c;构建覆盖终端感知、边缘计算、云端…

AI时代,如何实现人机共舞?

在科技飞速发展的当下&#xff0c;人工智能&#xff08;AI&#xff09;已不再是科幻作品中的遥远想象&#xff0c;而是深入渗透到我们生活与工作的方方面面。从智能手机中的语音助手&#xff0c;到金融领域的风险预测模型&#xff1b;从医疗影像的智能诊断&#xff0c;到工业生…

OceanBase 在业务监控系统中的应用实践

本文作者来自于一家总部在宁波的新能源上市公司&#xff0c;公司业务包括光伏新能源产品的研发与产销。 作为年产值达百亿的企业&#xff0c;监控系统是不可或缺的IT管理体系之一&#xff0c;对于确保业务连续性及预警风险非常重要。2022年&#xff0c;公司选择把Zabbix作为企业…

每日Prompt:品牌化键盘键帽

提示词 一个超逼真的3D渲染图&#xff0c;展示了四个机械键盘键帽&#xff0c;排列成紧密的2x2网格&#xff0c;所有键帽相互接触。从等轴测角度观察。一个键帽是透明的&#xff0c;上面用红色印刷着“{just}”字样。另外三个键帽采用颜色&#xff1a;{黑色、紫色和白色}。一个…

超声波传感器模块

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 1.HC-SR04介绍2.HC-SR04原理介绍2.1原理概述3.2原理详解 4驱动代码编写4.1写前思考4.2硬件连线 5.总结hcsr04.hhcsr04.c 1.HC-SR04介绍 超声波传感器有很多种类的型号&#xff1a;HC-SR04、UC-025、…

LeetCode 513 找树左下角的值 LeetCode 112 路径总和 LeetCode106 从中序与后序遍历序列构造二叉树

LeetCode 513 找树左下角的值 迭代法——层序遍历 思路&#xff1a;对树进行层序遍历操作&#xff0c;层序遍历完后&#xff0c;输出树最后一层的第一个节点。 # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val0, leftNone, r…

『大模型笔记』Langchain作者Harrison Chase专访:环境智能体与全新智能体收件箱

Langchain作者Harrison Chase专访:环境智能体与全新智能体收件箱 文章目录 摘要访谈内容什么环境智能体为什么要探索环境智能体怎么让人类能更方便地和环境智能体互动参考文献摘要 LangChain 的 CEO Harrison Chase 提出了_“环境智能体”(Ambient Agents)的概念,这是一种…

SpringBoot的外部化配置

一、什么是外部化配置 外部化配置是指把应用程序中各种可配置的参数、属性等信息&#xff0c;从代码内部提取出来&#xff0c;放置在外部的配置文件、数据库或配置中心等地方&#xff08;比如使用.properties、.yml 或.xml 等格式的文件&#xff09;进行管理。提高应用程序的可…

数字IC后端实现教程 | Early Clock Flow和Useful skew完全不是一个东西

数字后端零基础入门系列 | Innovus零基础LAB学习Day10 Q: Early clock flow和useful skew都是做短某段路径&#xff0c;这两个有什么区别呢&#xff0c;既然这样还用useful skew是不是有点多余了? Useful Skew技术 在不使用useful skew技术&#xff0c;第一级FF到第二级FF的…

MySQL OCP试题解析(3)

试题如图所示&#xff1a; 一、解析 正确选项&#xff1a;D&#xff09;The backup can be impacted when DDL operations run during the backup&#xff08;备份期间运行的 DDL 操作可能影响备份&#xff09; 1. 关键知识点解析&#xff1a; 题目中的命令 mysqlbackup 使用了…

SpringCloud之Gateway基础认识-服务网关

0、Gateway基本知识 Gateway 是在 Spring 生态系统之上构建的 API 网关服务&#xff0c;基于 Spring &#xff0c;Spring Boot 和 Project Reactor 等技术。 Gateway 旨在提供一种简单而有效的方式来对 API 进行路由&#xff0c;以及提供一些强大的过滤器功能&#xff0c;例如…

STM32-DMA数据转运(8)

目录 一、简介 二、存储器映像 三、DMA框图​编辑 四、DMA基本结构 五、两个数据转运的实例 一、简介 直接存储器存取简称DMA&#xff08;Direct Memory Access&#xff09;&#xff0c;它是一个数据转运小助手&#xff0c;主要用来协助CPU&#xff0c;完成数据转运的工作…

电机控制储备知识学习(一) 电机驱动的本质分析以及与磁相关的使用场景

目录 电机控制储备知识学习&#xff08;一&#xff09;一、电机驱动的本质分析以及与磁相关的使用场景1&#xff09;电机为什么能够旋转2&#xff09;电磁原理的学习重要性 二、电磁学理论知识1&#xff09;磁场基础知识2&#xff09;反电动势的公式推导 附学习参考网址欢迎大家…

使用 React 实现语音识别并转换功能

在现代 Web 开发中&#xff0c;语音识别技术的应用越来越广泛。它为用户提供了更加便捷、自然的交互方式&#xff0c;例如语音输入、语音指令等。本文将介绍如何使用 React 实现一个简单的语音识别并转换的功能。 功能概述 我们要实现的功能是一个语音识别测试页面&#xff0…