下面我將介紹如何使用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()])