15分钟学 Python 第34天 :小项目-个人博客网站

Day 34: 小项目-个人博客网站

1. 引言

随着互联网的普及,个人博客已成为分享知识、体验和见解的一个重要平台。在这一节中,我们将使用Python的Flask框架构建一个简单的个人博客网站。我们将通过实际的项目来学习如何搭建Web应用、处理用户输入以及管理数据。

2. 项目概述

我们的个人博客网站将具备以下基本功能:

  • 用户能够查看所有博文
  • 用户能够查看某一博文的详细内容
  • 用户能够发布新的博文
  • 用户能够删除自己的博文
  • 后端使用Flask框架,数据库使用SQLite

2.1 技术栈

技术描述
Python编程语言
Flask微框架,用于构建Web应用
SQLite轻量级关系型数据库
HTML/CSS前端页面结构和样式

3. 环境准备

3.1 安装必要的库

首先,确保您已经安装了Python和pip。然后在命令行中运行以下命令来安装Flask:

pip install Flask Flask-SQLAlchemy

3.2 创建项目结构

创建项目结构,如下所示:

personal_blog/
├── app.py
├── templates/
│   ├── base.html
│   ├── index.html
│   └── post.html
└── static/└── style.css

4. 基础代码示例

4.1 app.py

app.py中,我们将配置Flask应用,并建立简单的路由。

from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)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)with app.app_context():db.create_all()@app.route('/')
def index():posts = Post.query.all()return render_template('index.html', posts=posts)@app.route('/post/<int:post_id>')
def post(post_id):post = Post.query.get_or_404(post_id)return render_template('post.html', post=post)@app.route('/new', methods=['GET', 'POST'])
def new_post():if request.method == 'POST':title = request.form['title']content = request.form['content']new_post = Post(title=title, content=content)db.session.add(new_post)db.session.commit()return redirect(url_for('index'))return render_template('new_post.html')@app.route('/delete/<int:post_id>')
def delete_post(post_id):post = Post.query.get_or_404(post_id)db.session.delete(post)db.session.commit()return redirect(url_for('index'))if __name__ == '__main__':app.run(debug=True)

4.2 模板文件

4.2.1 base.html

这是基础模板,所有页面都将基于此模板。

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>个人博客</title><link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body><div class="container"><header><h1>个人博客</h1><nav><a href="{{ url_for('index') }}">首页</a><a href="{{ url_for('new_post') }}">发表新博文</a></nav></header><main>{% block content %}{% endblock %}</main></div>
</body>
</html>
4.2.2 index.html

这是博客首页,显示所有博文的列表。

{% extends 'base.html' %}{% block content %}<h2>博文列表</h2><ul>{% for post in posts %}<li><a href="{{ url_for('post', post_id=post.id) }}">{{ post.title }}</a><a href="{{ url_for('delete_post', post_id=post.id) }}">删除</a></li>{% endfor %}</ul>
{% endblock %}
4.2.3 post.html

这是单个博文的详细页面。

{% extends 'base.html' %}{% block content %}<h2>{{ post.title }}</h2><p>{{ post.content }}</p><a href="{{ url_for('index') }}">返回首页</a>
{% endblock %}
4.2.4 new_post.html

这是发表新博文的页面。

{% extends 'base.html' %}{% block content %}<h2>发表新博文</h2><form method="POST"><input type="text" name="title" placeholder="标题" required><textarea name="content" placeholder="内容" required></textarea><button type="submit">提交</button></form>
{% endblock %}

4.3 样式文件

style.css

为博客添加基本样式。

body {font-family: Arial, sans-serif;line-height: 1.6;
}.container {max-width: 800px;margin: auto;padding: 20px;
}header {margin-bottom: 20px;
}nav a {margin-right: 15px;
}

5. 代码运行流程图

以下是应用的运行流程图,展示了用户如何与系统进行交互。

开始├── 用户访问首页 /│   ├── 查询所有博文│   └── 显示博文列表├── 用户点击某博文│   ├── 根据ID查询博文│   └── 显示博文详细信息├── 用户点击发表新博文│   ├── 显示发表新博文表单│   ├── 用户提交表单│   ├── 存储新博文到数据库│   └── 重定向到首页└── 用户点击删除博文├── 根据ID查询博文├── 删除博文└── 重定向到首页
结束

6. 运行项目

要运行个人博客网站,您只需在终端中执行以下命令:

python app.py

然后在浏览器中访问 http://127.0.0.1:5000/,您将看到博客首页。

6.1 数据库初始化

第一次运行时,app.py会自动创建一个SQLite数据库blog.db,您可以在项目目录下找到此文件。通过执行上述代码,您可以开始在该数据库中添加博文。

7. 项目功能扩展

在掌握了基本功能后,您可以考虑以下扩展功能:

  1. 用户身份验证:允许用户注册和登录,以便他们可以管理自己的博文。
  2. 评论功能:允许用户在博文下评论,增加互动性。
  3. 标签系统:为博文添加标签,便于分类和搜索。
  4. 富文本编辑器:使用富文本编辑器提升博文发布体验,如 TinyMCECKEditor
  5. 分页:在首页实现博文的分页,提高用户浏览体验。

8. 小结

通过构建个人博客网站,您已经掌握了Flask的基本使用和Web开发的核心要素。项目不仅涉及后端逻辑的实现,还包括前端展示和数据管理。希望这个实践项目能激励您继续学习和探索更多Web开发的知识。

9. 练习题

  1. 修改项目,添加用户身份验证,使得只有注册用户才能发布和删除博文。
  2. 实现博文的编辑功能,在博文详细页面中添加“编辑”按钮。
  3. 使用Flask-WTF增加表单验证,确保用户输入合法。
  4. 实现搜索功能,允许用户根据标题搜索博文。

怎么样今天的内容还满意吗?再次感谢观众老爷的观看。
最后,祝您早日实现财务自由,还请给个赞,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/54240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM 基础、GC 算法与 JProfiler 监控工具详解

目录 1、引言 1.1 JVM内存与本地内存 1.2 JVM与JDK的关系 2、JVM基础 2.1 JVM&#xff08;Java Virtual Machine&#xff09; 2.2 Java与JVM的关系 2.3 JVM的内存结构 2.3.1 堆内存 2.3.2 栈内存 2.3.3 方法区 2.3.4 本地方法栈 2.3.5 程序计数器&#xff08;PC寄存…

【MySQL 07】内置函数

目录 1.日期函数 日期函数使用场景&#xff1a; 2.字符串函数 字符串函数使用场景&#xff1a; 3.数学函数 4.控制流函数 1.日期函数 函数示例&#xff1a; 1.在日期的基础上加日期 在该日期下&#xff0c;加上10天。 2.在日期的基础上减去时间 在该日期下减去2天 3.计算两…

PostgreSQL是否有等待事件

PostgreSQL是否有等待事件 PostgreSQL 提供了等待事件&#xff08;Wait Events&#xff09;的机制&#xff0c;用于监控数据库运行过程中因资源争用而导致的等待情况。这些等待事件可以帮助数据库管理员识别导致性能问题的瓶颈&#xff0c;例如锁冲突、I/O 等待等。 什么是等…

Android Context是什么?有很多的context他们之间有什么区别?什么时候该使用哪个?

目录 一、Context是什么&#xff1f; 在Android中&#xff0c;Context是一个抽象类 &#xff0c;它代表了应用程序的当前状态&#xff0c;包括资源和类加载器等&#xff0c;它提供了一个应用运行所需的信息&#xff0c;比如我们要获取资源 &#xff0c;那么需要她&#xff0c;…

雷池 WAF 如何配置才能正确获取到源 IP

经常有大哥反馈说雷池攻击日志里显示的 IP 有问题。 这里我来讲一下为什么一些情况下雷池显示的攻击 IP 会有问题。 问题说明 默认情况下&#xff0c;雷池会通过 HTTP 连接的 Socket 套接字读取客户端 IP。在雷池作为最外层网管设备的时候这没有问题&#xff0c;雷池获取到的…

【寻找one piece的算法之路】——双指针算法!他与她是否会相遇呢?

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;寻找one piece的刷题之路 什么是双指针算法 双指针算法是一种常用的编程技巧&#xff0c;尤其在处理数组和字符串问题时非常有效。这种方法的核心思想是使用两个指针来遍历数据结构&#xff0c;这两…

UniVue大版本更新:UniVue2.0.0-preview

大版本发布说明 距离上次更新好像已经过去很久了&#xff0c;最近太忙了没时间维护新版本&#xff0c;也是自己在使用的过程中发现了很多问题也有了更多的灵感&#xff0c;由于和之前的版本区别太大&#xff0c;决定重新开一个大版本。这个UniVue2之后的版本追求是性能&#xf…

【HTML+CSS】仿电子美学打造响应式留言板

创建一个响应式的留言板 在这篇文章中&#xff0c;我们将学习如何创建一个简单而美观的留言板&#xff0c;它将包括基本的样式和动画效果&#xff0c;以及响应式设计&#xff0c;确保在不同设备上都能良好显示。 HTML 结构 首先&#xff0c;我们创建基本的HTML结构。留言板由…

Android SQLite的基本使用、生成Excel文件保存到本地

1. Android SQLite的基本使用 1.1. SQLiteOpenHelper Android 底层已经通过一个SQLiteOpenHelper的抽象类将数据库的创建&#xff0c;以及修改&#xff0c;更新等都放在了里面。 要使用它必须实现它的OnCreate(SQLiteDatabase db)&#xff0c;onUpgrade(SQLiteDatabase db, int…

YOLOv11改进 | 独家创新- 注意力篇 | YOLOv11结合全新多尺度线性注意力机制MLAttention(全网独家创新)

1. MLAttention介绍 (1). 多尺度卷积操作&#xff1a;MLAttention通过多尺度卷积操作来增强不同尺度的特征表达能力。采用了多种卷积核尺寸&#xff08;例如5x5、1x7、7x1、1x11、11x1、1x21、21x1&#xff09;的深度可分离卷积来捕捉不同感受野的特征。较小的卷积核擅长捕捉细…

我店生活系统小程序开发功能解析

一、市场定位与目标用户 市场定位&#xff1a;我店生活小程序旨在打造一个集购物、娱乐、服务于一体的综合性本地生活服务平台&#xff0c;满足用户多样化的生活需求。通过整合周边生活服务资源&#xff0c;提供一站式的生活服务体验。 目标用户&#xff1a;主要面向中青年人…

TypeScript 算法手册【快速排序】

文章目录 1. 快速排序简介1.1 快速排序定义1.2 快速排序特点 2. 快速排序步骤过程拆解2.1 选择基准元素2.2 划分数组2.3 递归排序 3. 快速排序的优化3.1 三数取中法选择基准3.2 插入排序与快速排序结合案例代码和动态图 4. 快速排序的优点5. 快速排序的缺点总结 【 已更新完 Ty…

从零开始Ubuntu24.04上Docker构建自动化部署(二)Docker-安装docker-compose

安装docker compose 下载 sudo curl -SL https://github.com/docker/compose/releases/download/v2.29.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose 授权 sudo chmod x /usr/local/bin/docker-compose 查看版本 sudo docker-compose --version 创建一…

C语言基础(7)之操作符(1)(详细介绍)

目录 1. 各种操作符介绍 1.1 操作符汇总表 2. 移位操作符 2.1 移位操作符知识拓展 —— 原码、反码、补码 2.2 移位操作符讲解 2.2.1 右移操作符 ( >> ) 2.2.2 左移操作符 ( << ) 3. 位操作符 3.1 & (按位与) 3.2 | (按位或) 3.3 ^ (按位异或) 3.4…

排序算法之——归并排序,计数排序

文章目录 前言一、归并排序1. 归并排序的思想2. 归并排序时间复杂度及空间复杂度3. 归并排序代码实现1&#xff09;递归版本2&#xff09;非递归版本 二、计数排序1. 计数排序的思想2. 计数排序的时间复杂度及空间复杂度3. 计数排序代码实现 总结&#xff08;排序算法稳定性&am…

解决方案:梯度提升树(Gradient Boosting Trees)跟GBDT(Gradient Boosting Decision Trees)有什么区别

文章目录 一、现象二、解决方案梯度提升树&#xff08;GBT&#xff09;GBDT相同点区别 一、现象 在工作中&#xff0c;在机器学习中&#xff0c;时而会听到梯度提升树&#xff08;Gradient Boosting Trees&#xff09;跟GBDT&#xff08;Gradient Boosting Decision Trees&…

【JavaEE】——线程池大总结

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c; 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能够帮助到你&#xff01; 目录 引入&#xff1a;问题引入 一&#xff1a;解决方案 1&#xff1a;方案一——协程/纤程 &#xff08;1…

【完-网络安全】Windows注册表

文章目录 注册表启动项及常见作用五个根节点常见入侵方式 注册表 注册表在windows系统的配置和控制方面扮演了一个非常关键的角色&#xff0c;它既是系统全局设置的存储仓库&#xff0c;也是每个用户的设置信息的存储仓库。 启动项及常见作用 快捷键 WinR打开运行窗口&#x…

rabbitMq-----broker服务器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言管理的字段 前言 搭建一个网络服务器&#xff0c;在内部提供各个业务接口即可。 在业务处理函数中&#xff0c;每次请求过来找到对应的信道&#xff0c;通过信…

【C++】C++基础

目录 一. C关键字(C98) 二、C的第一个程序 三、命名空间 3.1.namespace的价值 3.2.namespace的定义 3.2.命名空间使用 总结&#xff1a;在项目当中第一、第二种方法搭配使用&#xff0c;第三种冲突风险非常大&#xff0c;仅适合练习使用。 四、C输入&输出 五、缺省…