Flask新手入门(一)
前言
Flask是一个用Python编写的轻量级Web应用框架。它最初由Armin Ronacher作为Werkzeug的一个子项目在2010年开发出来。Werkzeug是一个综合工具包,提供了各种用于Web应用开发的工具和函数。自发布以来,Flask因其简洁和灵活性而迅速受到开发者的欢迎。随着Python社区的增长,Flask也得到了不断的更新和改进,成为了Python Web开发中的主流框架之一。它拥有庞大的用户和贡献者社区。
除此之外,于当下大模型大爆发的时代,它是也非常适合给企业做私有大模型场景提供web页面。对于web初学者来说一个非常值得尝试的框架。
接下来我们从web基础概念、flask安装调试、路由、模版、蓝图、数据库操作、实战案例几个方面给大家介绍flask的使用。
一、Web应用基本概念
如果你是第一次开发Web应用程序,你需要首选了解一下几个概念,它们是IP地址、dns、url、http、https。
1. IP地址
IP地址是分配给网络上每个设备的唯一标识符。
它允许设备之间进行通信,分为IPv4和IPv6两种类型。
2. DNS(域名系统)
DNS是互联网上用于将域名转换为IP地址的系统。
它允许用户通过易于记忆的域名来访问网站,而不是记住复杂的数字IP地址。
3. URL(统一资源定位符)
它是互联网上资源的地址,包括网页、图片、视频等。
格式通常为:协议://域名:端口/路径?查询字符串#片段标识符。
4. HTTP(超文本传输协议)
HTTP是用于从Web服务器传输超文本到本地浏览器的协议。
它是Web通信的基础,支持客户端和服务器之间的请求和响应。
5. HTTPS(安全超文本传输协议)
HTTPS是HTTP的安全版本,通过SSL/TLS协议加密数据传输。
它保护数据免受中间人攻击和其他安全威胁。
以上这样介绍可能不够直观,举一些例子吧。
一个小姐姐去北京西单吃北京烤鸭,她要去的那家烤鸭店的名字就是域名,比如我们平时在浏览器里输入的taobaoc.om。而这家烤鸭店的地址门牌号就是IP,烤鸭店名和地址都在工商局有注册,这个工商局就是DNS服务器。URL是由域名和访问资源组成的。比如taobao.com/xxxxx. 这个xxxxx就是资源,你可以理解为烤鸭店里具体的包间或卡座以及烤鸭店提供的服务。
http和https的概念你可以理解成写信和和回信的过程,http就是没有加密的信件,一个人投诉物业给有关部门写信,主管部门收到后把处理结果回信这个写信的人。https就是加密的信件,比如谍战片里的特工,特工给上级写的信都是用的暗语,即使信件传递过程有人拆开了信,也是看不懂信中的暗语的。在实际web的通信过程中,http和https传递的都是具有特定格式的文本信息,浏览器发起一个请求后,服务器端会做出响应把操作结果反馈给浏览器端。这个响应可能是查询数据、删除数据或者新增数据。而服务器会返回浏览器的数据通常是可以直接渲染的html和css或是可以被间接渲染的json、xml等。
二、Flask安装和调试
2.1Flask安装
首选在pytcharm里建一个python项目,然后通过命令行切换到该项目的虚拟环境。这里如何安装和使用虚拟环境参考《Anaconda的安装和使用》,如何正确使用PyCharm创建python参考《PyCharm新手入门》。
在虚拟环境输入
pip install Flask
2.2Flask调试
1. 在项目中创建一个app.py的文件。
代码如下:
from flask import Flaskapp = Flask(__name__)
@app.route('/')
def hello_world():usr='老王';print(f'{usr}已经创建好了第一个flask应用!');return 'Hello, World!'
if __name__ == '__main__':app.run(debug=True)
2. 设置一下flask项目的调试环境


3. 调试报错
配置好调试环境,打一个断点如下图,然后用快捷键【shift+F9】启动调试。

调试启动后,可以看到控制台给出一个访问地址http://127.0.0.1:5000。复制这个url地址在浏览器里打开。
浏览器打开后,如果app.py这个程序进入调试状态,按F8可以进入分步调试了。这意味着你可以正常调试flask应用了,当完成调试后,你在浏览器看到“Hello, World!”。这里恭喜你,你已经很顺利的配置环境,可以进入开发的阶段了。
然而事情的实际进展不会这么顺利。你可能会遇到环境报错,就像我遇到的情况。
刚一点击shift+F9就报错
[Errno 2] No such file or directory
经查网上查找资料,发现最后问题出在安装flask版本的问题上,把flask版本调整为2.0,3就可以解决问题。查看flask版本
pip show flask
发现flask版本是3.0.2,。重新安装flask
pip uninstall flask
pip install flask==2.0.3
调整版本后重新再次启动,不再报错,然后再次shift+F9启动调试,这次没有报错,但是调试启动后进入helpers.py ,再点击F8,继续调试报以下错误:
d:\conda_envs\pycharm\python.exe "D:/Program Files/PyCharm Community Edition 2023.2.3/plugins/python-ce/helpers/pydev/pydevd.py" --multiprocess --qt-support=auto --client 127.0.0.1 --port 3269 --file D:\python_workspace\pythonProject\app.py
已连接到 pydev 调试器(内部版本号 232.10072.31)Traceback (most recent call last):File "<frozen importlib._bootstrap>", line 1027, in _find_and_loadFile "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlockedFile "<frozen importlib._bootstrap>", line 688, in _load_unlockedFile "<frozen importlib._bootstrap_external>", line 883, in exec_moduleFile "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removedFile "d:\conda_envs\pycharm\lib\site-packages\flask\__init__.py", line 7, in <module>from .app import Flask as FlaskFile "d:\conda_envs\pycharm\lib\site-packages\flask\app.py", line 28, in <module>from . import cliFile "d:\conda_envs\pycharm\lib\site-packages\flask\cli.py", line 18, in <module>from .helpers import get_debug_flagFile "d:\conda_envs\pycharm\lib\site-packages\flask\helpers.py", line 16, in <module>from werkzeug.urls import url_quote
ImportError: cannot import name 'url_quote' from 'werkzeug.urls' (d:\conda_envs\pycharm\lib\site-packages\werkzeug\urls.py)
python-BaseException
经上网查找问题,发现是werkzeug的版本仍然有问题,因为werkzeug是在安装flask时同时关联安装的。我们虽然重新安装了flask,但是werkzeug仍然是旧版本,于是重新安装werkzeug
pip uninstall werkzeug
pip install werkzeug==2.0.3
重新调试程序,shift+F9,F8。一切正常。这里分享一个经验给大家,在我们运行python开源项目的时候,包括大模型应用像stable diffusion、llama等,我们遇到的问题80%甚至是98%都是因为安装的库文件版本有问题。所以安装python库的时候最好搞清楚库的版本,否则你会遇到数不尽的麻烦。
二、路由和视图函数
在Flask中,路由由@app.route()装饰器定义,视图函数是处理请求并返回响应的函数。
@app.route('/user/<username>')
def show_user_profile(username):# 通过URL中的参数访问用户信息return f'User {username}'@app.route('/post/<int:post_id>')
def show_post(post_id):# 通过URL中的参数访问帖子信息,确保参数是整数类型return f'Post {post_id}'
三、蓝图:
在 Flask 中,通常将不同的服务请求(即不同的路由和视图函数)组织在一个 Python 文件中是可行的,尤其是在小型应用或者学习阶段。然而,对于更大的应用或更好的代码组织,你可能希望将不同的服务请求拆分到不同的模块或蓝图中。
以下是一些组织服务请求的一般建议:
1.单一文件应用:
在小型应用中,将所有的服务请求都写在一个文件中是可以的,这样简单明了。例如:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():return 'Home Page'@app.route('/about')
def about():return 'About Page'if __name__ == '__main__':app.run(debug=True)
2.模块化组织:
将相关的服务请求分组到不同的模块中,例如 views.py:
# views.py
from flask import Blueprintmain_bp = Blueprint('main', __name__)@main_bp.route('/')
def home():return 'Home Page'@main_bp.route('/about')
def about():return 'About Page'
然后在主应用中导入并注册这个蓝图:
3.蓝图
请求组织到不同的蓝图中。蓝图是一种更高级别的组织方式,用于将应用拆分为可维护的模块。例如:
# main_blueprint.py
from flask import Blueprintmain_bp = Blueprint('main', __name__)@main_bp.route('/')
def home():return 'Home Page'@main_bp.route('/about')
def about():return 'About Page'
主应用
# main_blueprint.py
from flask import Blueprintmain_bp = Blueprint('main', __name__)@main_bp.route('/')
def home():return 'Home Page'@main_bp.route('/about')
def about():return 'About Page'
这些都是一些通用的组织代码的方式,具体选择取决于你的应用规模和组织结构。在项目变得更大时,使用模块化的方式可以更好地保持代码的可维护性。
四、表单处理:
Flask可以轻松处理表单提交。使用request对象从POST请求中获取表单数据,或使用flask-wtf等扩展库来简化表单处理。
from flask import Flask, render_template, request@app.route('/login', methods=['POST', 'GET'])
def login():if request.method == 'POST':username = request.form['username']password = request.form['password']# 处理表单提交的数据return f'Username: {username}, Password: {password}'return render_template('login.html')
五、Jinqa模版
在 Flask 中,你可以使用模板引擎来实现动态页面。模板引擎允许你在 HTML 文件中嵌入动态内容,从而根据不同的请求动态生成页面。Flask 默认使用 Jinja2 模板引擎,它提供了灵活的语法和功能,方便在 HTML 中插入动态内容。
1.安装 Jinja2:
如果你是在新的虚拟环境中,你需要安装 Jinja2:
pip install Jinja2
2.创建 Flask 应用:
from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')
def home():# 传递动态数据到模板user = {'username': 'John', 'age': 25}return render_template('home.html', user=user)if __name__ == '__main__':app.run(debug=True)
3.创建模板文件:
在你的项目目录下创建一个名为 templates 的文件夹,然后在该文件夹中创建 home.html 文件:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Dynamic Page</title>
</head>
<body><h1>Welcome, {{ user.username }}!</h1><p>Your age is {{ user.age }}.</p>
</body>
</html>
在这个例子中,{{ user.username }} 和 {{ user.age }} 是模板中的变量,它们将在运行时由 Flask 填充为相应的值。
六、操作数据库
1.sqlite3模块
SQLite 是一个自包含、无服务器、零配置的 SQL 数据库引擎。它是 Python 标准库的一部分,所以在大多数情况下,你不需要手动安装 SQLite 数据库,因为它已经包含在 Python 的 sqlite3 模块中。
在 Python 中,你可以使用标准库中的 sqlite3 模块来访问 SQLite 数据库:
import sqlite3
# 连接到 SQLite 数据库(如果数据库不存在,会自动创建)
conn = sqlite3.connect('example.db')
# 创建一个游标对象
cursor = conn.cursor()
# 执行 SQL 语句
cursor.execute('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)')
# 插入数据
cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Alice', 30))
# 提交事务
conn.commit()
# 查询数据
cursor.execute('SELECT * FROM users')
print(cursor.fetchall())
# 关闭连接
conn.close()
这个示例展示了如何使用 Python 的 sqlite3 模块来创建表、插入数据和查询数据。你可以直接在你的 Python 环境中运行这个代码来测试 SQLite 数据库的基本功能。
2.使用SQLAlchemy模块访问数据库
除了python自带的标准sqlite3模块,还可以通过SQLAlchemy 来处理和数据库交互,不同的是,这个模块除了sqlite还可以访问mysql等其他数据库。
使用SQLAlchemy操作数据库的步骤
安装依赖
pip install Flask SQLAlchemy
创建 Flask 应用
1. 项目结构
/flask_app├── app.py├── models.py└── templates└── index.html
2.models.py - 定义数据库模型
from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy()class User(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(80), nullable=False)age = db.Column(db.Integer, nullable=False)def __repr__(self):return f'<User {self.name}>'
3 .app.py - 主应用文件
from flask import Flask, request, jsonify, render_template
from models import db, Userapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Falsedb.init_app(app)@app.route('/')
def index():users = User.query.all()return render_template('index.html', users=users)@app.route('/user', methods=['POST'])
def create_user():data = request.get_json()new_user = User(name=data['name'], age=data['age'])db.session.add(new_user)db.session.commit()return jsonify({'message': 'User created'}), 201@app.route('/user/<int:id>', methods=['GET'])
def get_user(id):user = User.query.get_or_404(id)return jsonify({'id': user.id, 'name': user.name, 'age': user.age})@app.route('/user/<int:id>', methods=['PUT'])
def update_user(id):data = request.get_json()user = User.query.get_or_404(id)user.name = data.get('name', user.name)user.age = data.get('age', user.age)db.session.commit()return jsonify({'message': 'User updated'})@app.route('/user/<int:id>', methods=['DELETE'])
def delete_user(id):user = User.query.get_or_404(id)db.session.delete(user)db.session.commit()return jsonify({'message': 'User deleted'})if __name__ == '__main__':with app.app_context():db.create_all()app.run(debug=True)
4 .templates/index.html - 用于显示用户列表的简单 HTML 模板
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>User List</title>
</head>
<body><h1>User List</h1><ul>{% for user in users %}<li>{{ user.name }} ({{ user.age }} years old)</li>{% endfor %}</ul>
</body>
</html>
相关文章:
Flask新手入门(一)
前言 Flask是一个用Python编写的轻量级Web应用框架。它最初由Armin Ronacher作为Werkzeug的一个子项目在2010年开发出来。Werkzeug是一个综合工具包,提供了各种用于Web应用开发的工具和函数。自发布以来,Flask因其简洁和灵活性而迅速受到开发者的欢迎。…...
Grafana-11.0.0 在线部署教程
Grafana-11.0.0 在线部署教程 环境: 操作系统: ubuntugrafana版本: 11.0.0 (建议不要按照最新版)grafana要求的系统配置不高,建议直接部署在监控服务器上,比如zabbix服务器、prometheus服务器…...
pytorch-01
加载mnist数据集 one-hot编码实现 import numpy as np import torch x_train np.load("../dataset/mnist/x_train.npy") # 从网站提前下载数据集,并解压缩 y_train_label np.load("../dataset/mnist/y_train_label.npy") x torch.tensor(y…...
梦想CAD二次开发
1.mxdraw简介 mxdraw是一个HTML5 Canvas JavaScript框架,它在THREE.js的基础上扩展开发,为用户提供了一套在前端绘图更为方便,快捷,高效率的解决方案,mxdraw的实质为一个前端二维绘图平台。你可以使用mxdraw在画布上绘…...
Eureka的介绍与使用
Eureka 是 Netflix 开源的一款服务注册与发现组件,在微服务架构中扮演着重要的角色。 一、Eureka 的介绍 工作原理 服务注册:各个微服务在启动时,会向 Eureka Server 发送注册请求,将自身的服务名、实例名、IP 地址、端口等信息注…...
ChatGPT之母:AI自动化将取代人类,创意性工作或将消失
目录 01 AI取代创意性工作的担忧 1.1 CTO说了啥 02 AI已开始大范围取代人类 01 AI取代创意性工作的担忧 几天前的采访中,OpenAI的CTO直言,AI可能会扼杀一些本来不应该存在的创意性工作。 近来一篇报道更是印证了这一观点。国外科技媒体的老板Miller用…...
【深度学习驱动流体力学】湍流仿真到深度学习湍流预测
目录 一、湍流项目结构二、三个OpenFOAM湍流算例1. motorBike背景和目的文件结构和关键文件使用和应用湍流仿真深度学习湍流预测深度学习湍流预测的挑战和应用结合湍流仿真与深度学习2. pitzDaily背景和目的文件结构和关键文件使用和应用3. pitzDailyMapped背景和目的文件结构和…...
如何从0构建一款类似pytest的工具
Pytest主要模块 Pytest 是一个强大且灵活的测试框架,它通过一系列步骤来发现和运行测试。其核心工作原理包括以下几个方面:测试发现:Pytest 会遍历指定目录下的所有文件,找到以 test_ 开头或 _test.py 结尾的文件,并且…...
6.27-6.29 旧c语言
#include<stdio.h> struct stu {int num;float score;struct stu *next; }; void main() {struct stu a,b,c,*head;//静态链表a.num 1;a.score 10;b.num 2;b.score 20;c.num 3;c.score 30;head &a;a.next &b;b.next &c;do{printf("%d,%5.1f\n&…...
Unidbg调用-补环境V3-Hook
结合IDA和unidbg,可以在so的执行过程进行Hook,这样可以让我们了解并分析具体的执行步骤。 应用场景:基于unidbg调试执行步骤 或 还原算法(以Hookzz为例)。 1.大姨妈 1.1 0x1DA0 public void hook1() {...
从AICore到TensorCore:华为910B与NVIDIA A100全面分析
华为NPU 910B与NVIDIA GPU A100性能对比,从AICore到TensorCore,展现各自计算核心优势。 AI 2.0浪潮汹涌而来,若仍将其与区块链等量齐观,视作炒作泡沫,则将错失新时代的巨大机遇。现在,就是把握AI时代的关键…...
Edge 浏览器退出后,后台占用问题
Edge 浏览器退出后,后台占用问题 环境 windows 11 Microsoft Edge版本 126.0.2592.68 (正式版本) (64 位)详情 在关闭Edge软件后,查看后台,还占用很多系统资源。实在不明白,关了浏览器还不能全关了,微软也学流氓了。…...
实验八 T_SQL编程
题目 以电子商务系统数据库ecommerce为例 1、在ecommerce数据库,针对会员表member首先创建一个“呼和浩特地区”会员的视图view_hohhot,然后通过该视图查询来自“呼和浩特”地区的会员信息,用批处理命令语句将问题进行分割,并分…...
【爆肝34万字】从零开始学Python第2天: 判断语句【入门到放弃】
目录 前言判断语句True、False简单使用作用 比较运算符引入比较运算符的分类比较运算符的结果示例代码总结 逻辑运算符引入逻辑运算符的简单使用逻辑运算符与比较运算符一起使用特殊情况下的逻辑运算符 if 判断语句引入基本使用案例演示案例补充随堂练习 else 判断子句引入else…...
React 19 新特性集合
前言:https://juejin.cn/post/7337207433868197915 新 React 版本信息 伴随 React v19 Beta 的发布,React v18.3 也一并发布。 React v18.3相比最后一个 React v18 的版本 v18.2 ,v18.3 添加了一些警告提示,便于尽早发现问题&a…...
耐高温水位传感器有哪些
耐高温水位传感器在现代液位检测技术中扮演着重要角色,特别适用于需要高温环境下稳定工作的应用场合。这类传感器的设计和材质选择对其性能和可靠性至关重要。 一种典型的耐高温水位传感器是FS-IR2016D,它采用了PPSU作为主要材质。PPSU具有优良的耐高温…...
Symfony国际化与本地化:打造多语言应用的秘诀
标题:Symfony国际化与本地化:打造多语言应用的秘诀 摘要 Symfony是一个高度灵活的PHP框架,用于创建Web应用程序。它提供了强大的国际化(i18n)和本地化(l10n)功能,允许开发者轻松创…...
ApolloClient GraphQL 与 ReactNative
要在 React Native 应用程序中设置使用 GraphQL 的简单示例,您需要遵循以下步骤: 设置一个 React Native 项目。安装 GraphQL 必要的依赖项。创建一个基本的 GraphQL 服务器(或使用公共 GraphQL 端点)。从 React Native 应用中的…...
【贡献法】2262. 字符串的总引力
本文涉及知识点 贡献法 LeetCode2262. 字符串的总引力 字符串的 引力 定义为:字符串中 不同 字符的数量。 例如,“abbca” 的引力为 3 ,因为其中有 3 个不同字符 ‘a’、‘b’ 和 ‘c’ 。 给你一个字符串 s ,返回 其所有子字符…...
C#基于SkiaSharp实现印章管理(3)
本系列第一篇文章中创建的基本框架限定了印章形状为矩形,但常用的印章有方形、圆形等多种形状,本文调整程序以支持定义并显示矩形、圆角矩形、圆形、椭圆等4种形式的印章背景形状。 定义印章背景形状枚举类型,矩形、圆形、椭圆相关的尺寸…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
