Flask 快速入门

1. Flask 简介

1.1 什么是 Flask

Flask 是一个用 Python 编写的轻量级 Web 框架,被誉为 微框架。它提供基础功能,如路由、请求处理和模板引擎,但不强迫开发者使用特定库或工具,赋予开发人员高度的自由选择权,以满足不同项目的需求。

简单来说,Flask 帮助 Python 开发者快速构建 Web 应用,提供以下核心功能:

  • 路由: 将 URL 与对应的 Python 函数进行匹配,实现 URL 到函数的映射。
  • 请求处理: 处理来自用户的 HTTP 请求,例如获取请求参数、解析请求数据等,并将处理结果返回给用户。
  • 模板引擎: 使用 Jinja2 模板引擎动态渲染网页,将数据嵌入到 HTML 模板中,生成最终的 HTML 页面。

1.2 Flask 的优势

  • 轻量级和灵活: Flask 没有强迫性要求,允许开发者自由选择数据库、模板引擎和其他库,完全掌控项目的架构和组件选择。
  • 易于学习: Flask 的语法简洁直观,易于理解和掌握,即使是初学者也能快速上手。
  • 强大的社区支持: Flask 拥有庞大而活跃的社区,开发者可以轻松获取各种资源、教程、示例代码和帮助,解决开发中的问题。
  • 可扩展性: Flask 提供扩展机制,允许开发者通过添加扩展来扩展功能,例如数据库集成、用户认证、表单验证、邮件发送等,满足不同项目的需求。

1.3 Flask 的应用场景

Flask 适合以下应用场景:

  • 小型项目: 对于简单的网站或 API,Flask 提供快速开发和部署方案,节省时间和成本。
  • 原型开发: Flask 帮助开发者快速构建原型,验证想法的可行性,并进行快速迭代和修改。
  • 个性化需求: Flask 的灵活性满足定制化的 API、特定领域应用等需求,可以根据项目的特殊要求进行灵活调整和扩展。

一些使用 Flask 的知名应用:

  • Pinterest: 一家图片社交网站,使用 Flask 构建了其核心功能。
  • Lyft: 一家打车服务公司,使用 Flask 构建了其 API 和 Web 应用。
  • Twilio: 一家云通信平台,使用 Flask 构建了其 API 和管理界面。

1.4 Flask 的基本架构

Flask 的基本架构包括以下几个关键部分:

  1. WSGI 应用: Flask 应用本身是一个 WSGI 应用,负责接收 HTTP 请求并生成响应。
  2. 路由: 使用 @app.route 装饰器将 URL 与 Python 函数进行绑定,实现 URL 到函数的映射。
  3. 请求处理: Flask 提供 request 对象,用于获取 HTTP 请求信息,例如请求方法、请求参数、请求头等。
  4. 模板引擎: Flask 默认使用 Jinja2 模板引擎,用于渲染动态网页。
  5. 响应生成: Flask 使用 render_template 函数渲染模板,或使用 make_response 函数创建响应对象,并返回给用户。

了解这些基本架构有助于理解 Flask 的工作原理,以及如何使用 Flask 构建 Web 应用。

2. 快速上手

2.1 安装 Flask

使用 pip 安装 Flask:

pip install Flask

2.2 创建第一个 Flask 应用

创建名为 app.py 的文件,并添加以下代码:

from flask import Flaskapp = Flask(__name__)@app.route('/')
def index():return 'Hello, Flask!'if __name__ == '__main__':app.run(debug=True)

代码解释:

  • from flask import Flask: 导入 Flask 库。
  • app = Flask(__name__): 创建一个 Flask 应用实例,__name__ 表示当前模块名,用于指定应用的根目录。
  • @app.route('/'): 定义一个路由,将根路径 /index 函数关联。
  • def index():: 定义一个函数,返回一个字符串 “Hello, Flask!”。
  • if __name__ == '__main__':: 确保代码只在直接运行脚本时执行,而不是被其他模块导入时执行。
  • app.run(debug=True): 运行 Flask 应用,开启调试模式。

2.3 运行 Flask 应用

在终端中运行以下命令:

python app.py

打开浏览器,访问 http://127.0.0.1:5000/,你将看到 “Hello, Flask!” 的输出。

2.4 使用路由

路由用于将 URL 与 Python 函数进行匹配。在上面的代码中,@app.route('/') 定义了一个路由,将根路径 /index 函数关联。

你可以定义多个路由,例如:

@app.route('/about')
def about():return 'This is the about page.'@app.route('/contact')
def contact():return 'This is the contact page.'

访问 http://127.0.0.1:5000/abouthttp://127.0.0.1:5000/contact 将分别显示 “This is the about page.” 和 “This is the contact page.”。

2.5 处理 HTTP 请求方法

Flask 可以区分不同的 HTTP 请求方法,例如 GETPOSTPUTDELETE 等。

可以使用 methods 参数来指定允许的 HTTP 请求方法:

@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'GET':return 'Login page'elif request.method == 'POST':# 处理 POST 请求return 'Login successful'

代码解释:

  • methods=['GET', 'POST']: 允许使用 GETPOST 请求方法访问 /login 路由。
  • request.method: 获取当前请求方法。

访问 http://127.0.0.1:5000/login 将显示 “Login page”,使用 POST 请求则会显示 “Login successful”。

3. 模板渲染

模板渲染是将数据动态插入到 HTML 页面中,生成最终的 HTML 内容,Flask 使用 Jinja2 模板引擎来实现模板渲染。

3.1 Jinja2 模板引擎

Jinja2 是一个功能强大的模板引擎,它提供了一套语法来定义模板,并支持变量、循环、条件语句等功能。

3.2 使用模板渲染页面

  1. 创建模板文件

    在应用的根目录下创建 templates 目录,并将模板文件放在该目录下。例如,创建一个名为 index.html 的模板文件:

    <!DOCTYPE html>
    <html>
    <head><title>My Flask App</title>
    </head>
    <body><h1>Hello, {{ name }}!</h1>
    </body>
    </html>
    
  2. 使用 render_template() 函数渲染模板

    在视图函数中使用 render_template() 函数渲染模板,并将数据传递到模板中。

    from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')
    def index():name = 'World'return render_template('index.html', name=name)if __name__ == '__main__':app.run(debug=True)
    

    这段代码将 index.html 模板渲染,并传递 name 变量的值到模板中,最终生成的 HTML 内容为:

    <!DOCTYPE html>
    <html>
    <head><title>My Flask App</title>
    </head>
    <body><h1>Hello, World!</h1>
    </body>
    </html>
    

3.3 传递数据到模板

render_template() 函数中,可以使用关键字参数将数据传递到模板中。

传递单个变量:

return render_template('index.html', name='World')

传递多个变量:

return render_template('index.html', name='World', age=25)

传递列表:

names = ['Alice', 'Bob', 'Charlie']
return render_template('index.html', names=names)

传递字典:

user = {'name': 'Alice', 'age': 25}return render_template('index.html', user=user)

3.4 模板继承

Jinja2 支持模板继承,允许你定义一个基础模板,并在其他模板中继承该基础模板。

基础模板 (base.html):

<!DOCTYPE html>
<html>
<head><title>{% block title %}My Flask App{% endblock %}</title>
</head>
<body><header><h1>Welcome to My Flask App</h1></header><main>{% block content %}{% endblock %}</main><footer><p>&copy; 2023 My Flask App</p></footer>
</body>
</html>

继承模板 (index.html):

{% extends 'base.html' %}{% block title %}Home{% endblock %}{% block content %}
<h2>Hello, {{ name }}!</h2>
{% endblock %}

在继承模板中,可以使用 {% block %} 标签定义可覆盖的区域,并使用 {% extends %} 标签继承基础模板。

3.5 模板中的控制语句

Jinja2 支持在模板中使用控制语句,例如循环和条件语句。

循环语句:

<ul>{% for name in names %}<li>{{ name }}</li>{% endfor %}
</ul>

条件语句:

{% if user.is_authenticated %}<p>Welcome, {{ user.name }}!</p>
{% else %}<p>Please log in.</p>
{% endif %}

4. 数据库集成

Flask 通过集成 SQLAlchemy 等数据库 ORM 库,实现与数据库的交互。

4.1 安装 SQLAlchemy

使用 pip 安装 Flask-SQLAlchemy 扩展:

pip install Flask-SQLAlchemy

4.2 配置数据库

在应用的配置中添加数据库连接字符串,例如使用 SQLite 数据库:

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

4.3 定义模型

使用 SQLAlchemy 定义数据库模型,例如用户模型:

from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy(app)class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True, nullable=False)email = db.Column(db.String(120), unique=True, nullable=False)def __repr__(self):return f'<User {self.username}>'

代码解释:

  • db = SQLAlchemy(app): 创建一个 SQLAlchemy 实例,并绑定到 Flask 应用。
  • class User(db.Model): 定义一个用户模型,继承自 db.Model
  • id = db.Column(db.Integer, primary_key=True): 定义 id 列,作为主键。
  • username = db.Column(db.String(80), unique=True, nullable=False): 定义 username 列,字符串类型,必须唯一且非空。
  • email = db.Column(db.String(120), unique=True, nullable=False): 定义 email 列,字符串类型,必须唯一且非空。

4.4 创建数据库

在交互式 Python 解释器中运行以下命令,创建数据库和表:

>>> from app import db
>>> db.create_all()

4.5 操作数据库

插入数据:

user = User(username='Alice', email='alice@example.com')
db.session.add(user)
db.session.commit()

查询数据:

users = User.query.all()
print(users)

更新数据:

user = User.query.filter_by(username='Alice').first()
user.email = 'alice@newdomain.com'
db.session.commit()

删除数据:

user = User.query.filter_by(username='Alice').first()
db.session.delete(user)
db.session.commit()

4.6 处理数据库关系

SQLAlchemy 支持处理一对多、多对多等复杂关系,例如定义一对多关系:

父模型:

class Author(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(50), nullable=False)books = db.relationship('Book', backref='author', lazy=True)

子模型:

class Book(db.Model):id = db.Column(db.Integer, primary_key=True)title = db.Column(db.String(100), nullable=False)author_id = db.Column(db.Integer, db.ForeignKey('author.id'), nullable=False)

代码解释:

  • db.relationship('Book', backref='author', lazy=True): 在 Author 模型中定义一个关系属性 books,表示与 Book 模型的一对多关系。
  • db.ForeignKey('author.id'): 在 Book 模型中定义外键 author_id,指向 Author 模型的 id 列。

5. 表单处理

Flask-WTF 是一个集成 WTForms 的 Flask 扩展,用于处理表单创建、验证和错误处理。

5.1 安装 Flask-WTF

使用 pip 安装 Flask-WTF 扩展:

pip install Flask-WTF

5.2 配置 Flask-WTF

在应用的配置中添加 CSRF 保护的密钥:

app.config['SECRET_KEY'] = 'your_secret_key'

5.3 定义表单

使用 Flask-WTF 定义一个登录表单:

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequiredclass LoginForm(FlaskForm):username = StringField('Username', validators=[DataRequired()])password = PasswordField('Password', validators=[DataRequired()])submit = SubmitField('Login')

代码解释:

  • FlaskForm: 表单基类。
  • StringField: 文本输入框。
  • PasswordField: 密码输入框。
  • SubmitField: 提交按钮。
  • DataRequired: 验证器,确保字段不为空。

5.4 渲染表单

在视图函数中创建表单实例,并在模板中渲染表单。

视图函数:

@app.route('/login', methods=['GET', 'POST'])
def login():form = LoginForm()if form.validate_on_submit():# 处理登录逻辑return 'Login successful'return render_template('login.html', form=form)

模板文件 (login.html):

<!DOCTYPE html>
<html>
<head><title>Login</title>
</head>
<body><form method="POST">{{ form.hidden_tag() }}<p>{{ form.username.label }}<br>{{ form.username(size=32) }}<br>{% for error in form.username.errors %}<span style="color: red;">[{{ error }}]</span>{% endfor %}</p><p>{{ form.password.label }}<br>{{ form.password(size=32) }}<br>{% for error in form.password.errors %}<span style="color: red;">[{{ error }}]</span>{% endfor %}</p><p>{{ form.submit() }}</p></form>
</body>
</html>

代码解释:

  • form.validate_on_submit(): 检查表单是否通过验证。
  • {{ form.hidden_tag() }}: 渲染 CSRF 保护的隐藏标签。
  • {{ form.username.label }}: 渲染表单字段的标签。
  • {{ form.username(size=32) }}: 渲染表单字段的输入框。
  • {% for error in form.username.errors %}: 渲染验证错误信息。

5.5 表单验证

在表单定义中添加验证器,例如 Email 验证器:

from wtforms.validators import Emailclass LoginForm(FlaskForm):username = StringField('Username', validators=[DataRequired(), Email()])password = PasswordField('Password', validators=[DataRequired()])submit = SubmitField('Login')

代码解释:

  • Email(): 验证器,确保字段是有效的电子邮件地址。

5.6 自定义验证器

可以定义自定义验证器,并在表单定义中使用:

from wtforms.validators import ValidationErrordef custom_validator(form, field):if field.data != 'expected_value':raise ValidationError('Invalid value')class LoginForm(FlaskForm):username = StringField('Username', validators=[DataRequired(), custom_validator])password = PasswordField('Password', validators=[DataRequired()])submit = SubmitField('Login')

代码解释:

  • custom_validator(form, field): 自定义验证器函数,检查字段值是否为预期值。
  • raise ValidationError('Invalid value'): 抛出验证错误。

6. 用户认证

Flask-Login 是一个用户会话管理扩展,用于处理用户登录、注销和会话管理。

6.1 安装 Flask-Login

使用 pip 安装 Flask-Login 扩展:

pip install Flask-Login

6.2 配置 Flask-Login

在应用中初始化 Flask-Login,并定义用户加载函数:

from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_userlogin_manager = LoginManager(app)
login_manager.login_view = 'login'@login_manager.user_loader
def load_user(user_id):return User.query.get(int(user_id))

代码解释:

  • LoginManager(app): 创建一个 LoginManager 实例,并绑定到 Flask 应用。
  • login_manager.login_view = 'login': 设置登录视图的端点。
  • @login_manager.user_loader: 定义用户加载函数,根据用户 ID 加载用户对象。

6.3 定义用户模型

用户模型需要继承 UserMixin,并实现用户加载函数:

class User(UserMixin, db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True, nullable=False)email = db.Column(db.String(120), unique=True, nullable=False)password = db.Column(db.String(128), nullable=False)def __repr__(self):return f'<User {self.username}>'

代码解释:

  • UserMixin: 提供用户会话管理所需的方法和属性。

6.4 用户登录

在视图函数中处理用户登录:

@app.route('/login', methods=['GET', 'POST'])
def login():form = LoginForm()if form.validate_on_submit():user = User.query.filter_by(username=form.username.data).first()if user and user.password == form.password.data:login_user(user)return 'Login successful'return render_template('login.html', form=form)

代码解释:

  • User.query.filter_by(username=form.username.data).first(): 根据用户名查询用户。
  • login_user(user): 登录用户,创建用户会话。

6.5 保护视图

使用 @login_required 装饰器保护需要登录访问的视图:

@app.route('/dashboard')
@login_required
def dashboard():return f'Welcome, {current_user.username}!'

代码解释:

  • @login_required: 确保只有登录用户才能访问该视图。
  • current_user: 获取当前登录的用户对象。

6.6 用户注销

在视图函数中处理用户注销:

@app.route('/logout')
@login_required
def logout():logout_user()return 'You have been logged out.'

代码解释:

  • logout_user(): 注销用户,结束用户会话。

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

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

相关文章

《Rust权威指南》学习笔记(三)

泛型和trait 1.泛型可以提高代码的复用能力&#xff0c;泛型是具体类型或其他属性的抽象代替&#xff0c;可以看成是一种模版&#xff0c;一个占位符&#xff0c;编译器在编译时会将这些占位符替换成具体的类型&#xff0c;这个过程叫做“单态化”&#xff0c;所以使用泛型的…

计算机网络基础(7)中科大郑铨老师笔记

应用层 目标&#xff1a;  网络应用的 原理&#xff1a;网络应用协议的概念和实现方面 传输层的服务模型 客户-服务器模式 对等模式(peerto-peer) 内容分发网络  网络应用的 实例&#xff1a;互联网流行的应用层协 议  HTTP  FTP  SMTP / POP3 / IMAP  DNS…

2022浙江大学信号与系统笔记

原视频地址&#xff1a;2022浙江大学信号与系统&#xff08;含配套课件和代码&#xff09; - 胡浩基老师-哔哩哔哩 ⭐⭐⭐ 我的笔记&#xff1a;飞书链接 - 信号与系统 基于视频&#xff0c;记得笔记&#xff0c;加了点自己的补充&#xff08;有的是问 ChatGPT 的&#xff09;…

数学建模入门——建模流程

摘要&#xff1a;本文介绍了数学建模的一般流程概述。 目录 一、前言 二、数据预处理 三、描述性统计分析 四、模型建立 五、模型评价 一、前言 本文将为想要入门数学建模的同学讲述数学建模的一般流程。但数学建模流程并非一成不变。虽有大致步骤&#xff0c;像分析问题、…

如何使用OpenCV进行抓图-多线程

前言 需求&#xff1a; 1、如何使用OpenCV捕抓Windows电脑上USB摄像头的流、 2、采用多线程 3、获知当前摄像头的帧率。 这个需求&#xff0c;之前就有做了&#xff0c;但是由于出现了一个问题&#xff0c;人家摄像头的帧率目前都可以达到60帧/s 了&#xff0c;而我的程序…

NLP CH3复习

CH3 3.1 几种损失函数 3.2 激活函数性质 3.3 哪几种激活函数会发生梯度消失 3.4 为什么会梯度消失 3.5 如何解决梯度消失和过拟合 3.6 梯度下降的区别 3.6.1 梯度下降&#xff08;GD&#xff09; 全批量&#xff1a;在每次迭代中使用全部数据来计算损失函数的梯度。计算成本…

01 数据分析介绍及工具准备

数据分析介绍及工具准备 一、工具准备二、下载和使用Anaconda三、jupyter notebook常用快捷键 一、工具准备 数据科学库 NumPy&#xff0c;SciPy&#xff0c;Pandas&#xff0c;Scikit-Learn 数据可视化库 Matplotlib&#xff0c;Seaborn 编译器 Jupyter Notebook 数据科…

机组的概述

计算机系统组成 硬件系统和软件系统 计算机硬件 1.冯诺依曼机基本思想 特点 1.采用“存储程序”工作方式 2.硬件系统由运算器&#xff0c;存储器&#xff0c;控制器&#xff0c;输入输出设备组成 3.指令和数据存在存储器中&#xff0c;形式无区别 4.指令和数据用二进制代…

Windows应用开发-解析MP4视频文件(第1部分)

下载本应用 本Windows应用解析MP4视频文件&#xff0c;以表格的方式显示MP4文件结构。并可以将结果保存到bmp图片。 使用方法 选择“打开MP4视频文件”菜单项&#xff0c;打开MP4文件&#xff0c;就可以获得如下图像&#xff1a; box的每一项&#xff0c;用3个矩形表示&…

Scala_【4】流程控制

第四章 分支控制if-else单分支双分支多分支返回值嵌套分支 For循环控制包含边界不包含边界循环守卫循环步长嵌套循环循环返回值 While循环Break友情链接 分支控制if-else 单分支 双分支 多分支 返回值 嵌套分支 For循环控制 Scala也为for循环这一常见的控制结构提供了非常多的…

电商Google广告:2025年提升转化率的5种策略

展望 2025 年&#xff0c;Google 广告领域将迎来一系列显著变化&#xff0c;这些趋势对于提升广告转化率至关重要&#xff0c;值得我们提前关注与布局。 智能化程度持续加深&#xff0c;用户搜索习惯愈发精细&#xff0c;广告格式推陈出新&#xff0c;视频广告势头正猛...那么…

一文大白话讲清楚TCP连接的三次握手和断开连接的四次挥手的原理

文章目录 一文大白话讲清楚TCP连接的三次握手和断开连接的四次挥手的原理1.TCP建立连接需要3次握手1.1 先讲个你兄弟的故事1.2 TCP 3次握手1.2 TCP 3次握手8件事1.3 TCP握手能不能是两次 2. TCP 断开连接要4次挥手2.1 还回到你兄弟的故事上2.2 TCP 4次挥手2.2 TCP4次挥手4件事2…

基于springboot的课程作业管理系统(源码+数据库+文档)

亲测完美运行带论文&#xff1a;文末获取源码 文章目录 项目简介&#xff08;论文摘要&#xff09;运行视频包含的文件列表&#xff08;含论文&#xff09;前端运行截图后端运行截图 项目简介&#xff08;论文摘要&#xff09; 随着科学技术的飞速发展&#xff0c;社会的方方面…

【ArcGIS微课1000例】0136:制作千层饼(DEM、影像、等高线、山体阴影图层)

文章目录 一、效果展示二、数据准备三、制作过程1. 打开软件2. 制作DEM图层3. 制作影像层4. 制作TIN层5. 制作等高线层四、注意事项一、效果展示 二、数据准备 订阅专栏后,从专栏配套案例数据包中的0136.rar中获取。 1. dem 2. 影像 3. 等高线 4. tin 三、制作过程 1. 打开软…

蓝桥杯备赛:C++基础,顺序表和vector(STL)

目录 一.C基础 1.第一个C程序&#xff1a; 2.头文件&#xff1a; 3.cin和cout初识&#xff1a; 4.命名空间&#xff1a; 二.顺序表和vector&#xff08;STL&#xff09; 1.顺序表的基本操作&#xff1a; 2.封装静态顺序表&#xff1a; 3.动态顺序表--vector&#xff1a;…

探索AI在地质科研绘图中的应用:ChatGPT与Midjourney绘图流程与效果对比

文章目录 个人感受一、AI绘图流程1.1 Midjourney&#xff08;1&#xff09;环境配置&#xff08;2&#xff09;生成prompt&#xff08;3&#xff09;完善prompt&#xff08;4&#xff09;开始绘图&#xff08;5&#xff09;后处理 1.2 ChatGPT不合理的出图结果解决方案 二、主题…

融合表面信息和等变扩散的分子对接模型 SurfDock - 评测

SurfDock 是一个几何扩散模型&#xff0c;蛋白质序列、三维结构图、以及表面结构等结构特征&#xff0c;采用的是非欧里几何的范式处理小分子的旋转、平移以及扭转。 SurfaceDock 以蛋白口袋作为条件&#xff0c;从 rdkit 生成的随机小分子构象开始&#xff0c;对平移、旋转、扭…

CSS——2.书写格式一

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><!--css书写中&#xff1a;--><!--1.css 由属性名:属性值构成--><!--style"color: red;font-size: 20px;&quo…

R机器学习:神经网络算法的理解与实操,实例解析

神经网络算法是一种模仿生物神经网络&#xff08;尤其是人脑&#xff09;结构和功能的算法。它由大量相互连接的节点&#xff08;称为神经元&#xff09;组成&#xff0c;这些神经元组织成层&#xff0c;通过传递信号来处理信息。神经网络算法在机器学习、人工智能等领域中扮演…

【C++】B2092 开关灯

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述和解析题目描述输入格式输出格式解析 &#x1f4af;实现代码对比&#xff1a;我的做法和老师的做法我的代码实现代码分析优点问题 老师的代码实现代码分析 &#x…