Flask3.1打造极简CMS系统

基于Flask 3.1和Python 3.13的简易CMS

以下是一个基于Flask 3.1和Python 3.13的简易CMS管理系统实现方案,包含核心功能和可运行代码示例。

环境准备

安装Flask和其他依赖库:

复制代码
pip install flask==3.1.0 flask-sqlalchemy flask-login

配置数据库

config.py中设置SQLite数据库URI:

复制代码
import os

basedir = os.path.abspath(os.path.dirname(__file__))

class Config:
    SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'app.db')
    SQLALCHEMY_TRACK_MODIFICATIONS = False

项目结构

复制代码
/cms_app
  /static
  /templates
    base.html
    login.html
    dashboard.html
    posts.html
  app.py
  config.py

核心代码实现

配置文件和初始化(config.py
复制代码
import os

class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'your-secret-key-here'
    SQLALCHEMY_DATABASE_URI = 'sqlite:///site.db'
    SQLALCHEMY_TRACK_MODIFICATIONS = False
主应用文件(app.py
复制代码
from flask import Flask, render_template, redirect, url_for, request
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required
from config import Config

app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
login_manager = LoginManager(app)
login_manager.login_view = 'login'

# 用户模型
class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    password = db.Column(db.String(120), nullable=False)

# 内容模型
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)

@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))

@app.route('/')
@login_required
def dashboard():
    posts = Post.query.all()
    return render_template('dashboard.html', posts=posts)

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        user = User.query.filter_by(username=username).first()
        if user and user.password == password:
            login_user(user)
            return redirect(url_for('dashboard'))
    return render_template('login.html')

@app.route('/logout')
@login_required
def logout():
    logout_user()
    return redirect(url_for('login'))

@app.route('/post/new', methods=['GET', 'POST'])
@login_required
def new_post():
    if request.method == 'POST':
        post = Post(title=request.form['title'], content=request.form['content'])
        db.session.add(post)
        db.session.commit()
        return redirect(url_for('dashboard'))
    return render_template('new_post.html')

if __name__ == '__main__':
    with app.app_context():
        db.create_all()
    app.run(debug=True)

模板文件示例

base.html(模板基础文件)
复制代码
<!DOCTYPE html>
<html>
<head>
    <title>CMS System</title>
</head>
<body>
    {% block content %}{% endblock %}
</body>
</html>
login.html(登录页面)
复制代码
{% extends "base.html" %}
{% block content %}
<h2>Login</h2>
<form method="POST">
    <input type="text" name="username" placeholder="Username" required>
    <input type="password" name="password" placeholder="Password" required>
    <button type="submit">Login</button>
</form>
{% endblock %}

运行系统

创建初始数据库和用户:

复制代码
from app import app, db, User
with app.app_context():
    db.create_all()
    admin = User(username='admin', password='admin123')
    db.session.add(admin)
    db.session.commit()

启动开发服务器:

复制代码
python app.py

系统将运行在http://127.0.0.1:5000,使用admin/admin123登录后可管理内容。

功能扩展建议

  1. 添加用户注册功能
  2. 实现文章分类和标签
  3. 增加富文本编辑器
  4. 添加文件上传功能
  5. 实现权限管理系统

添加用户注册功能

项目结构

创建以下目录结构:

复制代码
app/
  __init__.py
  models.py
  routes.py
  templates/
    register.html
    login.html
    dashboard.html
config.py
run.py

初始化Flask应用

app/__init__.py中创建应用实例:

复制代码
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import Config

app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)

from app import routes, models

定义用户模型

app/models.py中创建User模型:

复制代码
from app import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    password_hash = db.Column(db.String(128))

    def __repr__(self):
        return f'<User {self.username}>'

创建路由和视图

app/routes.py中实现CRUD操作:

复制代码
from flask import render_template, redirect, url_for, request, flash
from app import app, db
from app.models import User

@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        username = request.form['username']
        email = request.form['email']
        password = request.form['password']
        
        existing_user = User.query.filter_by(username=username).first()
        if existing_user:
            flash('Username already exists')
            return redirect(url_for('register'))
            
        new_user = User(username=username, email=email, password_hash=password)
        db.session.add(new_user)
        db.session.commit()
        flash('Registration successful')
        return redirect(url_for('login'))
    return render_template('register.html')

@app.route('/users')
def users():
    users = User.query.all()
    return render_template('dashboard.html', users=users)

@app.route('/delete/<int:id>')
def delete(id):
    user = User.query.get_or_404(id)
    db.session.delete(user)
    db.session.commit()
    return redirect(url_for('users'))

创建模板文件

templates/register.html中创建注册表单:

复制代码
<!DOCTYPE html>
<html>
<head>
    <title>Register</title>
</head>
<body>
    <h1>Register</h1>
    <form method="POST" action="{{ url_for('register') }}">
        <input type="text" name="username" placeholder="Username" required>
        <input type="email" name="email" placeholder="Email" required>
        <input type="password" name="password" placeholder="Password" required>
        <button type="submit">Register</button>
    </form>
</body>
</html>

templates/dashboard.html中显示用户列表:

复制代码
<!DOCTYPE html>
<html>
<head>
    <title>Users</title>
</head>
<body>
    <h1>User List</h1>
    <ul>
        {% for user in users %}
        <li>
            {{ user.username }} - {{ user.email }}
            <a href="{{ url_for('delete', id=user.id) }}">Delete</a>
        </li>
        {% endfor %}
    </ul>
</body>
</html>

运行应用

run.py中创建启动脚本:

复制代码
from app import app, db
from app.models import User

@app.before_first_request
def create_tables():
    db.create_all()

if __name__ == '__main__':
    app.run(debug=True)

运行应用:

复制代码
python run.py

数据库迁移

建议使用Flask-Migrate处理数据库变更:

复制代码
pip install flask-migrate

修改app/__init__.py

复制代码
from flask_migrate import Migrate

migrate = Migrate(app, db)

初始化迁移仓库:

复制代码
flask db init
flask db migrate -m "initial migration"
flask db upgrade
相关推荐
Monkey的自我迭代11 分钟前
Python标准库:时间与随机数全解析
前端·python·数据挖掘
小王子102425 分钟前
Django+DRF 实战:自定义异常处理流程
后端·django·web开发
考虑考虑28 分钟前
go中的切片
后端·go
SsummerC30 分钟前
【leetcode100】下一个排列
python·算法·leetcode
Kelaru1 小时前
本地Qwen中医问诊小程序系统开发
python·ai·小程序·flask·project
Menger_Wen1 小时前
分析新旧因子相关性
python·机器学习·区块链
天南星1 小时前
java-WebSocket在Java生态中的发展历程
java·后端·websocket
工藤学编程2 小时前
分库分表之实战-sharding-JDBC绑定表配置实战
数据库·分布式·后端·sql·mysql
fmvrj342022 小时前
云原生:数字化转型的核心引擎
后端
RAY_01042 小时前
Python—数据容器
开发语言·python