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. 项目功能扩展
在掌握了基本功能后,您可以考虑以下扩展功能:
- 用户身份验证:允许用户注册和登录,以便他们可以管理自己的博文。
- 评论功能:允许用户在博文下评论,增加互动性。
- 标签系统:为博文添加标签,便于分类和搜索。
- 富文本编辑器:使用富文本编辑器提升博文发布体验,如
TinyMCE或CKEditor。 - 分页:在首页实现博文的分页,提高用户浏览体验。
8. 小结
通过构建个人博客网站,您已经掌握了Flask的基本使用和Web开发的核心要素。项目不仅涉及后端逻辑的实现,还包括前端展示和数据管理。希望这个实践项目能激励您继续学习和探索更多Web开发的知识。
9. 练习题
- 修改项目,添加用户身份验证,使得只有注册用户才能发布和删除博文。
- 实现博文的编辑功能,在博文详细页面中添加“编辑”按钮。
- 使用Flask-WTF增加表单验证,确保用户输入合法。
- 实现搜索功能,允许用户根据标题搜索博文。

怎么样今天的内容还满意吗?再次感谢观众老爷的观看。
最后,祝您早日实现财务自由,还请给个赞,谢谢!
相关文章:
15分钟学 Python 第34天 :小项目-个人博客网站
Day 34: 小项目-个人博客网站 1. 引言 随着互联网的普及,个人博客已成为分享知识、体验和见解的一个重要平台。在这一节中,我们将使用Python的Flask框架构建一个简单的个人博客网站。我们将通过实际的项目来学习如何搭建Web应用、处理用户输入以及管理…...
从零开始实现RPC框架---------项目介绍及环境准备
一,介绍 RPC(Remote Procedure Call)远程过程调⽤,是⼀种通过⽹络从远程计算机上请求服务,⽽不需要 了解底层⽹络通信细节。RPC可以使⽤多种⽹络协议进⾏通信, 如HTTP、TCP、UDP等, 并且在 TCP/…...
论文阅读:PET/CT Cross-modal medical image fusion of lung tumors based on DCIF-GAN
摘要 背景: 基于GAN的融合方法存在训练不稳定,提取图像的局部和全局上下文语义信息能力不足,交互融合程度不够等问题 贡献: 提出双耦合交互式融合GAN(Dual-Coupled Interactive Fusion GAN,DCIF-GAN&…...
java基础 day1
学习视频链接 人机交互的小故事 微软和乔布斯借鉴了施乐实现了如今的图形化界面 图形化界面对于用户来说,操作更加容易上手,但是也存在一些问题。使用图形化界面需要加载许多图片,所以消耗内存;此外运行的速度没有命令行快 Wi…...
cpp,git,unity学习
c#中的? 1. 空值类型(Nullable Types) ? 可以用于值类型(例如 int、bool 等),使它们可以接受 null。通常,值类型不能为 null,但是通过 ? 可以表示它们是可空的。 int? number null; // …...
HTML增加文本复制模块(使用户快速复制内容到剪贴板)
增加复制模块主要是为了方便用户快速复制内容到剪贴板,通常在需要提供文本信息可以便捷复制的网页设计或应用程序中常见。以下是为文本内容添加复制按钮的一个简单实现步骤: HTML结构: 在文本旁边添加一个复制按钮,例如 <butto…...
Spring Cloud面试题收集
Spring Cloud Spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。…...
观测云对接 SkyWalking 最佳实践
简介 SkyWalking 是一个开源的 APM(应用性能监控)和可观测性分析平台,专为微服务、云原生架构和基于容器的架构设计。它提供了分布式追踪、服务网格遥测分析、度量聚合和可视化一体化的解决方案。如果您的应用中正在使用SkyWalking …...
AI少女/HS2甜心选择2 仿天刀人物卡全合集打包
内含AI少女/甜心选择2 仿天刀角色卡全合集打包共21张 下载地址:https://www.51888w.com/408.html 部分演示图:...
MISC - 第11天(练习)
前言 各位师傅大家好,我是qmx_07,今天继续讲解MISC的相关知识 john-in-the-middle 导出http数据文件里面logo.png 是旗帜图案,放到stegsolve查看 通过转换颜色,发现flag信息 flag{J0hn_th3_Sn1ff3r} [UTCTF2020]docx 附件信息…...
[3.4]【机器人运动学MATLAB实战分析】PUMA560机器人逆运动学MATLAB计算
PUMA560是六自由度关节型机器人,其6个关节都是转动副,属于6R型操作臂。各连杆坐标系如图1,连杆参数如表1所示。 图1 PUMA560机器人的各连杆坐标系 表1 PUMA560机器人的连杆参数 用代数法对其进行运动学反解。具体步骤如下: 1、求θ1 PMUMA56...
centos常用知识和命令
linux目录及结构 /etc #存配置文件 /var #存日志文件 /home #用户家目录 /root #root用户家目录 /bin #命令文件目录 /sbin #超级管理员命令目录 /dev #设备文件目录 /boot #系统启动核心目录 /lib #库文件目录 /mnt #挂载目录 /tmp #临时文件目录 /usr #用户程序存…...
基于yolov8调用本地摄像头并将读取的信息传入jsonl中
最近在做水面垃圾识别的智能船 用到了yolov8进行目标检测 修改并添加了SEAttention注意力机制 详情见其他大神 【保姆级教程|YOLOv8添加注意力机制】【1】添加SEAttention注意力机制步骤详解、训练及推理使用_yolov8添加se-CSDN博客 并且修改传统的iou方法改为添加了wise-io…...
Linux中的进程间通信之管道
管道 管道是Unix中最古老的进程间通信的形式。 我们把从一个进程连接到另一个进程的一个数据流称为一个“管道” 匿名管道 #include <unistd.h> 功能:创建一无名管道 原型 int pipe(int fd[2]); 参数 fd:文件描述符数组,其中fd[0]表示读端, fd[1]表示写端 …...
【Vue】vue2项目打包后部署刷新404,配置publicPath ./ 不生效问题
Vue Router mode,为 history 无效,建议使用默认值 hash;...
【PyTorch】生成对抗网络
生成对抗网络是什么 概念 Generative Adversarial Nets,简称GAN GAN:生成对抗网络 —— 一种可以生成特定分布数据的模型 《Generative Adversarial Nets》 Ian J Goodfellow-2014 GAN网络结构 Recent Progress on Generative Adversarial Networks …...
Vue3轻松实现前端打印功能
文章目录 1.前言2.安装配置2.1 下载安装2.2 main.js 全局配置3.综合案例3.1 设置打印区域3.2 绑定打印事件3.3 完整代码4.避坑4.1 打印表格无边框4.2 单选框复选框打印不选中4.3 去除页脚页眉4.4 打印內容不自动换行1.前言 vue3 前端打印功能主要通过插件来实现。 市面上常用的…...
SHA-1 是一种不可逆的、固定长度的哈希函数,在 Git 等场景用于生成唯一的标识符来管理对象和数据完整性
SHA-1 (Secure Hash Algorithm 1) 是一种加密哈希函数,它能将任意大小的数据(如文件、消息)转换为一个固定长度的 160 位(20 字节)哈希值。这种哈希值通常以 40 个十六进制字符的形式表示,是数据的“指纹”…...
Activiti7 工作流引擎学习
目录 一. 什么是 Activiti 工作流引擎 二. Activiti 流程创建步骤 三. Activiti 数据库表含义 四. BPMN 建模语言 五. Activiti 使用步骤 六. 流程定义与流程实例 一. 什么是 Activiti 工作流引擎 Activiti 是一个开源的工作流引擎,用于业务流程管理…...
pytorch使用LSTM模型进行股票预测
文章目录 tushare获取股票数据数据预处理构建模型训练模型测试模型tushare获取股票数据 提取上证指数代码为603912的股票:佳力图,时间跨度为2014-01-01到今天十年的数据。 import tushare as ts pro = ts.pro_api()#准备训练集数据df = ts.pro_bar(ts_code=603912.SH, star…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
