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

大模型基于llama.cpp量化详解

大模型基于llama.cpp量化详解

概述 llama.cpp 是一个高性能的 LLM 推理库,支持在各种硬件(包括 CPU 和 GPU)上运行量化后的大语言模型。本文档详细介绍如何使用 llama.cpp 将 HuggingFace 格式的模型转换为 GGUF 格式,并进行不同程度的量化。 GGUF 格式:GGUF(Georgi Gerganov Universal Format)是 llama.cpp 专门设计的模型文件格式,针对快速加载和保存模型进行了优化,支持单文件部署,包含加载模型所需的所有信息,无需依赖外部文件。 1.安装cmake CMake 是跨平台的构建工具,用于编译 llama.cpp 项目。 下载地址:https://cmake.org/download/ 安装建议:

DeepSeek-R1-Distill-Llama-70B本地化部署全攻略:从环境搭建到企业级应用落地

DeepSeek-R1-Distill-Llama-70B本地化部署全攻略:从环境搭建到企业级应用落地 【免费下载链接】DeepSeek-R1-Distill-Llama-70BDeepSeek-R1-Distill-Llama-70B:采用大规模强化学习与先验指令微调结合,实现强大的推理能力,适用于数学、代码与逻辑推理任务。源自DeepSeek-R1,经Llama-70B模型蒸馏,性能卓越,推理效率高。开源社区共享,支持研究创新。【此简介由AI生成】 项目地址: https://ai.gitcode.com/hf_mirrors/deepseek-ai/DeepSeek-R1-Distill-Llama-70B 一、模型概述与核心优势 DeepSeek团队最新开源的DeepSeek-R1-Distill-Llama-70B模型,是基于LLaMA-70B架构深度优化的知识蒸馏产物。该模型通过创新技术实现了性能与效率的平衡:采用师生蒸馏架构将旗舰版模型能力浓缩至700亿参数规模,在保留90%原始性能的同时降低近40%计算资源消耗;创新设计的跨模态融合层支持视觉-文本联合推理,突破

【Claude Code解惑】深度评测:Claude Code vs. GitHub Copilot CLI,谁才是终端之王?

【Claude Code解惑】深度评测:Claude Code vs. GitHub Copilot CLI,谁才是终端之王?

深度评测:Claude Code vs. GitHub Copilot CLI,谁才是终端之王? 目录 1. 引言与背景 2. 原理解释(深入浅出) 3. 10分钟快速上手(可复现) 4. 代码实现与工程要点 5. 应用场景与案例 6. 实验设计与结果分析 7. 性能分析与技术对比 8. 消融研究与可解释性 9. 可靠性、安全与合规 10. 工程化与生产部署 11. 常见问题与解决方案(FAQ) 12. 创新性与差异性 13. 局限性与开放挑战 14. 未来工作与路线图 15. 扩展阅读与资源 16. 图示与交互 17. 术语表与速查表 18. 互动与社区 0.

不只是 Copilot:Kimi Code 正在改变写代码的方式

不只是 Copilot:Kimi Code 正在改变写代码的方式

之前介绍过,在 Claude Code 中使用 Kimi,现在Kimi也推出自己的 CLI 了。但是目前是会员专供! Kimi Code 是由 Moonshot AI(Kimi) 推出的下一代 AI 编程助手/代码智能体,作为 Kimi 会员订阅中专为开发者设计的增值权益,旨在帮助开发者更快、更智能、更高效地完成编程任务。它可以直接融入开发流程、终端工具和主流 IDE,让 AI 编程能力成为日常开发的一部分。 核心定位:你的 AI 代码伙伴 Kimi Code 不只是简单的补全工具,而是一个智能编程代理(AI Code Agent): * 自动理解问题和代码结构,回答开发者的问题。 * 辅助编写、调试、重构和测试代码,覆盖开发生命周期。 * 直接运行在终端与