Python web实战 | 用 Flask 框架快速构建 Web 应用【实战】


 概要

Python web 开发已经有了相当长的历史,从最早的 CGI 脚本到现在的全栈 Web 框架,现在已经成为了一种非常流行的方式。

Python 最早被用于 Web 开发是在 1995 年(90年代早期),当时使用 CGI 脚本编写动态 Web 页面。2004 年 Django 框架发布,它是一个高度模块化的框架,提供了许多开箱即用的功能,使得 Web 开发更加容易和快速。Flask 框架于 2010 年发布,是一个轻量级的框架,它提供了更少的默认功能,但也更灵活,允许开发者根据需要添加或删除功能。


1. 什么是 Flask?

Flask 是一款 Python 的轻量级 Web 框架,它的特点是简单易用、灵活性高。Flask 框架可以快速搭建 Web 应用程序,是一个很好的选择。Flask 框架的核心思想是 WSGI(Web Server Gateway Interface),它定义了 Web 服务器和 Web 应用程序之间的通信协议。

1.1 Flask 的优势

  • 简单易用:Flask 框架的 API 简单易用,开发者能够快速上手。MVC设计模式。

  • 灵活性高:Flask 框架的扩展性高,可以根据实际需求进行扩展。

  • 轻量级:Flask 框架的代码量小,运行速度快。

  • 文档丰富:Flask 框架的文档非常详细,开发者能够轻松查找所需信息。

1.2 Flask 的缺点

  • 轻量级:Flask 框架的轻量级也是它的缺点之一,它的功能相对有限,需要自己进行扩展。

  • 不适合大型应用程序:Flask 框架适合小型应用程序,对于大型应用程序来说,可能会出现性能瓶颈。这时可以考虑Django。

1.3 Flask 的基础组件

Flask 框架由以下几个基础组件组成:

  • 路由:定义 URL 和视图函数之间的映射关系。

  • 视图函数:处理请求并返回响应。

  • 模板:生成 HTML 页面。

  • 表单:处理用户提交的数据。

  • 扩展:实现 Flask 框架的扩展功能。

2. 基础使用

2.1 安装 Flask

在开始使用 Flask 之前,需要先安装 Flask。可以使用 pip 命令进行安装:

pip install Flask

2.2 Hello World

下面是一个简单的示例,展示了如何使用 Flask 框架输出 "Hello World"。

新建一个app.py文件,输入如下内容。

Linux下执行:

export FLASK_APP=app.py

flask run

打开浏览器访问 http://127.0.0.1:5000/ 即可。

如果是 windows 执行:

set FLASK_APP=app.py

flask run

from flask import Flaskapp = Flask(__name__)@app.route('/')
def hello_world():return 'Hello, World!'

2.3 路由和视图函数

在 Flask 中,路由和视图函数是紧密相关的。路由用于将 URL 映射到视图函数上,视图函数则处理请求并返回响应。为了实现路由和视图函数,我们可以使用 Flask 中的 @app.route 装饰器。下面是一个简单的示例:

from flask import Flaskapp = Flask(__name__)@app.route('/')
def index():return 'This is the index page.'@app.route('/hello')
def hello():return 'Hello, World!'

@app.route('/') 和 @app.route('/hello') 分别定义了两个路由,index() 和 hello() 则是两个视图函数。

2.4 模板

模板是 Flask 中生成 HTML 页面的一种方式。Flask 支持多种模板引擎,包括 Jinja2、Mako、Tenjin 等。在本文中,我们使用 Jinja2 作为模板引擎。

下面是一个简单的示例,展示了如何使用模板生成 HTML 页面:

from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')
def index():return render_template('index.html', title='Home')@app.route('/hello')
def hello():return render_template('hello.html', name='Flask')

render_template() 函数用于渲染模板,第一个参数指定模板名称,第二个参数则是模板中使用的变量。

2.5 静态文件

静态文件包括 CSS、JavaScript、图片等。在 Flask 中,可以使用 url_for() 函数生成静态文件的 URL。

下面是一个简单的示例:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>{{ title }}</title><link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body><h1>{{ title }}</h1><p>Hello, Flask!</p>
</body>
</html>

url_for('static', filename='style.css') 生成了静态文件 style.css 的 URL。

2.6 表单

表单是 Web 应用程序中常用的一种交互方式。在 Flask 中,可以使用 request 对象获取用户提交的表单数据。

下面是一个简单的示例:

from flask import Flask, requestapp = Flask(__name__)@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':username = request.form['username']password = request.form['password']if username == 'admin' and password == 'password':return 'Login success!'else:return 'Invalid username or password.'else:return '''<form method="post"><label>Username:</label><input type="text" name="username"><label>Password:</label><input type="password" name="password"><input type="submit" value="Login"></form>'''

request.form 可以获取 POST 请求提交的表单数据。

3. 实战案例:构建一个 Todo (待办) 应用

接下来,我们将通过一个实战案例来介绍如何使用 Flask 框架构建一个 Todo 应用。

3.1 数据库设计

首先,我们需要设计数据库。在本文中,我们使用 MySQL 作为数据库。下面是数据库的设计:

CREATE TABLE `todos` (`id` int(11) NOT NULL AUTO_INCREMENT,`title` varchar(255) NOT NULL,`completed` tinyint(1) NOT NULL DEFAULT '0',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

3.2 后端实现

接下来实现后端的功能:

from flask import Flask, render_template, request, redirect, url_for
import pymysql.cursorsapp = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'connection = pymysql.connect(host='localhost',user='root',password='password',db='todo',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor
)@app.route('/')
def index():with connection.cursor() as cursor:cursor.execute('SELECT * FROM `todos`')todos = cursor.fetchall()return render_template('index.html', todos=todos)@app.route('/add', methods=['POST'])
def add():title = request.form['title']with connection.cursor() as cursor:cursor.execute('INSERT INTO `todos` (`title`) VALUES (%s)', title)connection.commit()return redirect(url_for('index'))@app.route('/toggle/<int:todo_id>', methods=['POST'])
def toggle(todo_id):with connection.cursor() as cursor:cursor.execute('SELECT `completed` FROM `todos` WHERE `id` = %s', todo_id)completed = cursor.fetchone()['completed']cursor.execute('UPDATE `todos` SET `completed` = %s WHERE `id` = %s', (not completed, todo_id))connection.commit()return redirect(url_for('index'))@app.route('/delete/<int:todo_id>', methods=['POST'])
def delete(todo_id):with connection.cursor() as cursor:cursor.execute('DELETE FROM `todos` WHERE `id` = %s', todo_id)connection.commit()return redirect(url_for('index'))

解析:建立数据库连接,并定义四个路由:

  • /:显示所有的 Todo。

  • /add:添加一个 Todo。

  • /toggle/:标记一个 Todo 是否已完成。

  • /delete/:删除一个 Todo。

3.3 前端实现

最后实现前端的功能:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Todo</title><style>.completed {text-decoration: line-through;}</style>
</head>
<body><h1>Todo</h1><form method="post" action="{{ url_for('add') }}"><label>Title:</label><input type="text" name="title"><input type="submit" value="Add"></form><ul>{% for todo in todos %}<li{% if todo.completed %} class="completed"{% endif %}><form method="post" action="{{ url_for('toggle', todo_id=todo.id) }}"><input type="checkbox" name="completed" {% if todo.completed %}checked{% endif %}>{{ todo.title }}</form><form method="post" action="{{ url_for('delete', todo_id=todo.id) }}"><input type="submit" value="Delete"></form></li>{% else %}<p>No todos.</p>{% endfor %}</ul>
</body>
</html>

我们使用了 Jinja2 模板引擎,展示了 Todo 列表、添加 Todo、标记 Todo 是否已完成、删除 Todo 等功能。

4. 技术总结

今天介绍了如何使用 Flask 框架进行 Web 开发,并实战开发了一个轻量级的web应用。Flask 是一款 Python 的轻量级 Web 框架,具有简单易用、灵活性高等优点,初学者也能快速上手。

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

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

相关文章

spring启动流程 (6完结) springmvc启动流程

SpringMVC的启动入口在SpringServletContainerInitializer类&#xff0c;它是ServletContainerInitializer实现类(Servlet3.0新特性)。在实现方法中使用WebApplicationInitializer创建ApplicationContext、创建注册DispatcherServlet、初始化ApplicationContext等。 SpringMVC…

68. 文本左右对齐

题目链接&#xff1a;力扣 解题思路&#xff1a;遍历单词数组&#xff0c;确定每一行的单词数量&#xff0c; 之后就可以得到每一个需要补充的空格数量。从而得到单词之间需要补充的空格数量。具体算法如下&#xff1a; 确定每一行的单词数量 初始值&#xff1a; num 0&…

【JavaWeb】正则表达式

&#x1f384;欢迎来到边境矢梦的csdn博文&#xff0c;本文主要讲解Java 中正则表达式 的相关知识&#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以关注一下&#x1faf0;&#x1faf0;&am…

2023年的深度学习入门指南(22) - 百川大模型13B的运行及量化

2023年的深度学习入门指南(22) - 百川大模型13B的运行及量化 不知道上一讲的大段代码大家看晕了没有。但是如果你仔细看了会发现&#xff0c;其实代码还是不全的。比如分词器我们就没讲。 另外&#xff0c;13B比7B的改进点也没有讲。 再有&#xff0c;对于13B需要多少显存我们…

ios 查看模拟器沙盒的路径

打一个断点运行程序&#xff0c;在xcode consol底部控制台输入&#xff1a; po NSHomeDirectory() 复制路径粘帖到前往文件夹打开沙盒缓存文件夹

Oracle存过-对象权限创建回收、同义词创建删除

Oracle存过-对象权限创建回收、同义词创建删除 -- Oracle存过-对象权限创建回收、同义词创建删除--得到对象授权语句--调用&#xff1a;CALL LOG.COMMON_PKG.get_tab_grant_privs_p(LOG,TZQ,INFO);PROCEDURE get_tab_grant_privs_p(pi_grantor IN VARCHAR2,pi_grantee IN …

golang pprof

pprof是一个用于分析数据的可视化和分析工具&#xff0c;由谷歌公司的开发团队使用go语言编写成的。一般用于对golang资源占用进行分析。不是原创&#xff0c;参考&#xff1a;https://juejin.cn/post/7122473470424219656 1. 通过页面查看golang运行情况 访问 http://127.0.0…

使用Streamlit快速搭建和共享交互式应用

大家好&#xff0c;在数据科学和机器学习领域&#xff0c;向他人展示见解和分享结果与分析本身同样重要&#xff0c;然而创建交互式和用户友好型的应用程序通常需要复杂的框架和耗时的开发过程。Streamlit是一个Python库&#xff0c;它简化了以数据为重点的网络应用程序的创建过…

ppt怎么压缩到10m以内?分享好用的压缩方法

PPT是一种常见的演示文稿格式&#xff0c;有时候文件过大&#xff0c;我们会遇到无法发送、上传的现象&#xff0c;这时候简单的解决方法就是压缩其大小&#xff0c;那怎么才能将PPT压缩到10M以内呢&#xff1f; PPT文件大小受到影响的主要因素就是以下几点&#xff1a; 1、图…

如何使用 PHP 进行数据库连接池优化?

连接池是一个存放数据库连接的地方&#xff0c;就像一个水池&#xff0c;你在这里可以得到数据库连接。这比每次都新建和关闭连接要快得多&#xff0c;因为连接池中的连接是可以重复使用的。 下面是一个简单的例子&#xff0c;展示如何使用PHP和PDO&#xff08;PHP Data Objec…

Keepalived 在CentOS安装

下载 有两种下载方式&#xff0c;一种为yum源下载&#xff0c;另一种通过源代码下载&#xff0c;本文章使用源代码编译下载。 官网下载地址&#xff1a;https://www.keepalived.org/download.html wget https://www.keepalived.org/software/keepalived-2.0.20.tar.gz --no-…

Android 项目架构

🔥 什么是架构 🔥 在维基百科里是这样定义的: 软件架构是一个系统的轮廓 . 软件架构描述的对象是直接构成系统的抽象组件. 各个组件之间的连接则明确和相对细致地描述组件之间的通讯 . 在实现阶段, 这些抽象组件被细化为实际组件 , 比如具体某个类或者对象 . 面试的过程中…

CNN卷积详解

转载自&#xff1a;https://blog.csdn.net/yilulvxing/article/details/107452153 仅用于自己学习过程中经典文章讲解的记录&#xff0c;防止原文失效。 1&#xff1a;单通道卷积 以单通道卷积为例&#xff0c;输入为&#xff08;1,5,5&#xff09;&#xff0c;分别表示1个通道…

libuv库学习笔记-networking

Networking 在 libuv 中&#xff0c;网络编程与直接使用 BSD socket 区别不大&#xff0c;有些地方还更简单&#xff0c;概念保持不变的同时&#xff0c;libuv 上所有接口都是非阻塞的。它还提供了很多工具函数&#xff0c;抽象了恼人、啰嗦的底层任务&#xff0c;如使用 BSD …

Git拉取远程分支并创建本地分支

一、查看远程分支 使用如下git命令查看所有远程分支&#xff1a; git branch -r 查看远程和本地所有分支&#xff1a; git branch -a 查看本地分支&#xff1a; git branch 在输出结果中&#xff0c;前面带* 的是当前分支。 二、拉取远程分支并创建本地分支 方法一 使用…

支配树学习笔记

学习链接【学习笔记】支配树_cz_xuyixuan的博客-CSDN博客 主要的求法是最后两个结论&#xff1a; 定理4用来求sdom&#xff0c;先搞一个dfs树&#xff0c;然后将点按dfs序从大到小加入&#xff0c;对每个点维护到当前根&#xff08;即已加入点&#xff09;路径上sdom最小是哪个…

CentOS 8上安装和配置Redis

在本篇博客中&#xff0c;我们将演示如何在CentOS 8上安装和配置Redis。我们将首先安装Redis&#xff0c;然后配置Redis以设置密码并允许公开访问。 步骤 1&#xff1a;安装Redis 首先&#xff0c;更新软件包列表&#xff1a; sudo yum update安装Redis&#xff1a; sudo yum …

sky-notes-01

1、DTO类 DTO&#xff08;Data Transfer Object&#xff09;&#xff1a;数据传输对象&#xff0c;Service 或 Manager 向外传输的对象。 详见阿里巴巴Java开发手册中的DO、DTO、BO、AO、VO、POJO定义 当前端提交的数据和实体类中对应的属性差别比较大时&#xff0c;建议使用…

session无法读取问题解决(cookie浏览器权限)

问题 使用go的 "github.com/gin-contrib/sessions"库对session进行设置并获取时&#xff0c;浏览器拒绝掉请求携带cookie&#xff0c;体现在浏览器上为“被过滤掉的session”&#xff0c;并携带小三角提示符。 基本概念 SameSite Chrome 51 开始&#xff0c;浏览…

顺序栈的基本操作(2种实现方式)

0.定义 #define MaxSize 50 typedef struct {Elemtype data[MaxSize];int top; }SqStack;1.初始化 void InitStack(SqStack &S) {S.top -1; }2.判空 bool StackEmpty(SqStack S) {if(S.top -1)return true;elsereturn false; }3.进栈 ①实现一&#xff1a;栈顶指针指…