基于Python的Web应用开发:使用Flask框架实现一个简单的博客系统

07-02 14阅读

在当今互联网时代,Web 应用已经成为人们日常生活中不可或缺的一部分。从社交网络到电商平台,从在线办公到内容管理系统,Web 应用无处不在。本篇文章将介绍如何使用 Python 的 Flask 框架构建一个基础的博客系统,并展示完整的代码示例。


项目简介

我们将构建一个功能相对完整的博客系统,具备以下基本功能:

用户注册与登录发布文章查看文章列表编辑和删除自己的文章使用 SQLite 数据库存储数据

该项目适合刚接触 Web 开发的新手,同时也可作为进一步学习更复杂项目的起点。


环境准备

所需技术栈:

Python 3.8+Flask(轻量级 Web 框架)SQLite(嵌入式数据库)Jinja2(模板引擎)Werkzeug(密码安全处理)

安装依赖包:

pip install flask flask-wtf

项目结构设计

我们采用经典的 MVC 架构组织代码:

flask_blog/├── app.py                  # 主程序入口├── config.py               # 配置文件├── models.py               # 数据模型定义├── forms.py                # 表单定义├── templates/              # HTML 模板目录│   ├── index.html│   ├── login.html│   └── ...└── instance/               # SQLite 数据库存放位置

核心代码实现

1. config.py —— 配置文件

import osclass Config:    SECRET_KEY = os.environ.get('SECRET_KEY') or 'your-secret-key'    SQLALCHEMY_DATABASE_URI = 'sqlite:///site.db'    SQLALCHEMY_TRACK_MODIFICATIONS = False

2. models.py —— 数据库模型

from flask_sqlalchemy import SQLAlchemyfrom datetime import datetimefrom werkzeug.security import generate_password_hash, check_password_hashdb = SQLAlchemy()class User(db.Model):    id = db.Column(db.Integer, primary_key=True)    username = db.Column(db.String(64), unique=True, nullable=False)    password_hash = db.Column(db.String(128))    posts = db.relationship('Post', backref='author', lazy=True)    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)    date_posted = db.Column(db.DateTime, default=datetime.utcnow)    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

3. forms.py —— 表单类

from flask_wtf import FlaskFormfrom wtforms import StringField, PasswordField, TextAreaField, SubmitFieldfrom wtforms.validators import DataRequired, Lengthclass RegistrationForm(FlaskForm):    username = StringField('Username', validators=[DataRequired(), Length(min=2, max=20)])    password = PasswordField('Password', validators=[DataRequired()])    submit = SubmitField('Sign Up')class LoginForm(FlaskForm):    username = StringField('Username', validators=[DataRequired()])    password = PasswordField('Password', validators=[DataRequired()])    submit = SubmitField('Login')class PostForm(FlaskForm):    title = StringField('Title', validators=[DataRequired()])    content = TextAreaField('Content', validators=[DataRequired()])    submit = SubmitField('Publish')

4. app.py —— 核心逻辑

from flask import Flask, render_template, redirect, url_for, flash, session, requestfrom config import Configfrom models import db, User, Postfrom forms import RegistrationForm, LoginForm, PostFormfrom functools import wrapsapp = Flask(__name__)app.config.from_object(Config())# 初始化数据库db.init_app(app)# 登录验证装饰器def login_required(f):    @wraps(f)    def decorated_function(*args, **kwargs):        if 'user_id' not in session:            flash('请先登录!')            return redirect(url_for('login'))        return f(*args, **kwargs)    return decorated_function@app.route('/')def index():    posts = Post.query.order_by(Post.date_posted.desc()).all()    return render_template('index.html', posts=posts)@app.route('/register', methods=['GET', 'POST'])def register():    form = RegistrationForm()    if form.validate_on_submit():        user = User(username=form.username.data)        user.set_password(form.password.data)        db.session.add(user)        db.session.commit()        flash('注册成功,请登录!')        return redirect(url_for('login'))    return render_template('register.html', form=form)@app.route('/login', methods=['GET', 'POST'])def login():    form = LoginForm()    if form.validate_on_submit():        user = User.query.filter_by(username=form.username.data).first()        if user and user.check_password(form.password.data):            session['user_id'] = user.id            flash('登录成功!')            return redirect(url_for('index'))        else:            flash('用户名或密码错误!')    return render_template('login.html', form=form)@app.route('/logout')def logout():    session.pop('user_id', None)    flash('您已退出登录。')    return redirect(url_for('index'))@app.route('/post/new', methods=['GET', 'POST'])@login_requireddef new_post():    form = PostForm()    if form.validate_on_submit():        post = Post(title=form.title.data, content=form.content.data, author_id=session['user_id'])        db.session.add(post)        db.session.commit()        flash('文章发布成功!')        return redirect(url_for('index'))    return render_template('new_post.html', form=form)@app.route('/post/<int:post_id>/edit', methods=['GET', 'POST'])@login_requireddef edit_post(post_id):    post = Post.query.get_or_404(post_id)    if post.author.id != session['user_id']:        flash('你没有权限编辑此文章。')        return redirect(url_for('index'))    form = PostForm(obj=post)    if form.validate_on_submit():        form.populate_obj(post)        db.session.commit()        flash('文章更新成功!')        return redirect(url_for('index'))    return render_template('edit_post.html', form=form)@app.route('/post/<int:post_id>/delete', methods=['POST'])@login_requireddef delete_post(post_id):    post = Post.query.get_or_404(post_id)    if post.author.id != session['user_id']:        flash('你没有权限删除此文章。')        return redirect(url_for('index'))    db.session.delete(post)    db.session.commit()    flash('文章已删除。')    return redirect(url_for('index'))if __name__ == '__main__':    with app.app_context():        db.create_all()    app.run(debug=True)

前端模板示例

我们以 templates/index.html 为例:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>我的博客</title></head><body>    <h1>欢迎来到我的博客</h1>    {% if session.user_id %}        <a href="{{ url_for('new_post') }}">发布新文章</a>        <a href="{{ url_for('logout') }}">退出登录</a>    {% else %}        <a href="{{ url_for('login') }}">登录</a>        <a href="{{ url_for('register') }}">注册</a>    {% endif %}    <hr>    {% for post in posts %}        <div style="margin-bottom: 20px;">            <h3>{{ post.title }}</h3>            <p>{{ post.content[:200] }}...</p>            <small>{{ post.date_posted.strftime('%Y-%m-%d') }}</small>            {% if session.user_id == post.author.id %}                <br>                <a href="{{ url_for('edit_post', post_id=post.id) }}">编辑</a>                <form action="{{ url_for('delete_post', post_id=post.id) }}" method="POST">                    <input type="submit" value="删除">                </form>            {% endif %}        </div>    {% endfor %}</body></html>

运行项目

确保你已经安装了所有依赖后,在终端中执行:

python app.py

访问 http://localhost:5000,即可看到你的博客首页。


总结

本文通过使用 Flask 框架,展示了如何搭建一个基于 Python 的博客系统。我们实现了用户管理、文章发布与编辑等基本功能,并使用 SQLite 作为数据库。虽然该系统还比较简单,但其结构清晰、易于扩展,非常适合初学者学习和实践。

如果你有兴趣继续深入,可以尝试以下方向进行拓展:

添加 Markdown 支持(使用 Markdownmistune)引入 Bootstrap 美化页面使用 JWT 实现 Token 登录认证将数据库更换为 MySQL 或 PostgreSQL部署上线(如使用 Gunicorn + Nginx + Docker)

完整项目源码地址(GitHub 示例):

https://github.com/example/flask-blog-demo (虚构链接,仅为示意)


希望这篇文章能够帮助你入门 Web 开发,并激发你对 Python 和 Flask 的兴趣!

免责声明:本文来自网站作者,不代表CIUIC的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:ciuic@ciuic.com

目录[+]

您是本站第1134名访客 今日有12篇新文章

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!