【前后端与数据库交互】从零构建 Python + Vue + MongoDB 网站
第一部分:如何操作(步步指导)
步骤 1: 设置本地开发环境
-
安装 Python 和必要工具:
- 下载 Python 3.10+ 从官网。
- 安装 Git(用于版本控制)。
- 创建虚拟环境:打开命令行(Windows: cmd 或 PowerShell;Mac/Linux: terminal),运行:
python -m venv myenv source myenv/bin/activate # Mac/Linux # 或 Windows: myenv\Scripts\activate
-
使用清华源安装依赖(加速安装):
- 配置 pip 使用清华镜像:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
- 安装后端依赖(我们用 FastAPI 作为后端框架,因为它简单高效,支持异步;MongoDB 用 pymongo):
pip install fastapi uvicorn pymongo requests pydantic python-dotenv passlib[bcrypt] python-jose[cryptography]
- 解释:fastapi(API 框架)、uvicorn(服务器)、pymongo(MongoDB 驱动)、requests(调用 DeepSeek API)、pydantic(数据验证)、python-dotenv(环境变量)、passlib 和 python-jose(用于用户认证,JWT)。
- 配置 pip 使用清华镜像:
步骤 2: 创建后端项目结构
-
创建项目文件夹:
mkdir backend-project cd backend-project
-
创建核心文件(保持简洁,只保留必要文件):
main.py
:主应用文件。models.py
:数据模型(用户、功能相关)。auth.py
:用户认证逻辑。routes.py
:API 路由(注册、登录、两个功能)。.env
:环境变量文件(放 API Key 和 DB 连接)。requirements.txt
:依赖列表(可选,但推荐)。
删除多余东西:我们不添加测试文件夹、静态文件、日志模块等。只保留以上文件。没有多余的示例代码或模板。
-
编写代码(复制以下内容到对应文件):
-
.env(环境变量,保护敏感信息):
MONGO_URI=mongodb://root:m889w97h@test-db-mongodb.ns-jes7x0rb.svc:27017 DEEPSEEK_API_KEY=sk-37e8ec46dd45a587a6d06f89 SECRET_KEY=your_secret_key_here # 生成一个随机密钥,比如用 Python: import secrets; print(secrets.token_hex(32))
-
models.py(用户模型,使用 Pydantic):
from pydantic import BaseModel from typing import Optionalclass User(BaseModel):username: strpassword: str # hashed in DBclass UserInDB(User):hashed_password: strclass ImageDescriptionRequest(BaseModel):image_url: str # 假设上传后返回 URL,这里简化class TextToImageRequest(BaseModel):text: str
-
auth.py(用户认证,使用 JWT):
import jwt from passlib.context import CryptContext from datetime import datetime, timedelta from dotenv import load_dotenv import osload_dotenv() SECRET_KEY = os.getenv("SECRET_KEY") ALGORITHM = "HS256" pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")def get_password_hash(password):return pwd_context.hash(password)def verify_password(plain_password, hashed_password):return pwd_context.verify(plain_password, hashed_password)def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):to_encode = data.copy()if expires_delta:expire = datetime.utcnow() + expires_deltaelse:expire = datetime.utcnow() + timedelta(minutes=15)to_encode.update({"exp": expire})encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)return encoded_jwt
-
routes.py(API 端点,包括用户和功能):
from fastapi import APIRouter, Depends, HTTPException, UploadFile, File from pymongo import MongoClient from dotenv import load_dotenv import os import requests from .models import User, ImageDescriptionRequest, TextToImageRequest from .auth import get_password_hash, verify_password, create_access_token from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestFormload_dotenv() MONGO_URI = os.getenv("MONGO_URI") DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY") client = MongoClient(MONGO_URI) db = client["mydatabase"] # 创建或使用数据库 users_collection = db["users"]router = APIRouter() oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")# 用户注册 @router.post("/register") def register(user: User):if users_collection.find_one({"username": user.username}):raise HTTPException(status_code=400, detail="Username already registered")hashed_password = get_password_hash(user.password)users_collection.insert_one({"username": user.username, "hashed_password": hashed_password})return {"msg": "User registered"}# 用户登录 @router.post("/token") def login(form_data: OAuth2PasswordRequestForm = Depends()):user = users_collection.find_one({"username": form_data.username})if not user or not verify_password(form_data.password, user["hashed_password"]):raise HTTPException(status_code=400, detail="Incorrect username or password")access_token = create_access_token(data={"sub": form_data.username})return {"access_token": access_token, "token_type": "bearer"}# 看图说话(图像描述,需要认证) @router.post("/image-description", dependencies=[Depends(oauth2_scheme)]) def describe_image(request: ImageDescriptionRequest):# 调用 DeepSeek API(假设 API 端点为 https://api.deepseek.com/v1/images/descriptions)headers = {"Authorization": f"Bearer {DEEPSEEK_API_KEY}"}payload = {"image_url": request.image_url} # 简化,实际需处理上传response = requests.post("https://api.deepseek.com/v1/images/descriptions", json=payload, headers=headers) # 替换为实际 DeepSeek 端点if response.status_code != 200:raise HTTPException(status_code=500, detail="API error")return response.json()["description"] # 假设返回描述# 图片生成(文本到图像,需要认证) @router.post("/text-to-image", dependencies=[Depends(oauth2_scheme)]) def generate_image(request: TextToImageRequest):# 调用 DeepSeek API(假设 API 端点为 https://api.deepseek.com/v1/images/generations)headers = {"Authorization": f"Bearer {DEEPSEEK_API_KEY}"}payload = {"prompt": request.text}response = requests.post("https://api.deepseek.com/v1/images/generations", json=payload, headers=headers) # 替换为实际 DeepSeek 端点if response.status_code != 200:raise HTTPException(status_code=500, detail="API error")return response.json()["image_url"] # 假设返回图像 URL# 图像上传端点(辅助,用于看图说话) @router.post("/upload-image") def upload_image(file: UploadFile = File(...)):# 简化:实际中上传到云存储,返回 URL。这里返回假 URLreturn {"image_url": f"uploaded/{file.filename}"}
-
main.py(主文件):
from fastapi import FastAPI from .routes import routerapp = FastAPI() app.include_router(router)if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000)
-
-
运行后端:
python main.py
- 访问 http://localhost:8000/docs 查看 API 文档(FastAPI 自带 Swagger)。
步骤 3: 连接数据库和测试
- 数据库已在 https://bja.sealos.run/ 启动,使用提供的 URI。
- 测试:用 Postman 或 curl 测试注册/登录,然后调用功能端点(需带 JWT token)。
步骤 4: 前端(Vue)集成和部署到 Sealos
- 前端简要:用 Vue CLI 创建项目(npm install -g @vue/cli; vue create frontend-project)。在 Vue 中用 Axios 调用后端 API(e.g., /register, /token, /image-description)。
- 前后端交互:前端发送 HTTP 请求到后端(e.g., POST /image-description with token)。
- 部署到 Sealos:
- 在 https://cloud.sealos.io/ 创建应用。
- 上传后端代码(Git 推送或直接上传)。
- 设置环境变量(从 .env)。
- 部署前端类似(Vue 构建后上传)。
- Sealos 会提供域名。
步骤 5: 删除多余东西
- 在项目中,只保留以上文件。删除任何自动生成的如 README、tests 等。
- 用
git init
版本控制,commit 只核心文件。
标签:前后端交互、数据库、FastAPI、Vue、MongoDB
前言
很多新手在开发网站时,最头疼的就是前后端交互和数据库连接。别崩溃!这篇文章将从零解释这些概念,并用一个实际项目(用户登录后使用图像描述和生成工具)来演示。项目后端用 Python (FastAPI),前端用 Vue,数据库用 MongoDB。我们会覆盖安装、代码实现、交互流程。环境安装用清华源加速。
假设您是小白,我会一步步说清楚。
一、基本概念
1.1 前端(Vue)
- 作用:用户界面。Vue 是一个 JS 框架,用于构建动态页面(如上传图像、输入文本、显示结果)。
- 如何与后端交互:前端通过 HTTP 请求(GET/POST)调用后端 API。例如,用 Axios 库发送请求,带上数据(如图像文件)和认证 token。
1.2 后端(Python FastAPI)
- 作用:处理逻辑、数据库操作、调用外部 API(如 DeepSeek)。
- API 端点:后端暴露 URL(如 /image-description),前端调用它。后端返回 JSON 数据。
1.3 数据库(MongoDB)
- 作用:存储数据,如用户账号。NoSQL 数据库,适合灵活数据。
- 交互:后端用 pymongo 连接数据库,执行增删改查(CRUD)。例如,注册时插入用户记录。
1.4 交互流程
- 用户在前端注册/登录 → 前端 POST 到后端 /register 或 /token → 后端验证并存入数据库 → 返回 token。
- 用户选择功能(如看图说话) → 前端上传图像到后端 /upload-image → 后端返回 URL。
- 前端 POST 到 /image-description(带 token 和 URL) → 后端调用 DeepSeek API + 数据库检查权限 → 返回描述 → 前端显示在页面右侧。
- 安全:用 JWT token 认证,确保只有登录用户能访问功能。
二、环境准备
- 安装 Python 3.10+。
- 创建虚拟环境:
python -m venv myenv; source myenv/bin/activate
。 - 用清华源安装:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
。 - 安装依赖:
pip install fastapi uvicorn pymongo requests pydantic python-dotenv passlib[bcrypt] python-jose[cryptography]
。 - MongoDB:用提供的 URI 连接(已在 Sealos 启动)。
三、后端实现(Python)
项目结构:
backend-project/
├── main.py
├── models.py
├── auth.py
├── routes.py
└── .env
代码详见上文(步骤 2)。关键点:
- 数据库交互:用
MongoClient(MONGO_URI)
连接,collection.insert_one()
存数据,find_one()
查询。 - 前后端交互:FastAPI 的
@router.post("/endpoint")
定义 API,前端用 fetch 或 Axios 调用。 - API 调用:用 requests 库 POST 到 DeepSeek,带 API Key。
运行:python main.py
,访问 localhost:8000/docs 测试。
四、前端实现(Vue)
- 安装 Vue:
npm install -g @vue/cli; vue create frontend-project
。 - 安装 Axios:
npm install axios
。 - 示例组件(src/components/ImageDescription.vue):
<template><div><input type="file" @change="uploadImage" /><button @click="describe">描述</button><p>{{ description }}</p></div> </template><script> import axios from 'axios'; export default {data() { return { imageUrl: '', description: '' }; },methods: {async uploadImage(event) {const formData = new FormData();formData.append('file', event.target.files[0]);const res = await axios.post('http://backend-url/upload-image', formData);this.imageUrl = res.data.image_url;},async describe() {const token = localStorage.getItem('token'); // 从登录获取const res = await axios.post('http://backend-url/image-description', { image_url: this.imageUrl }, { headers: { Authorization: `Bearer ${token}` } });this.description = res.data;}} }; </script>
- 登录组件类似:POST 到 /token,存 token 到 localStorage。
五、数据库交互详解
- 连接:
client = MongoClient(uri); db = client['mydatabase']; collection = db['users']
。 - CRUD 示例:
- 插入:
collection.insert_one({"key": "value"})
。 - 查询:
user = collection.find_one({"username": "test"})
。
- 插入:
- 与前后端结合:后端收到前端请求后,查询数据库验证用户,然后处理逻辑。
六、部署到 Sealos
- 在 https://cloud.sealos.io/ 创建应用。
- 上传代码,设置 .env。
- 部署后,前端调用后端域名。
七、常见问题
- 跨域:后端加 CORS(pip install fastapi[all],app.add_middleware(CORSMiddleware))。
- 错误:检查 token、API Key。
- 性能:用异步(FastAPI 支持)。
如果有问题,评论区留言!