Python实现简易博客系统
下面我将介绍如何使用Python实现一个简易的博客系统,包含前后端完整功能。这个系统将使用Flask作为Web框架,SQLite作为数据库,并包含用户认证、文章发布、评论等基本功能。
1. 系统架构设计
技术栈选择
- 后端:Flask (Python Web框架)
- 数据库:SQLite (轻量级数据库)
- 前端:HTML/CSS/JavaScript + Bootstrap (响应式设计)
- 认证:Flask-Login (用户会话管理)
系统功能模块
- 用户认证系统(注册、登录、登出)
- 文章管理(创建、编辑、删除、查看)
- 评论系统
- 分类与标签
- 简单的搜索功能
2. 项目结构
blog_system/
├── app.py # 主应用入口
├── models.py # 数据库模型
├── forms.py # 表单定义
├── static/ # 静态文件(CSS/JS)
│ ├── css/
│ └── js/
├── templates/ # HTML模板
│ ├── base.html # 基础模板
│ ├── auth/ # 认证相关页面
│ │ ├── login.html
│ │ └── register.html
│ ├── blog/ # 博客相关页面
│ │ ├── create.html
│ │ ├── edit.html
│ │ ├── index.html
│ │ └── post.html
│ └── layout.html # 布局模板
└── requirements.txt # 依赖包列表
3. 核心代码实现
3.1 安装依赖
首先创建requirements.txt
文件:
Flask==2.0.1
Flask-SQLAlchemy==2.5.1
Flask-Login==0.5.0
Flask-WTF==0.15.1
email-validator==1.1.3
Werkzeug==2.0.1
安装依赖:
pip install -r requirements.txt
3.2 数据库模型(models.py)
from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash
from datetime import datetimedb = SQLAlchemy()class User(UserMixin, db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(64), unique=True, nullable=False)email = db.Column(db.String(120), unique=True, nullable=False)password_hash = db.Column(db.String(128))posts = db.relationship('Post', backref='author', lazy='dynamic')comments = db.relationship('Comment', backref='author', lazy='dynamic')def set_password(self, password):self.password_hash = generate_password_hash(password)def check_password(self, password):return check_password_hash(self.password_hash, password)class Post(db.Model):id = db.Column(db.Integer, primary_key=True)title = db.Column(db.String(100), nullable=False)content = db.Column(db.Text, nullable=False)created_at = db.Column(db.DateTime, default=datetime.utcnow)updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)comments = db.relationship('Comment', backref='post', lazy='dynamic')category_id = db.Column(db.Integer, db.ForeignKey('category.id'))category = db.relationship('Category', backref=db.backref('posts', lazy=True))def to_dict(self):return {'id': self.id,'title': self.title,'content': self.content,'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S'),'author': self.author.username,'comments_count': self.comments.count()}class Comment(db.Model):id = db.Column(db.Integer, primary_key=True)content = db.Column(db.Text, nullable=False)created_at = db.Column(db.DateTime, default=datetime.utcnow)user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)post_id = db.Column(db.Integer, db.ForeignKey('post.id'), nullable=False)class Category(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(50), unique=True, nullable=False)
3.3 表单定义(forms.py)
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, TextAreaField, SelectField
from wtforms.validators import DataRequired, Email, EqualTo, ValidationError, Length
from models import Userclass RegistrationForm(FlaskForm):username = StringField('用户名', validators=[DataRequired(), Length(min=2, max=20)])email = StringField('邮箱', validators=[DataRequired(), Email()])