当前位置: 首页 > news >正文

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. 实现搜索功能,允许用户根据标题搜索博文。

在这里插入图片描述

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

相关文章:

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

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

从零开始实现RPC框架---------项目介绍及环境准备

一&#xff0c;介绍 RPC&#xff08;Remote Procedure Call&#xff09;远程过程调⽤&#xff0c;是⼀种通过⽹络从远程计算机上请求服务&#xff0c;⽽不需要 了解底层⽹络通信细节。RPC可以使⽤多种⽹络协议进⾏通信&#xff0c; 如HTTP、TCP、UDP等&#xff0c; 并且在 TCP/…...

论文阅读:PET/CT Cross-modal medical image fusion of lung tumors based on DCIF-GAN

摘要 背景&#xff1a; 基于GAN的融合方法存在训练不稳定&#xff0c;提取图像的局部和全局上下文语义信息能力不足&#xff0c;交互融合程度不够等问题 贡献&#xff1a; 提出双耦合交互式融合GAN&#xff08;Dual-Coupled Interactive Fusion GAN&#xff0c;DCIF-GAN&…...

java基础 day1

学习视频链接 人机交互的小故事 微软和乔布斯借鉴了施乐实现了如今的图形化界面 图形化界面对于用户来说&#xff0c;操作更加容易上手&#xff0c;但是也存在一些问题。使用图形化界面需要加载许多图片&#xff0c;所以消耗内存&#xff1b;此外运行的速度没有命令行快 Wi…...

cpp,git,unity学习

c#中的? 1. 空值类型&#xff08;Nullable Types&#xff09; ? 可以用于值类型&#xff08;例如 int、bool 等&#xff09;&#xff0c;使它们可以接受 null。通常&#xff0c;值类型不能为 null&#xff0c;但是通过 ? 可以表示它们是可空的。 int? number null; // …...

HTML增加文本复制模块(使用户快速复制内容到剪贴板)

增加复制模块主要是为了方便用户快速复制内容到剪贴板&#xff0c;通常在需要提供文本信息可以便捷复制的网页设计或应用程序中常见。以下是为文本内容添加复制按钮的一个简单实现步骤&#xff1a; HTML结构&#xff1a; 在文本旁边添加一个复制按钮&#xff0c;例如 <butto…...

Spring Cloud面试题收集

Spring Cloud Spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等&#xff0c;都可以用 spring boot 的开发风格做到一键启动和部署。…...

观测云对接 SkyWalking 最佳实践

简介 SkyWalking 是一个开源的 APM&#xff08;应用性能监控&#xff09;和可观测性分析平台&#xff0c;专为微服务、云原生架构和基于容器的架构设计。它提供了分布式追踪、服务网格遥测分析、度量聚合和可视化一体化的解决方案。如果您的应用中正在使用SkyWalking &#xf…...

AI少女/HS2甜心选择2 仿天刀人物卡全合集打包

内含AI少女/甜心选择2 仿天刀角色卡全合集打包共21张 下载地址&#xff1a;https://www.51888w.com/408.html 部分演示图&#xff1a;...

MISC - 第11天(练习)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天继续讲解MISC的相关知识 john-in-the-middle 导出http数据文件里面logo.png 是旗帜图案&#xff0c;放到stegsolve查看 通过转换颜色&#xff0c;发现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&#xff1a;文件描述符数组,其中fd[0]表示读端, fd[1]表示写端 …...

【Vue】vue2项目打包后部署刷新404,配置publicPath ./ 不生效问题

Vue Router mode&#xff0c;为 history 无效&#xff0c;建议使用默认值 hash&#xff1b;...

【PyTorch】生成对抗网络

生成对抗网络是什么 概念 Generative Adversarial Nets&#xff0c;简称GAN GAN&#xff1a;生成对抗网络 —— 一种可以生成特定分布数据的模型 《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) 是一种加密哈希函数&#xff0c;它能将任意大小的数据&#xff08;如文件、消息&#xff09;转换为一个固定长度的 160 位&#xff08;20 字节&#xff09;哈希值。这种哈希值通常以 40 个十六进制字符的形式表示&#xff0c;是数据的“指纹”…...

Activiti7 工作流引擎学习

目录 一. 什么是 Activiti 工作流引擎 二. Activiti 流程创建步骤 三. Activiti 数据库表含义 四. BPMN 建模语言 五. Activiti 使用步骤 六. 流程定义与流程实例 一. 什么是 Activiti 工作流引擎 Activiti 是一个开源的工作流引擎&#xff0c;用于业务流程管理&#xf…...

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…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...