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

用Python实现基于Flask的简单Web应用:从零开始构建个人博客

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界

前言

在现代Web开发中,Python因其简洁、易用以及丰富的库生态系统,成为了许多开发者的首选编程语言。Flask作为一个轻量级的Python Web框架,以其简洁和灵活性深受开发者喜爱,特别适合构建小型Web应用或原型项目。本文将通过详细的步骤,讲解如何使用Flask从零构建一个简单的Web应用——个人博客。我们将介绍Flask的基本功能,如路由、模板渲染、表单处理、数据库集成等,并最终实现一个可以发布和管理文章的博客平台。

目录

  1. Flask简介及其特点
  2. 环境搭建与Flask安装
  3. 构建基础Flask应用
  4. 使用HTML模板渲染博客页面
  5. 表单处理与文章发布功能
  6. 数据库集成:使用SQLite存储博客文章
  7. 用户认证与登录系统
  8. 部署Flask应用
  9. 总结与展望

1. Flask简介及其特点

Flask是一个基于Python的微框架,所谓“微”并不意味着功能不强大,而是它的设计哲学是“只提供基础功能,其他的交给开发者自行选择扩展”。相比于像Django这样的全功能框架,Flask更适合于那些需要定制化的项目或快速原型开发。其核心特点包括:

  • 轻量级:Flask只提供必要的Web功能,如路由和请求处理,其他功能通过扩展实现。
  • 灵活性强:开发者可以根据项目需求自由选择数据库、模板引擎等技术栈。
  • 易于学习:Flask简单明了的API使其非常适合初学者。

2. 环境搭建与Flask安装

在开始开发之前,我们首先需要搭建Python开发环境,并安装Flask库。步骤如下:

2.1 安装Python

确保你已经安装了Python 3.x,可以通过以下命令检查版本:

python --version

如果尚未安装Python,可前往Python官网下载安装包。

2.2 创建虚拟环境

为了避免依赖冲突,我们建议为Flask项目创建一个独立的虚拟环境。虚拟环境可以通过以下命令创建:

python -m venv venv

激活虚拟环境:

  • Windows:
venv\Scripts\activate
  • macOS/Linux:
source venv/bin/activate

2.3 安装Flask

在虚拟环境中使用pip安装Flask:

pip install flask

通过flask --version命令检查Flask是否成功安装:

Flask 2.x.x

3. 构建基础Flask应用

在成功安装Flask之后,我们可以开始构建一个简单的Flask应用。Flask应用的核心是通过路由(Route)机制将URL映射到函数,处理用户请求并返回响应。

3.1 创建项目结构

首先,创建一个Flask项目的基本目录结构:

flask_blog/├── app.py├── static/├── templates/├── venv/

3.2 编写第一个Flask应用

app.py中编写最简单的Flask应用:

from flask import Flaskapp = Flask(__name__)@app.route('/')
def home():return "欢迎来到我的个人博客!"if __name__ == '__main__':app.run(debug=True)
  • app = Flask(__name__):初始化Flask应用。
  • @app.route('/'):定义一个路由,将URL / 映射到 home 函数。
  • app.run(debug=True):以调试模式运行服务器。

运行该应用:

python app.py

浏览器中访问http://127.0.0.1:5000,即可看到返回的“欢迎来到我的个人博客”消息。这就是一个最简单的Flask应用!

3.3 使用Jinja2模板引擎

Flask默认使用Jinja2模板引擎来渲染HTML页面。我们将HTML文件放在templates目录下,并通过Flask渲染这些模板。

创建一个名为index.html的模板文件:

<!-- templates/index.html -->
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>个人博客</title>
</head>
<body><h1>{{ title }}</h1><p>{{ description }}</p>
</body>
</html>

修改app.py文件,让Flask渲染这个模板:

from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')
def home():return render_template('index.html', title="我的个人博客", description="欢迎来到我的博客平台!")if __name__ == '__main__':app.run(debug=True)

3.4 静态文件处理

静态文件(如CSS、JavaScript、图片等)应该放在static目录下。Flask会自动从该目录中查找静态资源。

创建static/style.css文件:

/* static/style.css */
body {font-family: Arial, sans-serif;background-color: #f5f5f5;color: #333;
}

index.html中引用该CSS文件:

<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">

刷新浏览器,可以看到样式已经应用到网页上。


4. 表单处理与文章发布功能

个人博客的核心功能之一就是发布文章。我们将通过HTML表单让用户提交博客文章,并使用Flask处理表单数据。

4.1 创建文章发布表单

templates目录下创建一个new_post.html文件,用于发布文章的表单页面:

<!-- templates/new_post.html -->
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>发布新文章</title>
</head>
<body><h1>发布新文章</h1><form action="/add_post" method="POST"><label for="title">标题:</label><input type="text" id="title" name="title"><br><br><label for="content">内容:</label><textarea id="content" name="content"></textarea><br><br><button type="submit">发布文章</button></form>
</body>
</html>

4.2 处理表单提交

我们将在/add_post路由中处理用户提交的文章数据:

from flask import Flask, render_template, requestapp = Flask(__name__)posts = []  # 用于保存发布的文章@app.route('/')
def home():return render_template('index.html', title="我的个人博客", description="欢迎来到我的博客平台!")@app.route('/new_post')
def new_post():return render_template('new_post.html')@app.route('/add_post', methods=['POST'])
def add_post():title = request.form['title']content = request.form['content']posts.append({'title': title, 'content': content})return render_template('index.html', title="我的个人博客", description="文章已发布", posts=posts)if __name__ == '__main__':app.run(debug=True)

在这个例子中,我们使用request.form来获取表单数据,将其存储在posts列表中,并在主页上显示已发布的文章。

4.3 显示文章列表

index.html中,显示所有发布的文章:

<body><h1>{{ title }}</h1><p>{{ description }}</p><h2>博客文章</h2><ul>{% for post in posts %}<li><h3>{{ post.title }}</h3><p>{{ post.content }}</p></li>{% endfor %}</ul>
</body>

5. 数据库集成:使用SQLite存储博客文章

在实际的Web应用中,数据通常存储在数据库中。Flask支持多种数据库的集成,如SQLite、MySQL、PostgreSQL等。为了简单起见,我们使用SQLite数据库来存储博客文章。

5.1 设置数据库

首先,安装Flask的SQLAlchemy扩展库:

pip install flask_sqlalchemy

修改app.py,配置数据库并创建模型:

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'
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)# 初始化数据库
@app.before_first_request
def create_tables():db.create_all()@app.route('/')
def home():posts = Post.query.all()return render_template('index.html', title="我的个人博客", description="欢迎来到我的博客平台!", posts=posts)@app.route('/new_post')
def new_post():return render_template('new_post.html')@app.route('/add_post', methods=['POST'])
def add_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('home'))if __name__ == '__main__':app.run(debug=True)

在这里,我们使用SQLAlchemy ORM定义了Post模型,包含idtitlecontent字段。每次启动应用时,create_tables函数会自动创建数据库表。


6. 用户认证与登录系统

为了保护博客的管理功能,我们可以为应用添加用户认证功能。用户必须登录后才能发布文章或进行管理操作。

6.1 安装Flask-Login

首先安装Flask-Login库:

pip install flask-login

然后在app.py中集成用户登录功能:

from flask import Flask, render_template, request, redirect, url_for, flash
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_userapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
app.config['SECRET_KEY'] = 'your_secret_key'
db = SQLAlchemy(app)
login_manager = LoginManager(app)# 定义用户模型
class User(UserMixin, db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(150), unique=True, nullable=False)password = db.Column(db.String(150), nullable=False)@login_manager.user_loader
def load_user(user_id):return User.query.get(int(user_id))@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('home'))else:flash('用户名或密码错误')return render_template('login.html')@app.route('/logout')
@login_required
def logout():logout_user()return redirect(url_for('home'))@app.route('/new_post')
@login_required
def new_post():return render_template('new_post.html')if __name__ == '__main__':app.run(debug=True)

我们创建了User模型,用于存储用户信息,并通过Flask-Login处理用户登录状态。只有登录的用户才能访问发布文章的页面。


7. 部署Flask应用

在本地开发完成后,下一步是将Flask应用部署到生产环境。常用的部署平台包括:

  • Heroku:简单易用的云平台,支持快速部署Flask应用。
  • DigitalOcean:提供更高的灵活性,可以通过VPS部署Flask应用。

7.1 部署到Heroku

安装Heroku CLI:

brew tap heroku/brew && brew install heroku

然后在项目根目录初始化Git,并将应用部署到Heroku:

git init
heroku create
git add .
git commit -m "Initial commit"
git push heroku master

8. 总结

本文通过从零开始构建一个基于Flask的简单Web应用,详细展示了Flask的基本功能和用法。我们从基础的路由配置、模板渲染,到表单处理、数据库集成,逐步构建了一个可以发布文章的博客平台。最后还介绍了如何扩展功能,如用户登录认证和应用部署。通过这篇文章,读者不仅可以掌握Flask的核心概念,还能够将其应用到自己的项目中。

Flask作为轻量级框架,适合用于构建小型应用和原型,但对于更复杂的需求,可以结合Flask的各种扩展库来增强其功能,如Flask-Mail、Flask-RESTful等。未来,开发者可以根据项目需求进一步扩展功能,构建更加复杂和强大的Web应用。


相关文章:

用Python实现基于Flask的简单Web应用:从零开始构建个人博客

解锁Python编程的无限可能&#xff1a;《奇妙的Python》带你漫游代码世界 前言 在现代Web开发中&#xff0c;Python因其简洁、易用以及丰富的库生态系统&#xff0c;成为了许多开发者的首选编程语言。Flask作为一个轻量级的Python Web框架&#xff0c;以其简洁和灵活性深受开…...

IDEA的lombok插件不生效了?!!

记录一下&#xff0c;防止找不到解决方案&#xff0c;已经遇到好几次了 前面啰嗦的多&#xff0c;可以直接跳到末尾的解决方法&#xff0c;点击一下 问题现场情况 排查过程 确认引入的依赖正常 —》&#x1f197; idea 是否安装了lombok插件 --》&#x1f197; 貌似没有问题…...

CSP-S 2022 T1假期计划

CSP-S 2022 T1假期计划 先思考暴力做法&#xff0c;题目需要找到四个不相同的景点&#xff0c;那我们就枚举这四个景点&#xff0c;判断它们之间的距离是否符合条件&#xff0c;条件是任意两个点之间的距离是否大于 k k k&#xff0c;所以我们需要求出任意两点之间的距离。常用…...

为什么要学习大模型?AI在把传统软件当早餐吃掉?

前言 上周末在推特平台上有一篇写在谷歌文档里的短文&#xff0c;在国外的科技/投资圈得到了非常广泛的浏览&#xff0c;叫做 The End of Software&#xff08;软件的终结&#xff09;&#xff0c; 作者 Chris Paik 是位于纽约市的风险投资基金 Pace Capital 的创始合伙人&…...

全流程Python编程、机器学习与深度学习实践技术应用

近年来&#xff0c;人工智能领域的飞速发展极大地改变了各个行业的面貌。当前最新的技术动态&#xff0c;如大型语言模型和深度学习技术的发展&#xff0c;展示了深度学习和机器学习技术的强大潜力&#xff0c;成为推动创新和提升竞争力的关键。特别是PyTorch&#xff0c;凭借其…...

pWnos1.0 靶机渗透 (Perl CGI 的反弹 shell 利用)

靶机介绍 来自 vulnhub 主机发现 ┌──(kali㉿kali)-[~/testPwnos1.0] …...

jquery on() 函数绑定无效

on 前面的元素必须在页面加载的时候就存在于 dom 里面。动态的元素或者样式等&#xff0c;可以放在 on 的第二个参数里面。jQuery on() 方法是官方推荐的绑定事件的一个方法。使用 on() 方法可以给将来动态创建的动态元素绑定指定的事件&#xff0c;例如 append 等。 <div …...

数字化转型与企业创新的双向驱动

数字化转型与企业创新的双向驱动 在全球化的竞争环境中&#xff0c;数字化转型已成为企业保持竞争力的重要手段。未来几年&#xff0c;随着信息技术的进一步发展&#xff0c;数字化转型将不仅限于IT部门&#xff0c;而是深入到企业的各个业务层面&#xff0c;推动创新和效率的…...

[uni-app]小兔鲜-07订单+支付

订单模块 基本信息渲染 import type { OrderState } from /services/constants import type { AddressItem } from ./address import type { PageParams } from /types/global/** 获取预付订单 返回信息 */ export type OrderPreResult {/** 商品集合 [ 商品信息 ] */goods: …...

Oracle数据库中表压缩的实现方式和特点

Oracle数据库中表压缩的实现方式和特点 在 Oracle 数据库中&#xff0c;表压缩是一项重要的功能&#xff0c;旨在优化存储空间和提高性能。Oracle 提供了多种表压缩技术&#xff0c;以适应不同的应用场景和需求。以下是 Oracle 数据库中表压缩的实现方式和特点&#xff1a; 1…...

【C语言】基础篇

简单输出“helloword” #include<stdio.h> int main(){printf("hello world!");return 0; } 和与商 #include<stdio.h> int main(){int a,b,sum,quotient;printf("Enter two numbers:");scanf("%d %d",&a,&b);sum a b…...

Meta MovieGen AI:颠覆性的文本生成视频技术详解

近年来&#xff0c;生成式AI技术的发展迅猛&#xff0c;尤其是在文本生成图像、文本生成视频等领域。Meta公司近期推出的MovieGen AI&#xff0c;以其强大的文本生成视频能力震撼了整个AI行业。本文将详细解读Meta MovieGen AI的核心技术、功能特性及其在实际应用中的潜力。 一…...

个人文章合集 - 前端相关

前端&#xff1a;简述表单提交前如何进行数据验证 前端&#xff1a;项目一个html中如何引入另一个html&#xff1f; 前端&#xff1a;一张图快速记忆CSS所有属性 前端&#xff1a;三个CSS预处理器(框架)-Sass、LESS 和 Stylus的比较 前端&#xff1a;基于Java角度理解nodejs/np…...

R语言的下载、安装及环境配置(RstudioVSCode)

0x01 R语言篇 一、软件介绍 R for Windows是一个免费的用于统计计算和统计制图的优秀工具&#xff0c;是R语言开发工具。它拥有数据存储和处理系统、数组运算工具&#xff08;其向量、矩阵运算方面功能尤其强大&#xff09;、完整连贯的统计分析工具、优秀的统计制图等功能。…...

解决使用重载后的CustomWidget无法正常显示但原生的QWidget却能正常显示的问题

这种情况大部分都是因为没有重写paintEvent: ​#include <QPainter> #include <QStyleOption>void CustomWidget::paintEvent(QPaintEvent *) { QStyleOption opt; opt.initFrom(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt,…...

微服务Sleuth解析部署使用全流程

目录 1、Sleuth链路追踪 1、添加依赖 2、修改日志配置文件 3、测试 2、zipkin可视化界面 1、docker安装 2、添加依赖 3、修改配置文件 4、查看页面 5、ribbon配置 1、Sleuth链路追踪 sleuth是链路追踪框架&#xff0c;用于在微服务架构下开发&#xff0c;各个微服务之…...

最具有世界影响力的人颜廷利:全球著名哲学家思想家起名大师

颜廷利教授&#xff0c;这位源自济南唐王镇的杰出人物&#xff0c;不仅是中国当代最杰出的国学大师之一&#xff0c;更是将传统文化与现代科技巧妙结合的先锋。他积极推崇以人工智能技术为辅助的国学研究方法&#xff0c;为这一古老领域注入了新的活力和时代表达。 除了在学术…...

Ubuntu22.04 Docker 国内安装最靠谱教程

目前docker在国内安装常存在众所周知的网络问题&#xff0c;如果安装过程如果从官网地址安装以及安装之后从官网要拉取镜像都存在问题。这篇文章主要针对这两个问题总结最靠谱的docker安装教程。 1. docker安装 1.1 系统环境概述 Ubuntu 22.04linux内核版本 6.8&#xff08;…...

ceph pg rebalance

背景 1 个 osd full 超过 85% 使用率最近有大量的数据写入及数据删除操作 $ ceph osd df tree | grep osd.158 ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS TYPE NAME …...

大模型/Sora/世界模型之间是什么关系,对自动驾驶的意义是什么?

什么是大模型 人工智能大模型&#xff08;Artificial Intelligence Large Model&#xff0c;简称AI大模型&#xff09;是指具有庞大的参数规模和复杂程度的机器学习模型。通常指的是参数量非常大、数据量非常大的深度学习模型。 大模型通常由数百万到数十亿的参数组成&#x…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&&#xff1a;逻辑与 ||&#xff1a;逻辑或 &#xff01;&#xff1a;逻辑非 短路求值 位运算符 按位与&&#xff1a; 按位或 | 按位取反~ …...