Python与前端集成:构建全栈应用

Python与前端集成:构建全栈应用

前言

大家好,我是第一程序员(名字大,人很菜)。作为一个非科班转码、正在学习Rust和Python的萌新,最近我开始学习Python与前端技术的集成。说实话,一开始我对全栈开发的概念还很模糊,但随着学习的深入,我发现Python作为后端与前端框架的结合可以构建出功能强大的全栈应用。今天我想分享一下我对Python与前端集成的学习心得,希望能给同样是非科班转码的朋友们一些参考。

一、后端API设计

1.1 使用FastAPI创建RESTful API

FastAPI是一个现代化的Python Web框架,非常适合构建RESTful API:

from fastapi import FastAPI from pydantic import BaseModel from typing import List app = FastAPI() class Item(BaseModel): id: int name: str price: float is_offer: bool = None items = [] @app.get("/") def read_root(): return {"message": "Hello, World!"} @app.get("/items/{item_id}") def read_item(item_id: int): for item in items: if item.id == item_id: return item return {"error": "Item not found"} @app.post("/items/") def create_item(item: Item): items.append(item) return item @app.put("/items/{item_id}") def update_item(item_id: int, item: Item): for i, existing_item in enumerate(items): if existing_item.id == item_id: items[i] = item return item return {"error": "Item not found"} @app.delete("/items/{item_id}") def delete_item(item_id: int): for i, item in enumerate(items): if item.id == item_id: items.pop(i) return {"message": "Item deleted"} return {"error": "Item not found"} 

1.2 使用Flask创建RESTful API

Flask是另一个流行的Python Web框架,也可以用于构建RESTful API:

from flask import Flask, request, jsonify app = Flask(__name__) items = [] @app.route('/', methods=['GET']) def read_root(): return jsonify({"message": "Hello, World!"}) @app.route('/items/<int:item_id>', methods=['GET']) def read_item(item_id): for item in items: if item['id'] == item_id: return jsonify(item) return jsonify({"error": "Item not found"}) @app.route('/items/', methods=['POST']) def create_item(): item = request.get_json() items.append(item) return jsonify(item) @app.route('/items/<int:item_id>', methods=['PUT']) def update_item(item_id): item = request.get_json() for i, existing_item in enumerate(items): if existing_item['id'] == item_id: items[i] = item return jsonify(item) return jsonify({"error": "Item not found"}) @app.route('/items/<int:item_id>', methods=['DELETE']) def delete_item(item_id): for i, item in enumerate(items): if item['id'] == item_id: items.pop(i) return jsonify({"message": "Item deleted"}) return jsonify({"error": "Item not found"}) if __name__ == '__main__': app.run(debug=True) 

二、前端框架集成

2.1 与React集成

React是一个流行的前端框架,可以与Python后端API集成:

// App.js import React, { useState, useEffect } from 'react'; function App() { const [items, setItems] = useState([]); const [newItem, setNewItem] = useState({ id: '', name: '', price: '', is_offer: false }); useEffect(() => { fetch('http://localhost:8000/items/') .then(response => response.json()) .then(data => setItems(data)); }, []); const handleSubmit = (e) => { e.preventDefault(); fetch('http://localhost:8000/items/', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(newItem), }) .then(response => response.json()) .then(data => { setItems([...items, data]); setNewItem({ id: '', name: '', price: '', is_offer: false }); }); }; return ( <div> <h1>Items</h1> <ul> {items.map(item => ( <li key={item.id}> {item.name} - ${item.price} </li> ))} </ul> <form onSubmit={handleSubmit}> <input type="text" placeholder="ID" value={newItem.id} onChange={(e) => setNewItem({...newItem, id: parseInt(e.target.value)})} /> <input type="text" placeholder="Name" value={newItem.name} onChange={(e) => setNewItem({...newItem, name: e.target.value})} /> <input type="number" placeholder="Price" value={newItem.price} onChange={(e) => setNewItem({...newItem, price: parseFloat(e.target.value)})} /> <button type="submit">Add Item</button> </form> </div> ); } export default App; 

2.2 与Vue集成

Vue是另一个流行的前端框架,也可以与Python后端API集成:

<!-- App.vue --> <template> <div> <h1>Items</h1> <ul> <li v-for="item in items" :key="item.id"> {{ item.name }} - ${{ item.price }} </li> </ul> <form @submit.prevent="handleSubmit"> <input type="text" placeholder="ID" v-model.number="newItem.id" /> <input type="text" placeholder="Name" v-model="newItem.name" /> <input type="number" placeholder="Price" v-model.number="newItem.price" /> <button type="submit">Add Item</button> </form> </div> </template> <script> export default { data() { return { items: [], newItem: { id: '', name: '', price: '', is_offer: false } }; }, mounted() { this.fetchItems(); }, methods: { fetchItems() { fetch('http://localhost:8000/items/') .then(response => response.json()) .then(data => { this.items = data; }); }, handleSubmit() { fetch('http://localhost:8000/items/', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(this.newItem), }) .then(response => response.json()) .then(data => { this.items.push(data); this.newItem = { id: '', name: '', price: '', is_offer: false }; }); } } }; </script> 

三、数据传输

3.1 JSON数据格式

JSON是前后端数据传输的标准格式:

# 后端返回JSON数据 from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class Item(BaseModel): id: int name: str price: float @app.get("/item", response_model=Item) def get_item(): return {"id": 1, "name": "Item 1", "price": 10.99} 

3.2 处理CORS

跨域资源共享(CORS)是前后端集成中常见的问题:

# FastAPI处理CORS from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware app = FastAPI() # 配置CORS app.add_middleware( CORSMiddleware, allow_origins=["*"], # 在生产环境中应该设置具体的域名 allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) @app.get("/") def read_root(): return {"message": "Hello, World!"} 
# Flask处理CORS from flask import Flask, jsonify from flask_cors import CORS app = Flask(__name__) CORS(app) # 允许所有跨域请求 @app.route('/') def read_root(): return jsonify({"message": "Hello, World!"}) 

四、认证与授权

4.1 JWT认证

JSON Web Token(JWT)是一种常用的认证方式:

# FastAPI中使用JWT from fastapi import FastAPI, Depends, HTTPException, status from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm from jose import JWTError, jwt from datetime import datetime, timedelta from pydantic import BaseModel app = FastAPI() # 配置 SECRET_KEY = "your-secret-key" ALGORITHM = "HS256" ACCESS_TOKEN_EXPIRE_MINUTES = 30 # 模拟用户数据库 fake_users_db = { "alice": { "username": "alice", "full_name": "Alice Smith", "email": "[email protected]", "hashed_password": "fakehashedsecret", "disabled": False, } } # 工具函数 def fake_hash_password(password: str): return "fakehashed" + password def verify_password(plain_password, hashed_password): return hashed_password == fake_hash_password(plain_password) def get_user(db, username: str): if username in db: user_dict = db[username] return user_dict def create_access_token(data: dict, expires_delta: timedelta = None): to_encode = data.copy() if expires_delta: expire = datetime.utcnow() + expires_delta else: expire = datetime.utcnow() + timedelta(minutes=15) to_encode.update({"exp": expire}) encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) return encoded_jwt # 依赖 oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") async def get_current_user(token: str = Depends(oauth2_scheme)): credentials_exception = HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Could not validate credentials", headers={"WWW-Authenticate": "Bearer"}, ) try: payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) username: str = payload.get("sub") if username is None: raise credentials_exception except JWTError: raise credentials_exception user = get_user(fake_users_db, username=username) if user is None: raise credentials_exception return user # 路由 @app.post("/token") async def login(form_data: OAuth2PasswordRequestForm = Depends()): user = get_user(fake_users_db, form_data.username) if not user: raise HTTPException(status_code=400, detail="Incorrect username or password") if not verify_password(form_data.password, user["hashed_password"]): raise HTTPException(status_code=400, detail="Incorrect username or password") access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES) access_token = create_access_token( data={"sub": user["username"]}, expires_delta=access_token_expires ) return {"access_token": access_token, "token_type": "bearer"} @app.get("/users/me") async def read_users_me(current_user: dict = Depends(get_current_user)): return current_user 

五、部署

5.1 部署后端

使用Docker部署Python后端:

# Dockerfile FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . EXPOSE 8000 CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"] 

5.2 部署前端

使用Vercel、Netlify等平台部署前端:

  • Vercel:适合部署React、Next.js应用
  • Netlify:适合部署Vue、React应用
  • GitHub Pages:适合部署静态网站

5.3 完整部署

使用Docker Compose部署前后端:

# docker-compose.yml version: '3' services: backend: build: ./backend ports: - "8000:8000" frontend: build: ./frontend ports: - "3000:3000" depends_on: - backend 

六、Python与Rust的对比

作为一个同时学习Python和Rust的转码者,我发现对比学习是一种很好的方法:

6.1 前端集成对比

  • Python:生态丰富,有FastAPI、Flask等框架
  • Rust:有Actix-web、Rocket等框架
  • 开发效率:Python开发效率高,Rust开发效率相对较低
  • 性能:Rust性能优异,Python性能相对较低

6.2 学习心得

  • Python的优势:开发效率高,生态丰富
  • Rust的优势:性能优异,内存安全
  • 相互借鉴:从Python学习快速开发,从Rust学习性能优化

七、实践项目推荐

7.1 全栈项目

  • 博客系统:使用Python作为后端,React/Vue作为前端
  • 电商系统:使用Python作为后端,React/Vue作为前端
  • 社交应用:使用Python作为后端,React/Vue作为前端
  • 数据分析平台:使用Python作为后端,React/Vue作为前端

八、学习方法和技巧

8.1 学习方法

  • 循序渐进:先学习后端API开发,再学习前端框架
  • 项目实践:通过实际项目来巩固知识
  • 文档阅读:仔细阅读框架的官方文档
  • 社区交流:加入社区,向他人学习

8.2 常见问题和解决方法

  • CORS问题:配置CORS中间件
  • 认证问题:使用JWT等认证方式
  • 部署问题:使用Docker等容器化技术
  • 性能问题:优化API设计,使用缓存

九、总结

Python与前端技术的集成可以构建出功能强大的全栈应用。作为一个非科班转码者,我深刻体会到全栈开发的重要性。

我的学习过程并不是一帆风顺的,遇到了很多困难和挫折,但通过不断地实践和学习,我逐渐掌握了Python与前端集成的各种技巧。

保持学习,保持输出。虽然现在我还是个菜鸡,但我相信只要坚持,总有一天能成为真正的「第一程序员」!

Read more

龙虾(OpenClaw)搭配本地千问模型(零token成本)实现电脑AI助理

龙虾(OpenClaw)搭配本地千问模型(零token成本)实现电脑AI助理

前言:现在AI助手遍地都是,但要么是云端服务要花token钱,要么是功能单一只能聊天,想找一个“不花钱、能干活、保隐私”的电脑AI助理,简直比登天!直到我发现了一个神仙组合——龙虾AI(OpenClaw)+ 本地千问模型,完美解决所有痛点:零token成本、全程本地运行、能接管电脑干活,无论是办公摸鱼还是高效产出,都能轻松拿捏。 本文是纯新手向原创实操教程,全程手把手,从工具认知、环境准备,到龙虾与本地千问的联动配置,再到实战场景演示,每一步都标清重点、避开坑点,不用懂复杂代码,不用花一分钱,普通人跟着走,10分钟就能拥有专属本地AI电脑助理,从此告别云端token焦虑和隐私泄露风险! 一、先搞懂:为什么是“龙虾+本地千问”?核心优势碾压同类组合 在开始操作前,先跟大家说清楚两个核心工具的作用,以及为什么它们搭配起来是“王炸”——毕竟市面上AI工具那么多,选对组合才能少走弯路,真正实现“零成本、高效率”。 1. 两个核心工具,

把 OpenClaw 从局域网“解放”出来:一招实现随时随地访问你的本地 AI

把 OpenClaw 从局域网“解放”出来:一招实现随时随地访问你的本地 AI

文章目录 * 把 OpenClaw 从局域网“解放”出来:一招实现随时随地访问你的本地 AI * 前言 * 1 OpenClaw和cpolar是什么? * 1.1 OpenClaw:能装进自家电脑的 AI 大脑 * 1.2 cpolar:打破局域网限制的“任意门” * 2 下载安装cpolar * 2.1 下载cpolar * 2.3 注册及登录cpolar web ui管理界面 * 3 OpenClaw + cpolar的 N 种打开方式 * 3.1 查看家里Nas中的电影资源 * 3.2 写一个小游戏网站并分享给朋友 * 3.3 在外远程控制家里的电脑 * 4 穿透OpenClaw以支持公网访问 * 5 固定二级子域名方式

2026最新 Dify 私有化部署完整教程:从0到1搭建专属AI知识库平台

2026最新 Dify 私有化部署完整教程:从0到1搭建专属AI知识库平台 本文适配 Dify 1.13.0+ 最新社区版,全程可复现,新手友好。覆盖国内服务器加速部署、外接已有MySQL/Redis(关键避坑)、云服务器DNS解析、Nginx反向代理+HTTPS、API对外提供全流程,解决部署过程中99%的坑。 前言 Dify 是一款开源的大语言模型应用开发平台,凭借可视化编排、企业级RAG知识库、全链路LLMOps能力,让个人开发者和中小企业都能快速搭建专属AI应用、知识库问答系统,还能封装成API对外提供服务。 本文基于国内云服务器环境(Ubuntu 22.04),全程使用国内加速源,重点解决了外接MySQL/Redis时的依赖报错、服务名解析失败等核心问题,最终实现生产级可用的私有化Dify平台。 你能从本文学到 1. 零基础完成Dify私有化部署,适配国内服务器环境 2. 完美复用服务器已有MySQL/Redis,不启动冗余容器(核心避坑) 3.

AI 大模型落地系列|Eino 组件核心篇:Embedding 到底解决了什么

AI 大模型落地系列|Eino 组件核心篇:Embedding 到底解决了什么

Embedding 使用说明 * 有啥用?! * 他能干嘛? * 它不能直接干嘛? * 总结: * 浅用之法 * 食用之法 * 一、最基本用法:直接调用 `EmbedStrings` * 1. 创建 embedder * 2. 调用 `EmbedStrings` * 3. 向量拿来干嘛 * 二、完整demo * 三、带 Option 怎么用 * 四、在编排中怎么用 * 在 Chain 中使用 * 在 Graph 中使用 * 五、带 Callback 怎么用 * 六、真实场景 * 场景:做知识库问答 * 第一步:把知识库切块 * 第二步:给每个 chunk 生成向量 * 第三步:存起来