当前位置: 首页 > news >正文

Flask

Flask第三方组件非常全,适合小型 API服务类项目,但第三方组件运行稳定性相对Django差。

基础知识

Flask安装

pip install flask==2.0.3

Flask库文件

  • Jinjia2:模板渲染库
  • Markupsafe:返回安全标签 只要Flask返回模板或者标签时都会依赖
  • Werkzeug:德文工具 底层是基于 WSGI,Flask项目启动都是基于Werkzeug
  • itsDangerous: 安全地对数据进行签名,以确保其完整性。用于保护Flask的会话Cookie
  • Click用于编写命令行应用程序的框架,提供命令并允许添加自定义管理命令

启动Flask

# 导入Flask类创建Flask应用对象
from flask import Flaskapp = Flask(__name__)# 为Flask应用添加路由
@app.route("/")
def index():  # 与路由绑定的视图函数,视图函数名尽可能保持唯一return "Hello world"if __name__ == "__main__":app.run()  # 启动Flask应用

Flask Response

  1. “Hello world” 可直接返回字符串

  2. render_template(“HTML文件”)

  3. redirect(“/home”) 重定向到指定路由,ResponseHeaders中加入了一个 Location:http://url

  4. send_file(“文件路径”) 返回文件

    打开并识别文件内容,自动识别文件类型,在ResponseHeaders中加入Content-Type:文件类型,这些文件类型是可以被客户端识别的,对于不能识别的文件类型,作下载处理。

    如exe文件:x-ms x表示二进制文件 ms表示微软

  5. jsonify(“字符串或者数据类型”)

    返回数据类型为Content-Type:application/json

Flask Request

  • request.form:获取FormData中的数据,可用to_dict()方法转为字典数据类型

  • request.method:获取请求方式

  • request.args:获取url中的数据

  • request.files:获取上传的文件

    my_file = request.files.get("myfile")
    my_file.save("文件保存路径")
    
  • request.data:获取json数据

    获取Content-Type:application/json时提交的数据

  • request.data:获取原始请求体中的数据 b""

    Content-Type无法被识别或不包含Form字眼

  • request.headers

  • request.cookies

  • request.path

  • request.host

  • request.host_url

  • request.url:请求地址

  • request.values:接受所有(GET,POST)请求中的数据,包含了URL和FormData

  • request.url_charset:URL编码格式

  • request.url_root:请求地址,完整的请求地址 host

  • request.url_rule:请求路由地址 /index

用户登录demo

Python

from flask import Flask
from flask import render_template
from flask import requestapp = Flask(__name__)@app.route("/login", methods=["GET", "POST"])
def login():if request.method == "GET":return render_template("login.html")elif request.method == "POST":username = request.form.get("username")password = request.form.get("password")print(username, password)if username == "jack" and password == "123456":return {"msg": "登陆成功"}
if __name__ == "__main__":app.run(host="0.0.0.0", debug=True)

Html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>用户登录</title>
</head>
<body><body><form action="/login" method="post"><span>账号 <input type="text" name="username"></span><br><span>密码 <input type="text" name="password"></span><br><span><input type="submit" value="登录"></span></form></body>
</body>
</html>

Flask Session

Session:服务端的键值对

Cookie:客户端的键值对

交由客户端保管机制:

  1. 开启session[token] = “asdfihasdfjhdsfiohoi” => {”token": “asdfihasdfjhdsfiohoi”}
  2. 序列化字典 => 字符串
  3. 根据secret_key密钥加密字符串

接受反序列化session:

  1. 从cookie中获取key为session的值 “eyJ0b2tlbiI6ImFzZGloaWFzZGhhc2RpdWhhaXNkaCJ9.Y3Oe1w.yWmRzkZcJXKM1IeVYfF97mCgpz4”
  2. 通过secret_key解密 session
  3. 反序列化成字典
from flask import Flask
from flask import render_template
from flask import requestapp = Flask(__name__)
app.secret_key = "$^%%&%#$%&^*"  # 设置密钥,如果不设置密钥,使用session会报错@app.route("/login", methods=["GET", "POST"])
def login():if request.method == "GET":return render_template("login.html")elif request.method == "POST":username = request.form.get("username")password = request.form.get("password")print(username, password)if username == "jack" and password == "123456":session["token"] = "asdihiasdhasdiuhaisdh"return redirect("/")@app.route("/")
def index():token = session.get("token")return "Hello world"if __name__ == "__main__":app.run(host="0.0.0.0", debug=True)

Flask Jinja2

  • {{ }} 引用变量数据 执行函数

  • {% %} 逻辑代码

  • for循环

    {% for item in items %}# 逻辑代码
    {% endfor %}
    
  • if 判断

    {% if 判断条件 %}# 逻辑代码
    {% else %}# 逻辑代码
    {% endif %}
    
from flask import Flask
from flask import render_templateapp = Flask(__name__)def fun():return "水花兄弟!"@app.route("/name")
def user():users = [{"name": "库里", "age": 34, "gender": "男"},{"name": "汤普森", "age": 32, "gender": "男"},{"name": "格林", "age": 31, "gender": "男"}]return render_template("user.html", users=users, fun=fun)if __name__ == "__main__":app.run(host="0.0.0.0", debug=True)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><table><tr><td>name</td><td>age</td><td>gender</td></tr>{% for user in users %}<tr><td>{{ user.name }}</td><td>{% if user.age >= 32 %}{{ fun() }}{% else %}{{ user.age }}{% endif %}</td><td>{{ user.gender }}</td></tr>{% endfor %}</table>
</body>
</html>

注意

  1. 变量为dict类型时,可用key.valuedict[key]或者dict.get(key)获取值
  2. 函数可作为变量传入后调用

Flask 路由参数

route()中的参数

  1. endpoint不能重复,对应视图函数 默认是视图函数名 视图函数与路由对应关系 url_for 反向创建url

  2. methods 允许亲求的方式 ["GET", "POST", "DELETE", "PUT"]

  3. redirect_to 永久重定向 ,没有进入视图直接跳转

  4. strict_slashes 是否严格要求路由匹配规则

    为True时:“/url/“是不被允许的,只允许”/url”

    为False时:"/url/“和”/url"都可以

  5. default={"nid": 123} 默认参数,视图函数中func(nid)一定要接受传参

动态路由参数

  • 接收多个参数
@app.route("/pages/<int:page>_<int:row>")
def pages(page, row):print(page, row)return "200 ok"

Flask实例化配置

  • template_folder:模板存放路径,默认为templates
  • static_folder:静态文件存放路径,默认值为static
  • static_url_path:静态文件访问路径,默认值为/static
  • static_host:静态文件访问服务HOST => 指向到另一台服务器
from flask import Flaskapp = Flask(__name__,template_folder="templates",static_folder="static",static_url_path="/static",static_host="xxxxx"
)

Flask对象Config配置

DEBUG模式:开启编辑时代码重启,Log打印级别最低,错误信息透传

app.config["DEBUG"] = True

TESTING模式:无限接近生产环境,代码编辑不会重启,Log级别较高,错误信息不再透传

app.config["TESTING"] = False

SESSION_COOKIE_NAME:浏览器中session的名称,第一个字符不能是空格

app.config["SESSION_COOKIE_NAME"] = "session"

Flask Config快速配置

class DebugConfig:DEBUG = TrueSECRET_KEY = "asdhugoiasd^%$$#$%#&^%7"
from settings import DebugConfigapp = Flask(__name__)
# app.secret_key = "$^%%&%#$%&^*"
app.config.from_object(DebugConfig)

Flask 蓝图 BluePrint

蓝图作用:功能隔离,路由隔离

新建app01文件夹,下新增views.py文件、templates、static文件夹等

url_prefix:表示URL前缀,用于隔离相同URL

user:表示蓝图名称,不能重复,保证在app中是唯一的

template_folder:默认是最外层项目templates,如需设置内部文件夹,则template_folder=app01/templates

# views.py
# 蓝图
from flask import Blueprint# BluePrint 当作一个不能够run的Flask
user = Blueprint("user", __name__, url_prefix="/user")@user.route("/login")
def login():return "I am userBP"

在app.py中注册蓝图

from flask import Flaskapp = Flask(__name__)from app01.views import user
# 注册蓝图
app.register_blueprint(user)if __name__ == "__main__":app.run()

浏览器中访问app01的login视图:http://127.0.0.1:5000/user/login

Flask特殊装饰器

  • @app.before_request

    请求进入视图函数之前

  • @app.after_request:请求结束,返回响应时

    正常:before_request1 => before_request2 =>视图函数 => after_request2 => after_request1

    异常:before_request1 => after_request2 => after_request1

  • @app.errorhandler(4xx or 5xx):重定义错误信息

    @app.errorhandler(404)
    def error(error_message):print(error_message)# return f"你访问的{}不存在".format(request.path)  # 自定义信息# return redirect("www.baidu.com")  # 重定向return send_file("文件路径")  # 返回图片或者其他文件
    

Flask CBV

from flask import Flaskapp = Flask(__name__)@app.route("/")  # FBV
def index():return "asbdj"from flask import viewsclass Index(views.MethodView):def get(self):return "GET 200 OK"def post(self):return "POST 201 OK"def put(self):return "PUT 200 OK"def delete(self):return "DELETE 200 OK"# 注册路由
app.add_url_rule("/user", view_func=Index.as_view(name="user"))if __name__ == '__main__':app.run(debug=True)

监听 端口

0.0.0.0:监听ip地址

端口 - 监听应用程序

包到应用程序的过程:

IOS 5层中的最高层 ——————- 应用

服务器接收到数据:浏览器-9528 b"HTTP 1.1 /GET\r\n" 192.168.14.25:9527

网卡 => 操作系统

操作系统 解包: - 端口9527 - 收到 b"HTTP 1.1 /GET\r\n"

Flask - WSGI 把数据转换成 environ对象,请求原始数据对象,几乎接近于request对象

Flask 接收到 WSGI 转换的environ对象 request_class Flask Request 样式

Flask request对象,如request.form

Flask-Session第三方组件

  • 交由客户端保管机制 - 安全性相对较差 Cookie
  • 原生Session优势是不占用服务器空间
  • Flask-Session - DjangoSession相对一样的数据
  • redis在内网中使用,不要放在公网
# 蓝图
from flask import Blueprint
from flask import session# BluePrint 当作一个不能够run的Flask
user = Blueprint("user", __name__, url_prefix="/user")@user.route("/login")
def login():session["user"] = "asdugaiushduyh"return "I am userBP"@user.route("")
def index():print(session["user"])return "session"
from flask import Flask
from flask_session import Session
from redis import Redisfrom app01.views import userapp = Flask(__name__)
app.secret_key = "asdhiuh989"
app.config["SESSION_TYPE"] = "redis"
app.config["SESSION_REDIS"] = Redis(host="106.15.**.**", port=6379, password="******")
# 配置之后
Session(app)
# 蓝图之前
app.register_blueprint(user)if __name__ == "__main__":app.run()

Flask请求上下文

该部分主要是阅读源码

  1. 线程安全

    极快解决阻塞问题,保证公共对象的安全性,缺点是非常耗费内存,空间换时间

    import time
    from copy import deepcopy
    from threading import Thread, get_identclass Foo:passlocal_dict = {}f = Foo()
    f.num = 0def add_(i):local_dict[get_ident()] = deepcopy(f)local_dict[get_ident()].num = itime.sleep(1)print(local_dict[get_ident()].num)for i in range(20):task = Thread(target=add_, args=(i,))task.start()
    
    import time
    from threading import Thread, localclass Foo(local):passf = Foo()f.num = 0def add_(i):f.num = itime.sleep(1)print(f.num)for i in range(20):task = Thread(target=add_, args=(i,))task.start()
    

    相对使用线程ID保存数据的方式,使用local占用资源更少

  2. 偏函数:将原函数和原函数接收的参数一并返回新函数,在执行新函数时,将参数传入原函数中一并执行。

    from functools import partialdef abfunc(a, b, c):return a + b + cnew_fum = partial(abfunc, c=88)print(new_fum(6, 7))
    
  3. OOP 面向对象

    熟悉掌握相关魔法方法以及重写,如__setitem____getitem__

Web socket

相关文章:

Flask

Flask第三方组件非常全&#xff0c;适合小型 API服务类项目&#xff0c;但第三方组件运行稳定性相对Django差。 基础知识 Flask安装 pip install flask2.0.3Flask库文件 Jinjia2&#xff1a;模板渲染库Markupsafe&#xff1a;返回安全标签 只要Flask返回模板或者标签时都会…...

SAP系统与MES系统的数据协同技术方案

1&#xff0e;MES介绍 本文中提到的MES系统是在西门子公司的SIMATIC IT平台上开发完成。所有的应用子系统进行统一分析、统一设计、统一开发&#xff0c;利用统一的开发平台和数据库系统&#xff0c;保证了管理系统的集成性、高效性。 2&#xff0e;数据协同接口包含的…...

2018年蓝桥杯省赛试题-5道(Python)

文章目录一、日志统计思考二、递增三元组思考三、螺旋折线思考四、乘积最大思考五、全球变暖思考尾声提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、日志统计 题目描述 小明维护着一个程序员论坛。 现在他收集了一份"点赞"日志&#xf…...

Python稀疏矩阵最小二乘法

文章目录最小二乘法返回值测试最小二乘法 scipy.sparse.linalg实现了两种稀疏矩阵最小二乘法lsqr和lsmr&#xff0c;前者是经典算法&#xff0c;后者来自斯坦福优化实验室&#xff0c;据称可以比lsqr更快收敛。 这两个函数可以求解AxbAxbAxb&#xff0c;或arg min⁡x∥Ax−b…...

mac本前端Homebrew下载,操作

1、打开电脑终端 2、下载Homebrew&#xff0c;在终端中输入 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"开始下载Homebrew&#xff0c;因为这个地址是国外网站&#xff0c;下载失败的话&#xff0c;输入…...

Linux系统之查看进程监听端口方法

Linux系统之查看进程监听端口方法一、端口监听介绍二、使用netstat命令1.netstat命令介绍2.netstat帮助3.安装netstat工具4.列出所有监听 tcp 端口5.显示TCP端口的统计信息6.查看某个服务监听端口三、使用ss命令1.ss命令介绍2.ss命令帮助3.查看某个服务监听端口四、使用lsof命令…...

使用命令别名一键启动arthas

1. 使用命令别名启动arthas 确保单板上有jdk和arthas jdk目录&#xff1a;/home/xinliushijian/arthas/jdk arthas目录&#xff1b;/home/xinliushijian/arthas su xinliushijian编写脚本messi.sh cd /home/xinliushijian/arthas vi messi.sh 内容如下&#xff1a; #!/bin/ba…...

python+pytest接口自动化(2)-HTTP协议基础

HTTP协议简介HTTP 即 HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09;&#xff0c;是互联网上应用最为广泛的一种网络协议。所有的 WWW 文件都必须遵守这个标准。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。HTTP 协议在 OSI 模型中属…...

操作系统权限提升(十五)之绕过UAC提权-基于白名单DLL劫持绕过UAC提权

系列文章 操作系统权限提升(十二)之绕过UAC提权-Windows UAC概述 操作系统权限提升(十三)之绕过UAC提权-MSF和CS绕过UAC提权 操作系统权限提升(十四)之绕过UAC提权-基于白名单AutoElevate绕过UAC提权 注&#xff1a;阅读本编文章前&#xff0c;请先阅读系列文章&#xff0c;以…...

非常好看的html网页个人简历

一. 前言 文末获取gitee链接 在前几天逛b站的时候&#xff0c;发现了个比较实用的东西-----个人简介网页版&#xff0c;相当于网页版的个人简历&#xff0c;相较于PDF形式的&#xff0c;网页版所能呈现内容更加丰富&#xff0c;而且更加美观&#xff0c;在BOOS上被HR小姐姐要…...

轻量级网络模型ShuffleNet V2

在学习ShuffleNet V2内容前需要简单了解卷积神经网络和MobileNet,以及Shuffnet V1的相关内容&#xff0c;大家可以出门左转&#xff0c;去看我之前的几篇博客MobileNet发展脉络&#xff08;V1-V2-V3&#xff09;&#xff0c;轻量级网络模型ShuffleNet V1&#x1f197;&#xff…...

分享美容美发会员管理系统功能的特点_美容美发会员管理系统怎么做

人们越来越关心美发&#xff0c;美发行业发展迅速&#xff0c;小程序可以连接在线场景&#xff0c;许多美发院也开发了会员卡管理系统。那么一个实用的美发会员管理系统怎么制作呢&#xff1f;它有什么功能&#xff1f;我们一起来看看~&#xff08;干货满满&#xff0c;耐心看完…...

Oracle-05-DCL篇

🏆一、简介 Oracle的DCL代表数据库控制语言,用于管理数据库对象的访问和安全性。DCL的两个主要命令是GRANT和REVOKE。 GRANT命令用于授予用户或角色对数据库对象的访问权限,例如表、视图或存储过程。GRANT命令的语法如下: GRANT privilege_name [, privilege_name]... …...

tess4j简单使用入门

tess4j下载 下载地址: https://sourceforge.net/projects/tess4j/ 不要直接下载,点击files,然后下载最新版 下载解压后放到指定的目录即可,这里放到d:\jar目录下 tess4j根目录: d:\jar\tess4j tess4j使用 把test4j项目目录中dist和lib目录下的所有jar包导入到需要的项目中…...

WebGPU学习(4)---使用 UniformBuffer

接下来让我们使用 UniformBuffer。UniformBuffer 是一个只读内存区域&#xff0c;可以在着色器上访问。 这次&#xff0c;我们将传递给着色器的矩阵存储在 UniformBuffer 中。演示示例 1.在顶点着色器中的 UniformBuffer 这次我们在顶点着色器里定义一个名为Uniforms的新结构体…...

Http客户端Feign-远程调用

Feign的使用步骤 引入依赖添加EnableFeignClients注解编写FeignClient接口使用FeignClient中定义的方法代替RestTemplate Feign的日志配置 1.方式一是配置文件&#xff0c;feign.client.config.xxx.loggerLevel 如果xxx是default则代表全局如果xxx是服务名称,例如userservi…...

RK3568镜像的拆包和打包

文章目录 前言一、window上分包和打包分包打包二、Linux上分包和打包分包打包总结前言 本文记录在win10上利用瑞芯微提供的工具进行分包和打包,同样也有Linux教程 提示:以下是本篇文章正文内容,下面案例可供参考 一、window上分包和打包 分包 window下一般直接利用工具即…...

《设计模式》适配器模式

《设计模式》适配器模式 适配器&#xff08;Adapter&#xff09;是一种结构型设计模式&#xff0c;它允许我们将一个类的接口转换成另一个类的接口&#xff0c;从而使得原本由于接口不兼容而无法合作的类能够一起工作。适配器模式通常用于以下情况&#xff1a; 在已有的类中添…...

linux 随笔 5-服务管理

0. 装到虚拟机与物理机&#xff0c;感觉各有各的不方便 Linux下systemctl命令和service、chkconfig命令的区别 1. service 根据/etc/init.d目录下的配置&#xff0c;做服务相关的&#xff1a; 启动停止重新启动关闭系统服务 2. chkconfig 用于维护 /etc/rc[0-6].d 的命令…...

【java基础】枚举类(enum)

文章目录基本介绍快速使用字段、方法、构造器枚举类方法toString方法valueOf方法values方法ordinal方法基本介绍 在java中有一种特殊的类型就是枚举类&#xff0c;对于一个有限的有固定值的集合&#xff0c;我们就可以考虑使用枚举类来进行表示&#xff0c;例如服装的大小为 小…...

不止是收发数据:挖掘常兴串口调试助手V5.01的5个隐藏效率神器(自动回复/进制转换/批量发送)

挖掘常兴串口调试助手V5.01的5个隐藏效率神器 在嵌入式开发领域&#xff0c;串口调试工具早已超越了简单的数据收发功能。常兴串口调试助手V5.01作为一款专业级工具&#xff0c;集成了多项提升开发效率的实用功能。本文将深入解析五个常被忽视但极具价值的隐藏功能&#xff0c;…...

WarcraftHelper终极指南:5大核心功能让魔兽争霸3在现代系统完美运行

WarcraftHelper终极指南&#xff1a;5大核心功能让魔兽争霸3在现代系统完美运行 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是一款…...

JeecgBoot低代码开发平台终极实战指南:从零开始构建企业级应用

JeecgBoot低代码开发平台终极实战指南&#xff1a;从零开始构建企业级应用 【免费下载链接】jeecg-boot jeecgboot/jeecg-boot 是一个基于 Spring Boot 的 Java 框架&#xff0c;用于快速开发企业级应用。适合在 Java 应用开发中使用&#xff0c;提高开发效率和代码质量。特点是…...

别再手动填Token了!用Knife4j的OAuth2配置,一键搞定接口文档自动化认证

告别手动Token时代&#xff1a;Knife4j与OAuth2的自动化认证实战 每次调试API都要复制粘贴Token的日子该结束了。作为后端开发者&#xff0c;我们花了大量时间在接口文档和认证流程之间来回切换——这不仅是效率问题&#xff0c;更是一种思维中断。想象一下&#xff0c;当你的微…...

热门编程语言全攻略:从入门到职业选手

目录 引言&#xff1a;为什么选择一门“热门”编程语言 1.1 编程语言热度背后的产业逻辑 1.2 初学者如何选择第一门语言 1.3 全栈/进阶者如何扩展技术栈 Python&#xff1a;万能胶水与人工智能首选 2.1 语言定位与核心应用领域 2.2 语法特点&#xff1a;简洁优雅的伪代码 2.3 学…...

Realistic Vision V5.1镜像部署实操:解决‘模型路径不存在’异常的完整排查链

Realistic Vision V5.1镜像部署实操&#xff1a;解决‘模型路径不存在’异常的完整排查链 1. 引言&#xff1a;从“模型路径不存在”说起 如果你在部署Realistic Vision V5.1虚拟摄影棚时&#xff0c;满怀期待地启动程序&#xff0c;结果却在控制台看到一行冰冷的“模型路径不…...

ESP32+BC260Y+L76K开发板实战:NB-IoT户外定位数据上传MQTT全流程(附避坑指南)

ESP32BC260YL76K开发板实战&#xff1a;NB-IoT户外定位数据上传MQTT全流程&#xff08;附避坑指南&#xff09; 在物联网应用快速发展的今天&#xff0c;户外定位数据的采集与传输已成为智慧农业、资产追踪、环境监测等领域的核心需求。ESP32作为一款高性价比的Wi-Fi/蓝牙双模芯…...

如何快速上手MoMask:面向初学者的3D人体运动生成完整指南

如何快速上手MoMask&#xff1a;面向初学者的3D人体运动生成完整指南 【免费下载链接】momask-codes Official implementation of "MoMask: Generative Masked Modeling of 3D Human Motions (CVPR2024)" 项目地址: https://gitcode.com/gh_mirrors/mo/momask-code…...

轻量级PDF渲染库PdfiumAndroid:Android开发者的高效集成指南

轻量级PDF渲染库PdfiumAndroid&#xff1a;Android开发者的高效集成指南 【免费下载链接】PdfiumAndroid 项目地址: https://gitcode.com/gh_mirrors/pd/PdfiumAndroid 核心价值&#xff1a;为什么选择PdfiumAndroid&#xff1f; &#x1f4cc; 解决PDF渲染痛点&#…...

刚刚,英伟达革了自己的命:智能体自主进化7天,干掉所有算子工程师、GPU专家

这应该是今天刚刚出炉的、最炸裂的文章。在很多算子开发的微信群组&#xff0c;已经掀起了轩然大波。「这或许是超人类智能在软件领域的真正首次展露。」英伟达许冰刚刚在 X 上发出了如此断言。他所评论的&#xff0c;正是他与 Terry Chen 和 Zhifan Ye 为共同一作的一项英伟达…...