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 pywsgiapp = 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 iddef __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 pywsgiapp = 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_forapp = 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:passelse:#请求处理前执行的内容return ' '

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

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

相关文章

递归算法学习v2.3

目标和 设置全局变量: class Solution {int ret,path,aim;public int findTargetSumWays(int[] nums, int target) {aim target;dfs(nums,0);return ret;}public void dfs(int[] nums,int pos){if(pos nums.length){if(path aim){ret ;}return;}path nums[pos…

红黑树封装map和set(c++版)

前言 在前面,我们介绍了c中map和set库的使用,也实现了一颗简单的红黑树。那么现在我们就利用这两部分的知识,实现一个简单的myMap和mySet。 源码阅读 在我们实现之前,我们可以阅读一些标准库的实现,学习标准库的实现…

Windows 服务程序实现鼠标模拟

cpp #include <windows.h> #include <fstream> #include <string> #include <tchar.h> #include <thread> #include <vector> #define SERVICE_NAME _T("MouseSimulationService") // 全局变量 SERVICE_STATUS g_Servi…

ui设计公司分享:浅色 UI 设计

在数字化产品琳琅满目的今天&#xff0c;用户对于界面的要求早已不止于功能的实现&#xff0c;更追求一种舒适、无压的交互体验。而浅色UI设计&#xff0c;凭借其独特的魅力&#xff0c;正逐渐成为众多设计师营造优质体验的首选。 一、浅色UI设计的视觉优势 &#xff08;一&a…

Nacos:使用PgSQL数据源

数据源插件开源仓库地址&#xff1a;nacos-datasource-extend-plugins 一、PostgreSQL数据库安装 1、本文使用Docker进行数据库的安装&#xff0c;使用docker命令拉取的PG14版本的数据库&#xff1a; docker pull postgres:14.6 2、创建PG容器并启动&#xff0c;映射了5432…

Linux——入门基本指令汇总

目录 1. ls指令2. pwd3. whoami指令4. cd指令5. clear指令6. touch指令7. mkdir指令8. rm指令9. man指令10. cp指令11. mv指令12. cat指令13. tac指令14. more指令15. less指令16. head指令17. tail指令18. date指令19. cal指令20. find指令21. which指令22. alias指令23. grep…

C语言之装甲车库车辆动态监控辅助记录系统

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 C语言之装甲车库车辆动态监控辅助记录系统 目录 一、前言 1.1 &#xff08;一&#xff09;…

2024年Vue面试题汇总

流程图如下&#xff1a; vue核心知识——语法篇 1.请问 v-if 和 v-show 有什么区别&#xff1f; 相同点&#xff1a; 两者都是在判断DOM节点是否要显示。 不同点&#xff1a; a.实现方式&#xff1a; v-if是根据后面数据的真假值判断直接从Dom树上删除或重建元素节点。 v-…

centos搭建 Node.js 开发环境

Node.js &#xff0c;通常简称为Node&#xff0c;是一个事件驱动 I/O 服务端 JavaScript 环境&#xff0c;基于 Chrome V8引擎&#xff0c;具备速度快、性能强等特点&#xff0c;可用于搭建各类网络应用&#xff0c;及作为小程序后端服务环境。npm 和 npx 都是和 Node.js 相关的…

DuckDB:精通Insert语句处理数据冲突

本文介绍DuckDB insert语句用法&#xff0c;包括常规的批量插入&#xff0c;尤其是插入数据冲突的处理&#xff0c;最后还提及returning子句的用法&#xff0c;每个用法提供示例说明。 insert插入数据 INSERT INTO向表中插入新行。可以插入由值表达式指定的一行或多行&#xf…

【Linux系统】Ext系列磁盘文件系统二:引入文件系统(续篇)

inode 和 block 的映射 该博文中有详细解释&#xff1a;【Linux系统】inode 和 block 的映射原理 目录与文件名 这里有几个问题&#xff1a; 问题一&#xff1a; 我们访问文件&#xff0c;都是用的文件名&#xff0c;没用过 inode 号啊&#xff1f; 之前总是说可以通过一个…

第2章:Python TDD构建Dollar类基础

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…

SpringBoot实现定时任务,使用自带的定时任务以及调度框架quartz的配置使用

SpringBoot实现定时任务&#xff0c;使用自带的定时任务以及调度框架quartz的配置使用 文章目录 SpringBoot实现定时任务&#xff0c;使用自带的定时任务以及调度框架quartz的配置使用一. 使用SpringBoot自带的定时任务&#xff08;适用于小型应用&#xff09;二. 使用调度框架…

26. 【.NET 8 实战--孢子记账--从单体到微服务】--需求更新--用户注销、修改用户名、安全设置

在实际开发过程中&#xff0c;项目需求的变更和增加是常见的情况&#xff0c;因此这篇文章我们就模拟一下项目需求新增的情况。 一、需求 项目经理今天提出了新的功能&#xff0c;需要增加重置密码、安全设置、修改用户名、注销账户这四个功能&#xff0c;这四个功能必须是独…

Nginx反向代理架构介绍

Nginx反向代理架构是一种强大的服务器架构模式&#xff0c;它位于用户和原始服务器之间&#xff0c;接收用户的请求并将其转发到一个或多个后端服务器&#xff0c;然后将从后端服务器获取的响应返回给用户&#xff0c;就好像这些内容都是由代理服务器本身直接提供的一样。以下是…

flutter 使用google_mlkit_image_labeling做图片识别

在AI横行的如今&#xff0c;相信大家或多或少都做过跟AI接轨的需求了吧&#xff1f;今天我说的是关于图片识别的需求&#xff0c;flutter的专属图片识别插件google_mlkit_image_labeling。 google_mlkit_image_labeling它是Google旗下的Google Cloud Vision API中分支出来的一部…

自定义BeanPostProcessor实现自动注入标注了特定注解的Bean

定义注解 Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Documented public interface MyAnno { }定义一个配置类 Configuration public class RestConfig {MyAnnoBeanpublic PayDTO payDTO(){PayDTO payDTO …

PyTorch使用教程- Tensor包

### PyTorch使用教程- Tensor包 PyTorch是一个流行的深度学习框架&#xff0c;它提供了一个易于使用的API来创建和操作张量&#xff08;Tensors&#xff09;。张量是一个多维数组&#xff0c;类似于NumPy中的ndarray&#xff0c;但它是基于GPU的&#xff0c;支持自动求导。本文…

国产编辑器EverEdit - 合并行

1 合并行 1.1 应用场景 在编写代码或其他场景下&#xff0c;有时需要把多行的内容缩减成一行&#xff0c;或者纯粹减少行数进行合并&#xff0c;比如&#xff1a;下面的字典的定义&#xff0c;每个元素占了一行&#xff0c;有点浪费&#xff0c;现在需要把它们缩减行数。 typ…

3 前端(中):JavaScript

文章目录 前言&#xff1a;JavaScript简介一、ECMAscript&#xff08;JavaScript基本语法&#xff09;1 JavaScript与html结合方式&#xff08;快速入门&#xff09;2 基本知识&#xff08;1&#xff09;JavaScript注释&#xff08;和Java注释一样&#xff09;&#xff08;2&am…