初识 Flask 框架

目录

1. Flask 框架概述

1.1 安装 Flask

1.2 创建你的第一个 Flask 应用

1.3 运行 Flask 应用

2. Flask 路由与视图函数

2.1 动态路由

2.2 支持多种 HTTP 请求方法

2.3 使用 Jinja2 模版渲染 HTML

2.5 模版继承与块

3. Flask 表单处理与用户输入

3.1 安装 Flask-WTF

3.2 创建一个简单的表格

3.3 表单验证

4. Flask 的项目结构与部署

4.1项目结构

4.2 部署 Flask 应用


1. Flask 框架概述

Flask 作为一个微框架,强调简单性和灵活性。它依赖于两个重要的 Python 库来提供核心功能:

  • Werkzeug:这是 Flask 的底层库,提供了 WSGI 接口、HTTP 请求和响应处理、路由等核心功能,。
  • Jinja2:一个功能强大的模板引擎,用于动态生成 HTML 页面。

Flask 的设计目的是让开发者能够快速开发应用,并提供了灵活的方式进行扩展。如果你不需要复杂的功能,Flask 的核心本身已经足够满足需求。如果你需要更多高级特性,可以通过 Flask 的扩展库进行补充。

1.1 安装 Flask

安装 Flask 非常简单,只需使用 Python 的包管理工具 pip 即可:

pip install flask

安装完成后,你可以通过创建一个简单的 Flask 应用来验证是否安装成功。

1.2 创建你的第一个 Flask 应用

Flask 的应用结构非常简单,只需创建一个 Python 文件,并通过 Flask()类来实例化应用对象。以下是一个最简单的 Flask 应用示例:

from flask import Flask
# 创建 Flask 应用实例
app =Flask( name )
# 定义路由和视图函数
@app.route('/')
def hello world():return 'Hello, world!"
# 启动应用
if name=='main ':
app.run(debug=True)

代码解析:

  • Flask( name ):创建 Flask 应用实例,_name 参数用于 Flask 了解当前模块的名称,通2常我们使用这个参数来帮助 Flask 在不同模块间进行配置。
  • @app.route('/'):定义路由和视图函数的映射。'/'是根路径,当用户访问根 URL 时,Flask会调用 hello world()函数。
  • return'Hello,world!':视图函数返回一个简单的字符串响应,Flask 会将其作为 HTTP 响应返回给客户端。
  • app.run(debug=True):启动Flask开发服务器,debug=True 表示启用调试模式,这样可以在开发过程中自动重载应用,并在发生错误时显示详细信息。

1.3 运行 Flask 应用

保存上述代码为 app.py,然后在命令行中运行:

python app.py

这时 Flask 会启动一个开发服务器,默认会监听127.0.0.1:5000。打开浏览器,访问http://127.0.0.1:5000/,你会看到“Hello,World!”的页面。

2. Flask 路由与视图函数

Flask 的核心之一就是路由系统,它将用户访问的 URL 与对应的视图函数相连接。Flask 通过装饰器@app.route()来定义路由,而视图函数则负责处理用户的请求并返回响应。

2.1 动态路由

Flask 支持动态路由参数,可以通过 URL 中的动态部分来获取数据。以下是一个示例:

@app.route('/greet/<name>')
def greet(name):return f'Hello, {name}!"

代码解析:

  • <name>:这是一个动态路由参数,Flask 会提取 URL 中的 name 部分并将其传递给视图函数。
  • 当用户访问/greet/John 时,name 的值将为 John,返回的响应为 Hello,John!。

2.2 支持多种 HTTP 请求方法

Flask 不仅支持 GET 请求,还支持其他常见的 HTTP 请求方法,如 POST、PUT、DELETE等。你可以通过methods 参数来指定允许的请求方法:

@app.route('/submit', methods=['PosT'])
def submit():return 'Form submitted successfully!'

代码解析:

  • methods=['POST']:只允许 POST 请求访问此路由。如果用户通过 GET 请求访问,Flask 会返回405 Method Not Allowed 错误。

2.3 使用 Jinja2 模版渲染 HTML

Flask 结合 Jinja2 模板引擎来动态生成 HTML 页面。你可以将 HTML 文件与 Python 代码分离,保持应用结构清晰。在 Flask 中,模板文件默认存放在 templates 文件夹中
假设我们有一个名为 greet.html 的模板文件,内容如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Flask Example</title>
</head>
<body><h1>Hello,{{ name }}!</h1>
</body>
</html>

在 Flask 应用中,我们可以通过 render_template 兩数渲染模板并传递动态数据:

from flask import render template@app.route('/greet/<name>')
def greet(name):return render template('greet.html',name=name)

代码解析:

  • render template('greet.html', name=name): Flask 会加载 greet.html 模板,并将 name的值传递给模板。模板中的{{ name }}会被替换为传入的值。

2.5 模版继承与块

Flask 文持模板继承和块(Block)功能,这对于构建复杂页面非常有用。你可以在基础模板中定义通用的布局结构,在子模板中覆盖特定的部分。

基础模板 base.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{% block title %}My website% endblock %}</title>
</head>
<body><header><h1>Welcome to My website</h1></header><div>{% block content %}{% endblock %}</div><footer><p>&copy; 2025 My Website</p>\</footer>
</body>
</html>

子模板 index.html:

{% extends 'base.html'%}{% block title %}Home{% endblock %}{% block content %}<h2>Welcome to the homepage!</h2>
{% endblock %}

代码解析:

  • {% extends 'base.html’%}:子模板继承了 base.htm1 模板。
  • {% block title %}Home{% endblock %}:覆盖父模板中的 title 块。
  • {% block content %}:定义页面的主要内容区域。

3. Flask 表单处理与用户输入

Flask 可以通过表单来获取用户输入,常见的做法是结合 FlaskK-WTF 扩展来简化表单处理和验证。
Flask-WTF为Flask 提供了一个表单类,你可以在表单类中定义字段和验证规则。

3.1 安装 Flask-WTF

pip install flask-wtf

3.2 创建一个简单的表格

from flask import Flask, render template, request
from flask wtf import FlaskForm
from wtforms import stringField
from wtforms.validators import DataRequiredapp = Flask( __name__)
app.secret key='s3cr3t'class NameForm(FlaskForm):name =stringField('Name',validators=[DataRequired()])@app.route('/', methods=['GET','POST'])
def index():form =NameForm()if form.validate on submit():return f'Hello, {form.name.data}!'return render template("index.html',form=form)if __name__ == '__main__':app.run(debug=True)

代码解析:

  • FlaskForm:继承自 FlaskForm 类,定义表单字段。
  • StringField('Name',validators=[DataRequired()]):定义了一个文本输入字段,并且通2过 DataRequired()验证器确保字段不能为空。
  • form.validate on submit():检查表单是否通过验证并被提交。

index.htm1 模板:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Flask Form</title>
</head>
<body><h1>Enter your name:</h1><form method="PosT">{{ form.csrf token }}<label for="name">Name:</label>{{ form.name()}}<br><br>   <button type="submit">Submit</button></form>{% if form.name.data %}<h2>Hello,{{ form.name.data }}!</h2){% endif %}
</body>
</html>

代码解析:

  • {{ form.csrf_token }}:FlasK-WTF会自动生成并验证 CSRF token,以防止跨站请求伪造攻击。
  • {{ form.name()}}:这是通过 Jinja2 模板渲染 Nameform 表单的字段。form.name()会生成对应的 HTML 标签。
  • {% if form.name.data %}:如果用户提交了表单并且 name 字段不为空,则显示欢迎信息。

3.3 表单验证

Flask 表单处理的强大之处在于它的验证机制。通过 wtforms,你可以非常方便地为表单字段添加各种验证规则。比如,除了 DataRequired(),你还可以使用:

  • Length(min=2,max=50):验证输入的长度。
  • Emai1():验证输入是否是有效的邮箱地址。
  • EqualTo('password'):验证两个字段的值是否相等

4. Flask 的项目结构与部署

4.1项目结构

随着应用的复杂度增加,Flask应用的结构通常会发生变化。。一个典型的 Flask 项目结构如下:

/my_flask app/app/templatesindex.html/static/css/js__init__.pyroutes .pyforms.pyrun.py
  •  /templates:存放所有 HTML 模板文件。
  • /static:存放静态文件(如 CSS、JS、图片等)。
  • __init__·py:初始化 Flask 应用。
  • routes.py:定义所有路由和视图函数。
  • forms.py:定义表单类。

4.2 部署 Flask 应用

Flask 应用的开发环境通常使用 Flask run 启动,但在生产环境中,我们需要通过更强大的 web 服务器进行部署,常见的有:

  • Gunicorn:一个Python WSGI HTTP 服务器,常用于生产环境部署,
  • Nginx:作为反向代理,前端处理静态文件请求,转发动态请求到Flask 应用。部署时,可以通过以下命令启动 Flask 应用:
gunicorn -w 4 run:app

这将启动一个4 工作线程的 Gunicorn 服务器,run 是指向 Flask 应用实例的模块。

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

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

相关文章

《深入剖析:Python自动化测试框架之unittest与pytest》

unittest作为Python标准库的一部分&#xff0c;犹如一位沉稳可靠的“老工匠”&#xff0c;默默为无数项目提供着坚实的测试基础。它诞生于Python社区长期的实践沉淀&#xff0c;拥有一套标准化的测试体系&#xff0c;就像一套精密的仪器&#xff0c;各个部件各司其职。 unitte…

【Python 命名元祖】collections.namedtuple 学习指南

&#x1f4da; collections.namedtuple 学习指南 命名元组&#xff08;namedtuple&#xff09;是 Python collections 模块中一种增强型元组&#xff0c;支持通过字段名访问元素&#xff0c;同时保持元组的内存效率和不可变性。 一、基础用法 1. 定义命名元组 from collectio…

iOS知识复习

block原理 OC block 是个结构体&#xff0c;内部有个一个结构体成员 专门保存 捕捉对象 Swift闭包 是个函数&#xff0c;捕获了全局上下文的常量或者变量 修改数组存储的内容&#xff0c;不需要加_block,修改数组对象本身时需要 weak原理 Weak 哈希表 &#xff08;散列表&a…

手眼标定:九点标定、十二点标定、OpenCV 手眼标定

因为一直使用6轴协作机器人&#xff0c;且主要应用是三维视觉&#xff0c;平常的手眼标定基本都是基于OpenCV来计算的&#xff0c;听说有九点标定和十二点标定&#xff0c;顺便了解下。 目录 1.九点标定1.1 基本原理1.2 关于最小二乘法1.3 具体示例 2.十二点标定3.OpenCV 手眼标…

CSS之元素定位

元素定位 一、什么是元素定位 元素定位&#xff08;CSS Positioning&#xff09; 是指通过CSS的 position 属性控制HTML元素在页面中的布局方式。它决定了元素如何相对于其父元素、视口或其他元素进行位置调整。 CSS的 position 属性用于控制元素在页面上的定位方式&#xff…

测试工程师如何通俗理解和入门RAG:从“查资料”到“写答案”的智能升级

1. 为什么要学习RAG?——从“查资料”到“写答案”的飞跃 背景:你已经掌握了Embedding技术,能将文档、代码、测试用例等离散信息转化为向量,用于相似度匹配。 痛点:但仅靠向量匹配找到相关文档后,如何快速生成答案?如何避免“找到文档却不会总结”的尴尬? RAG的价值:…

数量优势:使用Bagging和Boosting的集成模型

文章目录 装袋法&#xff08;Bagging&#xff09;和提升法&#xff08;Boosting&#xff09;利用集成学习创建强大的模型装袋法&#xff08;Bagging&#xff09;&#xff1a;为机器学习模型增加稳定性装袋法示例 提升法&#xff08;Boosting&#xff09;&#xff1a;减少弱学习…

5G基站选择±10ppm晶振及低相噪技术解析

在5G通信技术飞速发展的时代&#xff0c;5G基站作为核心基础设施&#xff0c;其性能的优劣直接影响着整个通信网络的质量。晶振作为5G基站中的关键器件&#xff0c;对基站的频率稳定性、信号传输质量等起着至关重要的作用。 5G基站对晶振的要求 &#xff08;一&#xff09;高…

嵌入式<style>设计模式

每天分享一个web前端开发技巧。 今天分享的主题是&#xff0c;如何提升前端代码的内聚性。我们在写<style></style>的时候&#xff0c;往往把大量无关联的样式写在同一个<style>下&#xff0c;而且离相关的html元素很远&#xff0c;这样导致每次想修改某个元…

简单数学板子和例题

线性丢番图方程 axbyc dgcd(a,b)&#xff0c;若c|d&#xff0c;有无穷整数解 x x 0 b d n , y y 0 − a d n xx_0{b\over d}n,yy_0-{a\over d}n xx0​db​n,yy0​−da​n POJ 1265 poj真难用&#xff0c;abs一直报错&#xff0c;万能头也不能用&#xff0c;给我调红温了 …

深度解析视频剪辑SDK开发:从AI字幕提取到多端原生插件集成-优雅草卓伊凡

深度解析视频剪辑SDK开发&#xff1a;从AI字幕提取到多端原生插件集成-优雅草卓伊凡 引言&#xff1a;视频剪辑技术的演进与市场需求 近年来&#xff0c;短视频和社交媒体的爆发式增长推动了视频剪辑技术的快速发展。优雅草卓伊凡及其团队近期接到一个客户需求&#xff1a;开…

对WireShark 中的EtherCAT抓包数据进行解析

对WireShark 中的EtherCAT抓包数据进行解析 EtherCAT数据包结构 EtherCAT数据帧结构如下&#xff1a; 采用 Python 实现对 EtherCAT 数据包进行解析 import numpy as np import matplotlib.pyplot as plt from IPython import embed from collections import Counter import …

基于SpringBoot的校园电竞赛事系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…

数据湖和数据仓库的区别

在当今数据驱动的时代&#xff0c;企业需要处理和存储海量数据。数据湖与数据仓库作为两种主要的数据存储解决方案&#xff0c;各自有其独特的优势与适用场景。本文将客观详细地介绍数据湖与数据仓库的基本概念、核心区别、应用场景以及未来发展趋势&#xff0c;帮助读者更好地…

Mysql 刷题Day09

LC 585 2016年的投资 思路&#xff1a; 本题思路好想 &#xff0c; 就是把2015年投资相同的找出来 &#xff0c;再找出这其中经纬度不同的id对应的2016年的保险。 实际操作中&#xff0c; 发现用group by很麻烦&#xff0c; 那么想到窗口函数也能 分组进行统计 利用 count(…

Lambda表达式的方法引用详解

Lambda表达式的方法引用详解 1. 方法引用的概念与作用 定义:方法引用(Method Reference)是Lambda表达式的一种简化写法,允许直接通过方法名引用已有的方法。核心目的:减少冗余代码,提升可读性,尤其在Lambda仅调用一个现有方法时。语法符号:双冒号 ::。2. 方法引用的四种…

记录python在excel中添加一列新的列

思路是&#xff0c;先将需要添加为新的列存储到一个暂时的列表中&#xff0c;然后用到以下函数来存储 data_.loc[:, "新列的名字"] save_list_ 上面的save_list_就是暂时存储了信息的列表了。 以下是我的代码&#xff0c;供以后快速回忆。 schools_data {"98…

关于flutter中Scaffold.of(context).openEndDrawer();不生效问题

原因&#xff1a; 在 Flutter 中&#xff0c;Scaffold.of(context) 会沿着当前的 context 向上查找最近的 Scaffold。如果当前的 widget 树层级中没有合适的 Scaffold&#xff08;比如按钮所在的 context 是在某个子 widget 中&#xff09;&#xff0c;就找不到它。 解决办法…

财管-1-财务分析、评价和预测

1.因素分析法&#xff1a; 报告期&#xff08;实际&#xff09;指标M1A1 * B1 * C1 基 期&#xff08;计划&#xff09;指标M0A0 * B0 * C0……&#xff08;1&#xff09; 第一次替代 A1 * B0 * C0……&#xff08;2&#xff09; 第二次替代 A1 * B1 * C0……&#xff08;3…

golang逃逸分析

1.1 逃逸分析是什么 逃逸分析是指编译器在执行静态代码分析后&#xff0c;对内存管理进行的优化和简化。 在编译原理中&#xff0c;分析指针动态范围的方法被称为逃逸分析。通俗来讲&#xff0c;当一个对象的指针被多个方法或线程引用时&#xff0c;则称这个指针发生了逃逸。…