基于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登录后可管理内容。
功能扩展建议
- 添加用户注册功能
- 实现文章分类和标签
- 增加富文本编辑器
- 添加文件上传功能
- 实现权限管理系统
添加用户注册功能
项目结构
创建以下目录结构:
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