Flask:后端框架使用

文章目录
  • 1、介绍
  • 2、demo演示
  • 3、Flask请求和响应
    • 3.1 演示demo
    • 3.2 request获取请求体数据
    • 3.3 requests发送请求
    • 3.4 响应返回和接收
  • 4、特殊路由
    • 4.1 路由重定向
    • 4.2 路由拦截器

1、介绍

Flask是由python语言编写的轻量级Web应用框架,主要应用于后端框架,处理客户端请求并返回响应。

2、demo演示

from flask import Flask

#应用实例化
app = Flask(__name__)

#装饰器,也称为路由,将URL('/’)映射到视图函数(hello_world)
@app.route('/')
def hello_world():、
	#定义的视图函数
    return 'Hello, World!'

if __name__ == '__main__':
	启动内置服务器
    app.run(host='0.0.0.0', port=5000, debug=True)

大家可在python环境下,安装flask依赖,执行上述代码,flaskf服务启动后,可直接在浏览器中输入: http://ip:5000/,进行测试。

3、Flask请求和响应

flask作为后端框架,开发者需要注意的两点,一是定义请求路由地址及方法(如GET,POST),二是获取请求数据,便于定义和实现视图函数的功能,并返回响应。

3.1 演示demo

先定义一个完整的Flask服务,路由地址和视图函数,后面修改内容,均在视图函数中的获取参数数据部分的内容

from flask import Flask,request
from gevent import pywsgi

app = Flask(__name__)
#定义路由地址
demo_url = "/demo"  # 识别

#请求方式POST
@app.route(demo_url, methods=["POST"])
def predict_router():
    #获取文件数据
    file = request.files.get('file')
    #获取文档数据
    id = request.values.get('id')
    name = request.values.get('name')
    return id

def __main(mode =True):

    if mode:
        #创建WSGI服务
        server = pywsgi.WSGIServer(('0.0.0.0', 39026), app)
        print(f"-------- 端口号 , port:{server.server_port} - ------")
        #服务持续运行
        server.serve_forever()
    else:
        #内置服务启动
        app.run(host='0.0.0.0', port=39026, debug=True)

if __name__ == "__main__":
    __main()

使用上述代码启动服务后,可使用Postman接口工具直接访问。

如上图,postman工具访问服务时,定义请求方式POST,路由地址 http://ip:port/demo,提交数据用的是body中的form-data表单数据,其中的file字段是图片文件,需在file字段后面选择file类型,id和name字段使用text类型即可。

以上完整演示了后端服务启动,前端(postman工具)接口调用的完整流程。下面将会分开讲解每一部分内容,包括,前端如何定义请求体数据,发送请求,后端如何获取请求体的数据,返回响应,最终前端接收响应。

3.2 request获取请求体数据

request对象来自于flask,是一个请求上下文对象,导入即可使用,request中保存了此次HTTP请求的一切信息。

上述代码直接使用了如下的两种方式获取数据

#获取文件
request.files.get('file')

#获取文本
request.values.get('id')

另外,对于文本数据,request中还定义了,以表单的形式获取

#获取表单数据,注意,表单数据中不包含文件,文件获取方式仍用上述方式
request.form

#获取表单数据,单个字段
request.form.get('id')
request.form.get('name')

#获取表单数据,多个值(列表形式),即同一个字段可上传两个不同的数据,获取时可用list
request.form.getlist('list')

3.3 requests发送请求

使用postman工具可直接访问服务,也可使用requests发送post请求,并在其中定义请求体的数据。

import requests

#定义请求发送的函数
def send_request(file,id):
    url = 'http://localhost:39026/demo'  # 替换成你的 Flask 应用的实际接口地址
    try:
        #请求文件,以二进制形式读取
        file = {'file': open(file,'rb')}
        
        #请求文本
        data = {"id":id}
        
        #以post方式发送请求
        response = requests.post(url, files=file,data=data)
        
        #输出响应后的状态码,200表示成功
      	if response.status_code == 200:
            print("文件上传成功!")
    except requests.exceptions.RequestException as e:
        print('请求发送失败:',e)

if __name__ == "__main__":
    id = '123'
    file = ‘替换成本机文件的路径’
    send_request(file,id)

注意:这里的requests发送请求和上面的request获取请求数据,只有一个s之差!

3.4 响应返回和接收

成功执行视图函数后,后端服务往往需要向前端返回响应,而前端则需要接收响应并作出处理。

以下是比较常见的几种返回

  1. 返回普通文本或HTML页面:

    from flask import Flask
    app = Flask(name)

    @app.route(‘/’)
    def hello():
    return ‘Hello, World!’

在这个例子中,当用户访问根路径 ‘/’ 时,服务器会返回一个显示文本消息 "Hello, World!"的html页面。

  1. 返回json数据,比较常见

    from flask import Flask, jsonify

    app = Flask(name)

    @app.route(‘/demo’)
    def get_json():
    data = {‘id’: id,‘name’:name}
    #字典转换为json
    return jsonify(data)

上面字典转换为json格式,其实不转换,直接返回字典也ok了,就是不知道有什么弊端没

  1. 返回响应

比如常见的图片数据的字节流,以下代码演示了,将获取到的图片数据保存到本地,并以字节流的形式返回客户端

from flask import Flask, request, jsonify, send_file
from gevent import pywsgi

app = Flask(__name__)
#定义路由地址
demo_url = "/demo"  # 识别

#请求方式POST
@app.route(demo_url, methods=["POST"])
def predict_router():
    #获取文件
    file = request.files.get('file')
    #以文件本身名字,创建文件保存路径
    file_source = './' + file.filename
    #读取文件,以二进制形式
    comp_bytes = file.read()
    #打开要保存的文件路径
    with open(file_source, "wb") as fp:
        #将读取到的二进制文件写入保存的文件路径中
        fp.write(comp_bytes)

    #使用send_file返回图片数据
    return send_file(file_source, mimetype='image/jpg')

其中,上面的send_file()函数是 Flask 中用于发送文件的函数,可选参数mimetype,指定要发送的文件的 MIME 类型。例如,‘image/jpeg’ 表示发送 JPEG 图像文件。

执行上述服务端代码后,用postman工具请求即可,下面是采用了python脚本方式请求服务并打印服务返回内容。

import json
import requests

#定义请求发送的函数
def send_request(file,id):
    url = 'http://localhost:39026/demo'  # 替换成你的 Flask 应用的实际接口地址
    try:
        #请求文件,以二进制形式读取
        files = {'file': open(file,'rb')}
        #请求文档
        data = {"id":id}
        #以post方式发送请求
        response = requests.post(url, files=files,data=data)
        if response.status_code == 200:
            print("文件上传成功!")
            #打印返回内容的字节数据
            print(response.content)
    except requests.exceptions.RequestException as e:
        print('请求发送失败:',e)

if __name__ == "__main__":
    id = '123'
    file = '文件路径'
    send_request(file,id)

常常用response接收请求服务后的响应,其中,

  • response.status_code 是服务器返回的状态码,你可以通过它来判断请求是否成功。
  • response.content 是服务器返回的内容的字节表示,用 decode(‘utf-8’) 方法将其转换为字符串,方便阅读。
  • response.headers 是一个字典,包含了服务器返回的响应头部信息

4、特殊路由

4.1 路由重定向

from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route('/usrname')
def admin():
    if True:
        return redirect(url_for('login'))
    return 'Welcome to admin page'

@app.route('/login')
def login():
    return 'Please login first'

在登陆中,常常会遇到输入用户名和密码不符合时,直接返回登陆界面。上述例子,表示当用户访问 ‘/usrname’ 路径时,条件不满足,服务器会将其重定向到 ‘/login’ 路径。

4.2 路由拦截器

不知道大家会不会碰到这种情况,在访问某些路由之前呢,需要做个身份认证或权限许可,认证成功或许可后才允许访问这些路由,这时候就用到了路由拦截器。

路由拦截器是由装饰器来拦截请求的,以下处理前和处理后的拦截,默认是针对app服务所有的路由执行的,称为全局拦截器。

```c
from flask import Flask, request
app = Flask(__name__)

@app.before_request
def before_request():
    # 在每个请求处理前执行的内容
    return ''

@app.after_request
def after_request(response): 
    # 在每个请求处理后执行的内容
    return ''

如果想对指定的路由实现拦截,局部拦截器,可在路由拦截中设置白名单,可通行的路由

@app.before_request
def before_request():
    url = request.path  # 获取当前请求的URL
    #设置白名单,不被拦截的路由
    passUrl = ["/login", "/regist"]
    if url in passUrl:
        pass
    else:
    	#请求处理前执行的内容
    return ' '

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Golang/nacos】nacos配置的增删查改,以及服务注册的golang实例及分析

前言 本文分析的实例来源于nacos在github上的开源仓库 nacos配置的增删查改 先具体来看一段代码,我将逐步分析每一段的作用 package mainimport ("fmt""time""github.com/nacos-group/nacos-sdk-go/clients""github.com/naco…

Nvidia Blackwell架构深度剖析:深入了解RTX 50系列GPU的升级

在CES 2025上,英伟达推出了基于Blackwell架构的GeForce RTX 50系列显卡,包括RTX 5090、RTX 5080、RTX 5070 Ti和RTX 5070。一段时间以来,我们已经知晓了该架构的各种细节,其中许多此前还只是传闻。不过,英伟达近日在20…

面试--你的数据库中密码是如何存储的?

文章目录 三种分类使用 MD5 加密存储加盐存储Base64 编码:常见的对称加密算法常见的非对称加密算法https 传输加密 在开发中需要存储用户的密码,这个密码一定是加密存储的,如果是明文存储那么如果数据库被攻击了,密码就泄露了。 我们要对数据…

【24】Word:小郑-准考证❗

目录 题目 准考证.docx 邮件合并-指定考生生成准考证 Word.docx 表格内容居中表格整体相较于页面居中 考试时一定要做一问保存一问❗ 题目 准考证.docx 插入→表格→将文本转换成表格→✔制表符→确定选中第一列→单击右键→在第一列的右侧插入列→布局→合并单元格&#…

WOA-CNN-GRU-Attention、CNN-GRU-Attention、WOA-CNN-GRU、CNN-GRU四模型对比多变量时序预测

WOA-CNN-GRU-Attention、CNN-GRU-Attention、WOA-CNN-GRU、CNN-GRU四模型对比多变量时序预测 目录 WOA-CNN-GRU-Attention、CNN-GRU-Attention、WOA-CNN-GRU、CNN-GRU四模型对比多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于WOA-CNN-GRU-Attention、…

Spring Boot整合WebSocket

目录 ?引言 1.WebSocket 基础知识 ?1.1 什么是 WebSocket? ?1.2 WebSocket 的应用场景 ?2.Spring Boot WebSocket 整合步骤 2.1 创建 Spring Boot 项目 2.2 添加 Maven 依赖 2.3 配置 WebSocket 2.4 创建 WebSocket 控制器 2.5 创建前端页面 引言 在…

K8S 集群搭建和访问 Kubernetes 仪表板(Dashboard)

一、环境准备 服务器要求: 最小硬件配置:2核CPU、4G内存、30G硬盘。 服务器可以访问外网。 软件环境: 操作系统:Anolis OS 7.9 Docker:19.03.9版本 Kubernetes:v1.18.0版本 内核版本:5.4.203-…

2024:成长、创作与平衡的年度全景回顾

文章目录 1.前言2.突破自我:2024年个人成长与关键突破3.创作历程:从构想到落笔,2024年的文字旅程4.生活与学业的双重奏:如何平衡博客事业与个人生活5.每一步都是前行:2024年度的挑战与收获6.总结 1.前言 回首2024年&a…

计算机网络 (45)动态主机配置协议DHCP

前言 计算机网络中的动态主机配置协议(DHCP,Dynamic Host Configuration Protocol)是一种网络管理协议,主要用于自动分配IP地址和其他网络配置参数给连接到网络的设备。 一、基本概念 定义:DHCP是一种网络协议&#xf…

学习记录1

[SUCTF 2019]EasyWeb 直接给了源代码&#xff0c;分析一下 <?php function get_the_flag(){// webadmin will remove your upload file every 20 min!!!! $userdir "upload/tmp_".md5($_SERVER[REMOTE_ADDR]);if(!file_exists($userdir)){mkdir($userdir);}if…

git操作(Windows中GitHub)

使用git控制GitHub中的仓库版本&#xff0c;并在Windows桌面中创建与修改代码&#xff0c;与GitHub仓库进行同步。 创建自己的GitHub仓库 创建一个gen_code实验性仓库用来学习和验证git在Windows下的使用方法&#xff1a; gen_code仓库 注意&#xff0c;创建仓库时不要设置…

Redis的安装和使用--Windows系统

Redis下载地址&#xff1a; windows版本readis下载&#xff08;GitHub&#xff09;&#xff1a; https://github.com/tporadowski/redis/releases &#xff08;推荐使用&#xff09; https://github.com/MicrosoftArchive/redis/releases 官网下载&#xff08;无Windows版本…

【odbc】odbc连接kerberos认证的 hive和spark thriftserver

hive odbc驱动&#xff0c;以下两种都可以 教程&#xff1a;使用 ODBC 和 PowerShell 查询 Apache HiveHive ODBC Connector 2.8.0 for Cloudera Enterprise spark thriftserver本质就是披着hiveserver的外壳的spark server 完成kerberos认证: &#xff08;1&#xff09;可以…

AllData数据中台核心菜单十一:数据集成平台

&#x1f525;&#x1f525; AllData大数据产品是可定义数据中台&#xff0c;以数据平台为底座&#xff0c;以数据中台为桥梁&#xff0c;以机器学习平台为中层框架&#xff0c;以大模型应用为上游产品&#xff0c;提供全链路数字化解决方案。 ✨奥零数据科技官网&#xff1a;…

随遇随记篇

vue 函数 unref() 获取原始值 ref 定义的属性 需要 .value 才能拿到值&#xff0c;unref 直接返回原始值&#xff1b;若属性不是ref 定义的&#xff0c;也是直接返回原始值&#xff1b; /* description: 是否必填*/required?: boolean | Ref<boolean>.....let value …

Python操作Excel——openpyxl使用笔记(1)

0. 模块的安装 使用命令&#xff1a; pip install openpyxl 通过命令&#xff1a; pip show openpyxl 检查安装&#xff0c;当前使用的版本信息如下&#xff1a; 1. 文档的基本操作 1.1 创建&#xff0c;保存和关闭 几个简单的函数调用即可&#xff1a; import openpyx…

STM32之FreeRTOS开发介绍(十九)

STM32F407 系列文章 - freertos&#xff08;十九&#xff09; 目录 前言 一、简述 二、开源网址 三、原理及功能特性 1.原理 2.功能 3.特点 4.优缺点 四、参考书籍 五、实现方式 总结 前言 FreeRTOS是一个免费的、开源的实时操作系统&#xff0c;专为微控制器和嵌入…

《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》重印变更的彩插

禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向新工科的电工电子信息基础课程系列教材&#xff09;》

【HarmonyOS NEXT】碰一碰开发分享

关键词&#xff1a;鸿蒙、碰一碰、systemShare、harmonyShare、Share Kit 华为分享新推出碰一碰分享&#xff0c;支持用户通过手机碰一碰发起跨端分享&#xff0c;可实现传输图片、共享wifi等。我们只需调用系统 api 传入所需参数拉起对应分享卡片模板即可&#xff0c;无需对 U…

I2S是什么通信协议?它如何传输音频数据?它和I2C是什么关系?

首先我们先明确一点&#xff0c;I2S和I2C没有什么关系&#xff0c;如果非要扯点共同点的话那就是它们都是由飞利浦制定的。 I2C我们用的比较多&#xff0c;我们用的大多数的传感器模块用的通信协议就是I2C&#xff0c;SPI&#xff0c;UART这些。 而I2S应用领域比较单一&#…