flask学习

news2024/9/21 18:55:49

flask学习

一、什么是flask

Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。

Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或Web服务的实现。另外,Flask还有很强的定制性,用户可以根据自己的需求来添加相应的功能,在保持核心功能简单的同时实现功能的丰富与扩展,其强大的插件库可以让用户实现个性化的网站定制,开发出功能强大的网站。

二、背景

看这个框架介绍感觉云里雾里的, 其实就是如果你不会写java但是还要将做一些应用开发,例如文件上传或者前端数据展示。这个框架不要求有太强的java开发基础,因为它是python语言编写的,这样的话对咱做数据的就很友好了,毕竟咱做数据湖那么久了python使用不能说如虎添翼,但这个框架确实让我们如鱼得水了。

三、Flask构成

  • 路由(Routing):Flask 使用路由来定义 URL 和对应的处理函数。通过装饰器 @app.route(),可以将一个 URL 映射到相应的处理函数上,从而实现请求的路由和处理。

  • 视图函数(View Functions):视图函数是 Flask 中处理请求的核心组件,它接收请求并返回响应。视图函数通常被装饰器绑定到特定的 URL 路由上。

  • 请求上下文(Request Context):Flask 在处理请求时会创建一个请求上下文,其中包含了请求的信息,例如请求的方法、URL 参数、表单数据等。视图函数可以通过 request 对象来访问请求上下文中的数据。

  • 响应对象(Response Object):视图函数需要返回一个响应对象,用于向客户端返回数据。Flask 提供了 make_response() 函数和 Response 类来构造响应对象,也可以直接返回字符串、模板渲染结果等。

  • 模板引擎(Template Engine):Flask 默认使用 Jinja2 模板引擎来渲染 HTML 页面。模板引擎允许开发者在模板中嵌入动态内容,从而将数据和视图分离,使页面更加灵活和易于维护。

  • 上下文全局变量(Context Globals):Flask 提供了一些上下文全局变量,例如 current_app 和 g,可以在视图函数中使用。current_app 表示当前应用的实例,g 是一个全局变量字典,可以在同一请求中共享数据。

  • 扩展(Extensions):Flask 的功能可以通过扩展来增强,例如数据库支持、表单验证、用户认证等。Flask 社区提供了大量的扩展,使开发者能够更方便地添加功能。

  • 蓝图(Blueprint):蓝图是一种将 Flask 应用分割为小模块的方式,可以将相关的路由和视图函数组织在一个蓝图中,使应用更加结构化和易于管理。

在这里插入图片描述

四、运用

4.1、helloworld

from flask import Flask, request, jsonify, render_template, redirect

# 用当前脚本名称实例化Flask对象,方便flask从该脚本文件中获取需要的内容
app = Flask(__name__)


# 在Flask中,通过@app.route装饰器来表示路由
@app.route("/")
def index():
    return "Hello World!"

# 启动http服务
if __name__ == '__main__':
    # 默认端口5000  
    app.run(debug=True) 
    # app.run(debug=True,port=6666) 自定义端口为6666

在浏览器输入

http://127.0.0.1:5000

可以看到helloworld

4.2、请求方式

methods用于指定允许的请求方式,默认是get请求

from flask import Flask, request, jsonify, render_template, redirect

app = Flask(__name__)


@app.route("/hello", methods=['GET', 'POST'])
def hello():
    return "Hello Mr,Tree!"

# 启动http服务
if __name__ == '__main__':
    app.run(debug=True) 
请求方式说明底层
GET从指定的资源请求数据浏览器会把 http header 和 data 一并发送出去,服务器响应 200 (返回数据)表示成功
POST向指定的资源提交要被处理的数据。浏览器先发送 header,服务器响应 100, 浏览器再继续发送 data,服务器响应 200 (返回数据)
from flask import Flask, request, jsonify, render_template, redirect

app = Flask(__name__)

# 默认请求方式为 GET
@app.route("/index/request")
def index_request():
    if request.method == 'GET':
        return 'GET'
    elif request.method == 'POST':
        return 'POST'

# 启动http服务
if __name__ == '__main__':
    app.run(debug=True) 

访问

http://127.0.0.1:5000/index/request

显示

GET

4.3、参数

4.3.1、在roote中指定多个参数
from flask import Flask, request, jsonify, render_template, redirect

app = Flask(__name__)

# 指定固定格式的参数类型(此处制定了两个参数)
@app.route("/index/<int:id>/<name>", methods=['GET', 'POST'])
def index(id, name):
        return f'{id} = {name}'

# 启动http服务
if __name__ == '__main__':
    app.run(debug=True) 

参数说明
string字符串类型,可以是任意字符
int整数类型
float浮点数类型
path类似于字符串类型,但可以包含斜杠(/)
uuidUUID(通用唯一标识符)类型

访问

http://127.0.0.1:5000/index/1/king

网页显示

1 = king

4.3.2、传入参数为路径
from flask import Flask, request, jsonify, render_template, redirect

app = Flask(__name__)

# 指定固定格式的参数类型(此处制定了两个参数)
@app.route('/index/files', methods=['GET'])
def get_parameter():
    path = request.args.get('path')
    # 使用path进行相关操作
    return 'Path: {}'.format(path)

# 启动http服务
if __name__ == '__main__':
    app.run(debug=True) 

访问

http://127.0.0.1:5000/index/files?path=/tmp/load

网页显示

Path: /tmp/load

4.3.3、传入参数为数组
from flask import Flask, request, jsonify, render_template, redirect

app = Flask(__name__)

@app.route('/index/names', methods=['GET'])
def get_parameter():
    names = request.args.getlist('names')
    return f'Names: {names}'

# 启动http服务
if __name__ == '__main__':
    app.run(debug=True) 

访问

http://127.0.0.1:5000/index/names?names=a&names=b

网页显示

Names: [‘a’, ‘b’]

4.4.4、返回 json 给前端
from flask import Flask, jsonify

app = Flask(__name__)


# 返回json数据给前端
@app.route("/index/json")
def index():
    data = {
        'name': 'Tree'
    }
    return jsonify(data)


# 启动http服务
if __name__ == '__main__':
    app.run()

访问

http://localhost:5000/index/json

显示

{
  "name": "Tree"
}
4.4.5、动态url构建

动态选择,根据url传入参数的不同,动态跳转到不通的url

from flask import Flask, request, jsonify, render_template, redirect

app = Flask(__name__)

@app.route('/a')
def get_a():
    return 'Hello a'


@app.route('/other/<string:name>')
def get_other(name):
    return f'Hello {name}'


@app.route('/index/<name>')
def get_parameter(name):
    # 当传入参数为a时自动跳转连接到 http://127.0.0.1:5000/a
    if name == 'a':
        return redirect(url_for('get_a'))
    else:
        return redirect(url_for('get_other', name=name))es}'

# 启动http服务
if __name__ == '__main__':
    app.run(debug=True)

访问

http://127.0.0.1:5000/index/a

url自动跳转到

http://127.0.0.1:5000/a

访问

http://127.0.0.1:5000/index/b

url自动跳转到

http://127.0.0.1:5000/other/b

4.4、模板

python代码生成html会较为复杂,但是可以通过render_template()函数渲染HTML文件。

render_template(‘html名称’),这样会在python模块的同级目录下寻找templetes文件夹内中的html名称对应的文件进行渲染。

现有目录如下:

– test.py

– remplates

| – 基金收盘价.html

from flask import Flask, request, jsonify, render_template, redirect

app = Flask(__name__)

@app.route('/index')
def get_template():
    return render_template('基金收盘价.html')

# 启动http服务
if __name__ == '__main__':
    app.run(debug=True) 

访问

http://127.0.0.1:5000/index

显示

基金收盘价.html 页面

4.5、钩子函数

有时候我们需要在正常访问的前后固定执行某些操作,这个就用到了钩子函数,只需要为需要执行的方法添加装饰器即可

from flask import Flask, request, jsonify, render_template, redirect

app = Flask(__name__)

# 发起请求之前执行此方法
@app.before_request
def before_request_a():
    print('before_request_a')

# 请求结束以后执行此方法
@app.after_request
def after_request_a(response):
    print('after_request_a')
    # 装饰器接收response参数,运行完必须归还response,否则程序报错
    return response)


@app.route("/hello", methods=['GET', 'POST'])
def hello():
    return "Hello Mr,Tree!"

# 启动http服务
if __name__ == '__main__':
    app.run(debug=True) 
参数运行时说明
before_first_request请求之前仅第一次请求前会被调用
before_request请求之前每一次请求前都会被调用
after_request请求之后每一次请求之后都会调用(没有未处理异常的情况)
teardown_request请求之后每一次请求之后都会调用(有无异常都可以,debug模式关闭)

4.6、文件上传

1、创建一个enctype属性设置为’multipart/form-data’的HTML表单,并提交到指定的URL

2、 URL处理程序从request.files[]对象中提取文件并将其保存到所需的位置,每个文件上传会先传输到临时位置,上传完毕后保存到目标位置。

文件上传的临时目录默认是由 Werkzeug(Flask 底层使用的 WSGI 工具集)和底层操作系统控制的。

<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>Flask示例</title>
 </head>
    <body>
      <form action = "http://localhost:5000/index/upload" method = "POST" 
          enctype = "multipart/form-data">
          <input type = "file" name = "file" />
          <input type = "submit" value="提交"/>
       </form>
    </body>
 </html>
import os

from flask import Flask, request, render_template

app = Flask(__name__)
# 指定文件上传的路径
app.config['UPLOAD_FOLDER'] = './uploads'

@app.route('/index/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        f = request.files['file']
        print(request.files)
        file_path = os.path.join(app.config['UPLOAD_FOLDER'], f.filename)
        f.save(file_path)
        return 'file uploaded successfully'
    else:
        return render_template('upload.html')


# 启动http服务
if __name__ == '__main__':
    app.run()



4.7、邮件发送

需要先安装邮件发送的第三方包

pip install Flask-Mail

案例

from flask import Flask
from flask_mail import Mail, Message
app =Flask(__name__)
mail=Mail(app)
app.config['MAIL_SERVER']='邮件服务器的名称/IP地址'
app.config['MAIL_PORT'] = 所用服务器的端口号
app.config['MAIL_USERNAME'] = '发件人的用户名'
app.config['MAIL_PASSWORD'] = '发件人的用户密码'
app.config['MAIL_USE_TLS'] = False
app.config['MAIL_USE_SSL'] = True
mail = Mail(app)

@app.route("/index/mail")
def index():
    msg = Message('邮件文本', sender='邮件发送人的邮箱', recipients=['收件人邮箱'])
    msg.body = "Hello Flask message sent from Flask-Mail"
    mail.send(msg)
    return "Sent"


if __name__ == '__main__':
    app.run(debug=True)
4.7.1、邮件发送配置参数说明
参数说明
MAIL_SERVER邮件服务器的名称/IP地址
MAIL_PORT所用服务器的端口号
MAIL_USE_TLS启用/禁用传输安全层加密
MAIL_USE_SSL启用/禁用安全接字层加密
MAIL_DEBUG调试支持,默认是Flask应用程序的调试状态
MAIL_USERNAME发件人的用户名
MAIL_PASSWORD发件人的密码
MAIL_DEFAULT_SENDER设置默认发件人
MAIL_MAX_EMAILS设置要发送的最大邮件
MAIL_SUPPRESS_SEND如果app.testing设置为true,则发送被抑制
MAIL_ASCII_ATTACHMENTS如果设置为true,则将附加的文件名转换为ASCII
4.7.2、Mail方法说明
方法说明
send()发送Message类对象的内容
connect()与邮件主机打开连接
send_message()发送消息对象
4.7.3、Message类方法说明
方法参数说明
attach()向消息添加附件
filename要附加的文件的名称
content_type文件的MIME类型
data原始文件数据
disposition内容处置
add_recipient()向消息添加另一个收件人(抄送)
 |

| send_message() | 发送消息对象 |

4.7.3、Message类方法说明
方法参数说明
attach()向消息添加附件
filename要附加的文件的名称
content_type文件的MIME类型
data原始文件数据
disposition内容处置
add_recipient()向消息添加另一个收件人(抄送)

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

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

相关文章

【STM32嵌入式系统设计与开发---拓展】——1_9_1上拉输入和下拉输入

在使用GPIO引脚时&#xff0c;上拉输入和下拉输入的选择取决于外部电路的特性和应用需求。以下是它们各自的应用场景&#xff1a; 1、上拉输入&#xff08;Pull-up Input&#xff09; 用途: 当默认状态需要为高电平时。 避免引脚悬空&#xff08;floating&#xff09;导致的…

浅说区间dp(下)

文章目录 环形区间dp例题[NOI1995] 石子合并题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路 [NOIP2006 提高组] 能量项链题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路 [NOIP2001 提高组] 数的划分题目描述输入格式输出格式样例 #1样例输…

深度学习落地实战:基于GAN(生成对抗网络)生成图片

前言 大家好&#xff0c;我是机长 本专栏将持续收集整理市场上深度学习的相关项目&#xff0c;旨在为准备从事深度学习工作或相关科研活动的伙伴&#xff0c;储备、提升更多的实际开发经验&#xff0c;每个项目实例都可作为实际开发项目写入简历&#xff0c;且都附带完整的代…

【Android Studio】整合okhttp发送get和post请求(提供Gitee源码)

前言&#xff1a;本篇博客教学大家如何使用okhttp发送同步/异步get请求和同步/异步post请求&#xff0c;这边博主把代码全部亲自测试过了一遍&#xff0c;需要源码的可以在文章最后自行拉取。 目录 一、导入依赖 二、开启外网访问权限 三、发送请求 3.1、发送同步get请求…

mac如何合并pdf文件到一个文件 macpdf合并 Mac如何合并pdf文件

在数字化的今天&#xff0c;pdf文件因其跨平台、格式统一等优势&#xff0c;已经成为工作、学习和生活中不可或缺的文件格式。然而&#xff0c;当我们需要合并多个pdf文件时&#xff0c;可能会感到有些无从下手。本文将为你详细介绍几种简单实用的合并pdf的方法&#xff0c;让你…

【学习css3】使用flex和grid实现等高元素布局

过往的实现方法是使用浮动加计算布局来实现&#xff0c;当flex和grid问世时&#xff0c;这一切将变得简单起来 一、简单的两列实现 1、先看页面效果 2、css代码 .container {padding: 10px;width: 100ch;margin: 0 auto;box-shadow: inset 0 0 0 2px #ccc;}.column {margin: 2…

简单爬虫案例

准备工作&#xff1a; 1. 安装好python3 最低为3.6以上&#xff0c; 并成功运行pyhthon3 程序 2. 了解python 多进程原理 3. 了解 python HTTP 请求库 requests 的基本使用 4. 了解正则表达式的用法和python 中 re 库的基本使用 爬取目标 目标网站&#xff1a; https://…

STM32智能建筑能源管理系统教程

目录 引言环境准备智能建筑能源管理系统基础代码实现&#xff1a;实现智能建筑能源管理系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;能源管理与优化问题解决方案与优化收尾与总结 1. 引言 智能建筑能…

云计算数据中心(二)

目录 三、绿色节能技术&#xff08;一&#xff09;配电系统节能技术&#xff08;二&#xff09;空调系统节能技术&#xff08;三&#xff09;集装箱数据中心节能技术&#xff08;四&#xff09;数据中心节能策略和算法研究&#xff08;五&#xff09;新能源的应用&#xff08;六…

verilog刷题笔记

1、选择器实现方式 &#xff08;1&#xff09;case语句&#xff0c;注意default &#xff08;2&#xff09;if-else语言&#xff0c;注意else&#xff0c;有优先级 &#xff08;3&#xff09;三元运算符 &#xff1f; &#xff1a; 2、阻塞赋值/非阻塞赋值都是过程性赋值&a…

华为od机试真题 — 测试用例执行计划(Python)

题目描述 某个产品当前迭代周期内有N个特性&#xff08;F1, F2, ..., FN&#xff09;需要进行覆盖测试&#xff0c;每个特性都被评估了对应的优先级&#xff0c;特性使用其ID作为下标进行标识。 设计了M个测试用例&#xff08;T1, T2,...,TM&#xff09;&#xff0c;每个用例…

【JavaEE】HTTP协议(1)

&#x1f921;&#x1f921;&#x1f921;个人主页&#x1f921;&#x1f921;&#x1f921; &#x1f921;&#x1f921;&#x1f921;JavaEE专栏&#x1f921;&#x1f921;&#x1f921; &#x1f921;&#x1f921;&#x1f921;上一篇文章&#xff1a;【JavaEE】网络原理—…

入坑树莓派(2)——树莓派4B与手机蓝牙通信

入坑树莓派(2)——树莓派4B与手机蓝牙通信 1、引言 在入坑树莓派(1)中已经搞掂了可视化问题。现在继续开展下一步,尝试与手机通信,一开始是想弄wifi连接的,但发现基于wifi的APP比较难弄,为了降低开发的难度,又因为树莓派板子自带蓝牙模块,所以直接选用蓝牙连接手机…

Qt窗口程序整理汇总

到今日为止&#xff0c;通过一个个案例的实验&#xff0c;逐步熟悉了 Qt6下 窗体界面开发的&#xff0c;将走过的路&#xff0c;再次汇总整理。 Qt Splash样式的登录窗https://blog.csdn.net/castlooo/article/details/140462768 Qt实现MDI应用程序https://blog.csdn.net/cast…

昇思25天学习打卡营第16天|Vision Transformer图像分类

本节使用Vision Transfomer完成图像分类 相关知识 Vision Transformer ViT是计算机视觉和自然语言处理两个领域的融合成果。它使用transformer架构来处理图像数据&#xff0c;这种架构原本是用于处理自然语言的。 ViT的主要思想是将图像分割成固定大小的块&#xff08;patch…

kafka开启kerberos和ACL

作者&#xff1a;恩慈 一、部署kafka-KB包 1&#xff0e;上传软件包 依次点击 部署中心----部署组件----上传软件包 选择需要升级的kafka版本并点击确定 2&#xff0e;部署kafka 依次点击部署中心----部署组件----物理/虚拟机部署----选择集群----下一步 选择手动部署-…

GB28181语音对讲实现

1.前提准备 1.1.首先将设备接入SIP网关服务 我这里使用的是开源的wvp-GB28181-pro项目&#xff0c;首先将设备接入到SIP网关服务。 配置信息如下&#xff1a; 1.2.修改设备配置 设备接入后&#xff0c;会自动注册到平台&#xff0c;可以在国标设备栏看到刚刚注册的设备信息…

K8S私有云裸金属服务器负载均衡器OpenELB——筑梦之路

OpenELB介绍 OpenELB 是一个专为裸机 Kubernetes 集群设计的开源负载均衡器实现。 在云服务环境中的 Kubernetes 集群里&#xff0c;通常可以用云服务提供商提供的负载均衡服务来暴露 Service&#xff0c;但是在本地没办法这样操作。而 OpenELB 可以让用户在裸金属服务器、边缘…

模块化和包管理工具

一&#xff0c;模块化 1.定义 将一个复杂的程序文件依据一定规则&#xff08;规范&#xff09;拆分成多个文件的过程称之为 模块化 其中拆分出的 每个文件就是一个模块 &#xff0c;模块的内部数据是私有的&#xff0c;不过模块可以暴露内部数据以便其他模块使用 2.模块化…

6.Dockerfile及Dockerfile常用指令

Dockerfile是构建docker镜像的脚本文件 Dockerfile有很多的指令构成&#xff0c;指令由上到下依次运行。 每一条指令就是一层镜像&#xff0c;层越多&#xff0c;体积就越大&#xff0c;启动速度也越慢 井号开头的行是注释行。指令写大写写小写都行&#xff0c;但一般都写为…