Flask框架初探-如何在本机发布一个web服务并通过requests访问自己发布的服务-简易入门版

Flask框架初探

       在接触到网络框架之前我其实一直对一个事情有疑惑,跨语言的API在需要传参的情况下究竟应该如何调用,之前做过的项目里,我用python做了一个代码使用一个算法得到一个结果之后我应该怎么给到做前端的同学或者同事,之前的解决方案是将自己的python文件打包成一个exe然后运行exe在指定路径文件夹下生成一个txt文件,然后其他人调用执行我的exe然后,再去读我生成的txt文件,但是运行exe文件每次都是从加载库开始运行,巨慢无比,而且还不能传参,但是对于划分责任来说倒是非常明确,在我接触到web应用框架之前,一说到要传参大家都是一脸无奈。接触到web应用框架之后我才发现这应该就是最好的解决方案了,当我运行了一个web应用,然后其他语言只需要向我发起一个请求就可以直接访问我的计算结果,不需要每次都重新加载库,需要用到什么API直接发起服务就可以了,这篇文章就介绍一下GPT4给我推荐的Flask框架。


文章目录

  • Flask框架初探
  • 1.Falsk框架简介
  • 2.Flask框架的安装
  • 3.使用Flask发布一个微型应用-Flask的Hello_world
  • 4.Flask的调试模式
  • 5.设置Flask监听所有地址的访问
  • 6.设置Flask服务端口
  • 7.使用python代码访问本地服务(requests库)
  • 8.配置Flask路由端点
  • 9.设置Flask框架接收传参请求
  • 结束
  • 2024.4.18更新

1.Falsk框架简介


Flask是一个使用Python编写的轻量级Web应用框架。基于Werkzeug WSGI工具箱和Jinja2模板引擎。Flask使用BSD授权。

在这里插入图片描述

对于入门的我们来说就第一句话有用。Flask是一个使用Python编写的轻量级Web框架,那什么是Web应用框架。

Web应用框架(Web application framework)是一种电脑软件框架,用来支持动态网站、网络应用程序及网络服务的开发。这种框架有助于减轻网页开发时共通性活动的工作负荷,例如许多框架提供数据库访问接口、标准模板以及会话管理等,可提升代码的可再用性。

web编程框架有非常多的种类,这里简单看一下不同的语言的web框架有哪些简单了解一下即可。比如js同事常说的vue框架也属于web应用框架的一种。
在这里插入图片描述

2.Flask框架的安装


现在每次在介绍新的框架或者安装库之后,我都要新建一个环境,这样不会导致一个环境各种库杂糅在一起。

首先新建一个环境python版本选择稳定版本中最新的3.10(写该文章的时候)

conda create --name flask python=3.10

查看最python稳定版本:https://www.python.org/downloads/
在这里插入图片描述

启动虚拟环境

conda activate flask

使用pip命令安装flask

pip install Flask

其他系统见官方文档的官方指南

https://flask.palletsprojects.com/en/3.0.x/installation/#install-flask
在这里插入图片描述

3.使用Flask发布一个微型应用-Flask的Hello_world


接下来给一个简单的例程,本文的例程为官方文章的QuickStart部分进行易于理解的改编,官方文档QuickStart网址

https://flask.palletsprojects.com/en/3.0.x/quickstart/

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "Hello, World!"

if __name__ == "__main__":
    app.run(debug=False)

记下来结合官方文档和自己的在实际使用种的经验对每一句进行解释

  • from flask import Flask导入Flask类,这个类之后会帮我们构建自己的WSGI应用。

    Web服务器网关接口Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。(维基百科)

  • app = Flask(__name__)实例化一个app应用,按照官方解释__name__用于让Flask框架知道去哪里寻找一些资源,例如templates模板和static files. 一般情况记住就可以固定写法。

  • @app.route("/")使用route()装饰器来告诉Flask框架哪个URL会用来触发我们的function(功能API)。"/"表示通过默认URL路径访问之后会有例子介绍。

    统一资源定位符(英语:Uniform Resource Locator,缩写:URL,或称统一资源定位器定位地址URL地址[1])俗称网页地址,简称网址,是因特网上标准的资源的地址(Address),如同在网络上的门牌。它最初是由蒂姆·伯纳斯-李发明用来作为万维网的地址,现在它已经被万维网联盟编制为因特网标准RFC 1738

  • def hello_world()要触发的功能函数,该示例中返回一个HelloWorld字符串

  • if __name__ == "__main__":判断当前脚本是不是被直接运行

  • app.run(debug=False)运行应用,关闭调试模式。

运行结果:
在这里插入图片描述
运行之后打印出了一个网页地址也就是URLhttp://127.0.0.1:5000(等效http://localhost:5000)其中http://为协议名词127.0.0.1为默认的本机IP地址(localhost默认地址),5000为端口号,将该网址输入浏览器,即可看到hello_world函数的运行结果,
在这里插入图片描述

每次访问之后都会在控制台看到一个访问的提示信息显示访问的IP地址和请求类型等等。
在这里插入图片描述

4.Flask的调试模式


什么是调试模式,一般而言如果我们在运行一个程序,在他运行的过程中如果调整代码,需要先关闭这个运行的程序,然后再运行,改动的代码才能生效,但是如果在项目中直接关掉服务可能会导致其他程序的工作混乱,因此需要一个在运行过程中不重启代码也能让改动生效的机制,在Flask框架中,在启动应用前设置app.run(debug=False)中的debugTure就可以开启调试模型

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return "Hello World!"

if __name__ == '__main__':
    app.run(debug=True)

在这里插入图片描述
接下来更改一下hello_world函数的返回内容,变成"Hello Hello!",改完之后会自动触发重加载,不需要重新运行程序。
在这里插入图片描述
再次使用浏览器访问URL网页内容显示已经改变为Hello!Hello!
在这里插入图片描述

5.设置Flask监听所有地址的访问


       在前面的例子中,我们只能接收来自本机的访问,因为在app.run()中有一个host参数用来设置监听的地址,默认情况下host=127.0.0.1只监听本机的访问请求,如果想监听同一网络环境下的所有设备则需将host设置成0.0.0.0只有这样才可以监听所有的网络设备的请求。即app.run(debug=True, host='0.0.0.0')改变app.run()中的设置时即使在debug模式下也需要重启代码才能运行

示例代码如下:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return "Hello Hello!"

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')

       运行结果如下,可以看到监听地址多了一个通过本机访问的URL
在这里插入图片描述
在这里插入图片描述

6.设置Flask服务端口


       在允许了所有设备的访问之后,接下来需要设置服务所在端口,因为最后我们将代码部署在服务器上的时候,由于一个服务器上会同时又很多个服务,每个服务都需要一个端口,所以根据协调之后的结果我们需要按照约定修改我们的端口号。端口号设置在app.run()中的port(默认5000)参数.接下来将端口设置为9000代码如下。

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return "Hello Hello!"

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=9000)

       运行结果如下,可以看见访问我们发布服务的本机的端口号已经变为9000

在这里插入图片描述

7.使用python代码访问本地服务(requests库)


       目前的访问方式都是通过网络浏览器来访问,接下来要使用代码来访问我们启动的网络服务中返回的结果。这里用到python的requests库来在代码中发送HTTP请求。这个库也是爬虫中经常用到的库。

pip install requests

       接下来用requests来访问一下上一部分发布的服务打印出访问服务得到的返回信息

import requests

# 发送GET请求
response = requests.get('http://127.0.0.1:9000')
print(response.text)  # 打印响应的文本内容s

在这里插入图片描述

8.配置Flask路由端点

首先是路由,这里直接看英文的维基百科中机翻的不太好所以我去搜了一下英文的
在这里插入图片描述
https://en.wikipedia.org/wiki/Routing

在这里插入图片描述

然后就看这里的第一句话

Routing is the process of selecting a path for traffic in a network or between or across multiple networks.

路由是为了在网络中(在一个网络内或在两个网络之间或横跨多个网络)进行交互(通信)的一个选择路径的过程


Routing is the process of selecting a path 先翻译这句

路由是一个选择路径的过程

for 为了

traffic in a network or between or across multiple networks

在一个网络内,或在两个网络之间,或横跨多个网络,进行交互通信。


由于本人也就是六级刚过三个阅读选择的水平,or between or across这块拿不太准,因此我问了一下我的学翻译的过了英语专八雅思6.5+的朋友。他告诉我由于between和across multiple 后面接的都是 networks 因此between后面的就被省略了,然后前面的network是单数不能省略,所以这句话应该拆分成三个理解,在此特别鸣谢我的好朋友。
在这里插入图片描述

在刚开始使用的时候就理解成设置访问路径用的就完事了

在默认不设置端点的情况下@app.route('/')默认的路由没有端点范文路径就是IP地址加端口号,记下来加上一个端点代码如下加一个hello端点

from flask import Flask

app = Flask(__name__)

@app.route('/hello')
def hello_world():
    return "Hello Hello!"

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=9000)

如果还是只访问IP地址加端口号的话,就会返回404 NotFound错误
在这里插入图片描述
因此需要在访问的路径后面加上端点,这样才能得到想要的返回值。
在这里插入图片描述
访问代码如下

import requests

# 发送GET请求
response = requests.get(f'http://127.0.0.1:9000/hello')
print(response.text)  # 打印响应的文本内容

节点的好处是在运行一个应用的情况下同时发布两个服务,通过不同的访问路径可以得到不同的返回值。

from flask import Flask

app = Flask(__name__)

@app.route('/hello')
def hello_hello():
    return "Hello Hello!"

@app.route('/world')
def hello_world():
    return "Hello world!"


if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=9000)

因此我们朝着该应用的两个服务发送请求就可以得到两个结果
在这里插入图片描述

import requests

# 发送GET请求
response = requests.get(f'http://127.0.0.1:9000/hello')
print(response.text)  # 打印响应的文本内容

response = requests.get(f'http://127.0.0.1:9000/world')
print(response.text)  # 打印响应的文本内容

9.设置Flask框架接收传参请求

  • 使用路径参数的方式

这里先给一个例子在服务的function中传入了一个name参数

from flask import Flask

app = Flask(__name__)

# 定义带参数的路由
@app.route('/<name>')
def hello(name):
    return f'Hello, {name}!'

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=9000)

传参部分需要修改装饰器中@app.route('/')()中的内容变为@app.route('/<参数1>/<参数2>/<参数3>....')的格式,然后将function函数中对应上写上相关的形参def function(参数1,参数2,参数3),但这里的参数默认还都是字符串

使用requests库带参数发送请求

import requests

# 发送GET请求
response = requests.get('http://127.0.0.1:9000/sthao')
print(response.text)  # 打印响应的文本内容

在这里插入图片描述
接收指定数据类型的参数,例如我们想接收一个浮点型数据,作为输入参数则可以将<参数1>变为<数据类型:参数1>,给出一个基础的例子:但是这种方式只支持如字符串(string)、整数(int)、浮点数(float)和类似基础数据类型,传路径的话数据类型得是(path)才能接收含(/),是不支持列表元组字典之类的格式的。这是因为 URL 需要是简单且可编码的文本格式

from flask import Flask

app = Flask(__name__)

# 定义带有类型指定的路由
@app.route('/<float:value>')
def show_price(value):
    # `value` 参数将被自动转换为 float 类型
    return f'The price is {value:.2f} dollars.'

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=9000)

request发送请求代码

import requests

# 发送GET请求
response = requests.get(f'http://127.0.0.1:9000/{3.1415}')
print(response.text)  # 打印响应的文本内容

在这里插入图片描述

  • 使用request.args.get获取参数

这种获得参数的方式在配置路由的时候不需要指定接收的变量名称但对URL有格式要求而且只能接收字符串路径字符串也可以,这里直接看一个例子,使用该种凡是获取参数,需要在@app.route('/search')产生的基础的URL(http://127.0.0.1:9000/search)后加?作为分隔符后继参数用&分割。这种也是比较常见的一种方式。

这里的request是flask框架种的request需要在开始的时候导入,不是我们测试请求结果中用到的requests库

from flask import Flask,request

app = Flask(__name__)

# 请求格式示例:http://127.0.0.1:5000/search?query=python&sort=latest
@app.route('/search')
def search():
    query = request.args.get('query', default='default_query')
    sort = request.args.get('sort', default='date')
    return f'Search for {query} sorted by {sort}'

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=9000)
    

运行结果
在这里插入图片描述
请求代码

import requests

# 发送GET请求
response = requests.get(f'http://127.0.0.1:9000/search?query=python&sort=latest')
print(response.text)  # 打印响应的文本内容

结束


       其实本来打算把,传参,post格式,还有流式输出也写上,然后流式输出写上但是可能内容就有点多了,标题还说的简易入门,到时候是看看补在这个文章下面还是分开写。然后我本来想基于官方文档写,但是官方文档主要是面向Linux多一些,不是很容易理解,同学们去看官方文档的时候不太舒服的话也很正常,需要什么功能搜什么功能就好了。

2024.4.18更新

补充上了路由和传参的部分post和流式输出我觉得不适合入门,考虑之后单独写吧。

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

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

相关文章

微信小程序使用echarts组件实现饼状统计图功能

微信小程序使用echarts组件实现饼状统计图功能 使用echarts实现在微信小程序中统计图的功能&#xff0c;具体的实现步骤思路可进我主页查看我的另一篇博文https://blog.csdn.net/weixin_45465881/article/details/138171153进行查看&#xff0c;本篇文章主要使用echarts组件实…

移动桌面均覆盖-免费使用,解锁VIP!

hello&#xff0c;我是小索奇 分享一下剪映&#xff0c;附带windows和移动端哈 软件内所有功能都已经解锁了哈&#xff01;不登录也是会员特权~ 相对于PR来说&#xff0c;用剪映省去了好多痛苦&#xff08;用过的都懂&#xff0c;都是包装&#xff09; 软件下载好之后双…

【计算机考研】计算机行业考研还有性价比吗?

刚上大学的时候觉得本科毕业就够了 到了大三找工作才发现自己什么都不会 只能踏上考研路 目前研一在读&#xff0c;身边有很多工作了几年又回来读研的同学&#xff0c;只能说现在计算机行业研究生还是比本科生有竞争力的 如果你的本科和我一样没有学什么技术&#xff0c;那…

实现Node.js安装与配置。

一 、Node.js简介 Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;用于构建高性能、可扩展的网络应用程序。它发布于2009年5月&#xff0c;由Ryan Dahl开发&#xff0c;允许使用JavaScript进行服务器端编程&#xff0c;使开发者能够在前后端都使用同一种编程…

MessageBox的模版语法上如何注册事件

目标&#xff1a; 想要在MessageBox中的文本中写一些事件&#xff0c;如何处理 在vue中进行操作&#xff1a; coding // 弹窗提示 this.$confirm({customClass: "add-fail",title: this.$t(add_error),type: error,dangerouslyUseHTMLString: true, // 将消息使用…

【学习笔记二十六】EWM 盘点后台配置和前台演示

一、EWM盘点业务概述 SAP EWM(Extended Warehouse Management)模块中的盘点业务是一个关键流程,它允许企业对仓库中的库存进行实物清点,以确保系统中记录的数据与实际库存相符。盘点过程有助于企业识别库存差异,从而进行必要的库存调整,确保库存记录的准确性,这对于财务…

电商技术揭秘三十二:智能风控的案例研究与未来趋势

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘二十八&#xff1a;安全与合规性保障 电商技术揭秘二十九&#xff1a;电商法律合规浅析 电商技术揭秘三十&#xff1a;知识产权保…

Excel 冻结前几行

Excel中有冻结首航和冻结首列的选项&#xff0c;但是如果想冻结前几行该怎么操作&#xff1f; 冻结首行或冻结首列 视图 -> 冻结窗格 -> 冻结首行或冻结首列 冻结前几行或前几列 视图 -> 冻结窗格 -> 冻结拆分窗格 具体冻结几行和几列取决于当前选中的单元格。…

leetcode 每日一题目 (树的直径 +DFS的深刻理解)

如下是题目的简单描述&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;二叉树中节点的值 互不相同 。另给你一个整数 start 。在第 0 分钟&#xff0c;感染 将会从值为 start 的节点开始爆发。 每分钟&#xff0c;如果节点满足以下全部条件&#xff0c;就会被感染&…

2. 多机多卡运行nccl-tests对比分析

系列文章 第2章 多机多卡nccl-tests 对比分析 目录 系列文章前言一、本地环境1. 网卡接口2. RDMA3. TOPO信息pcie信息nvidia-smi topo -m 二、nccl-test对比分析1. 相关环境变量2. 不同情况的对比3. 总结与分析 前言 NCCL&#xff08;NVIDIA Collective Communications Libra…

带头双向循环链表的基本操作(c语言实现)

带头双向循环链表 带头双向循环链表是一种结合了双向链表和循环链表特性的数据结构。其主要特点如下&#xff1a; 双向性&#xff1a;链表中的每个节点都有两个指针&#xff0c;一个指向下一个节点&#xff08;next&#xff09;&#xff0c;另一个指向前一个节点&#xff08;p…

11.泛型

文章目录 1 泛型概念2. 自定义泛型结构3 泛型方法4 泛型在继承上的体现5 通配符的使用 1 泛型概念 所谓泛型就是用标识符标识不确定的类型&#xff0c;详细说就是&#xff1a;定义类或接口时用标识符表示类中某个属性的类型或者是某个方法的返回值及参数类型。泛型将在使用时&a…

《QT实用小工具·三十九》仿 Windows10 画图3D 的颜色选择器, 但更加强大

1、概述 源码放在文章末尾 该项目实现了仿 Windows10 画图3D 的颜色选择器&#xff0c;功能更加丰富更加强大。 项目部分代码如下所示&#xff1a; import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15 import QtGraphicalEffects 1.15Item {id…

基于OSAL 实现UART、LED、ADC等基础示例 4

1 UART 实验目的 串口在我们开发单片机项目是很重要的&#xff0c;可以观察我们的代码运行情况&#xff0c;本节的目的就 是实现串口双工收发。 虽然说 osal 相关的代码已经跟硬件关系不大了&#xff0c;但是我们还是来贴出相关的硬件原理图贴出来。 1.1 初始化 osal_init_s…

Leetcode743. 网络延迟时间

Every day a Leetcode 题目来源&#xff1a;743. 网络延迟时间 本题需要用到单源最短路径算法 Dijkstra&#xff0c;现在让我们回顾该算法&#xff0c;其主要思想是贪心。 将所有节点分成两类&#xff1a;已确定从起点到当前点的最短路长度的节点&#xff0c;以及未确定从起…

分类分析|KNN分类模型及其Python实现

KNN分类模型及其Python实现 1. KNN算法思想2. KNN算法步骤2.1 KNN主要优点2.2 KNN主要缺点 3. Python实现KNN分类算法3.1 自定义方法实现KNN分类3.2 调用scikit-learn模块实现KNN分类 4. K值的确定 在之前文章 分类分析|贝叶斯分类器及其Python实现中&#xff0c;我们对分类分…

DHCP的原理与配置

一.了解DHCP服务 1. DHCP (Dynamic Host Configuration Protocol)动态主机配置协议 是由Internet工作小组设计开发的&#xff0c;专门用于为TCP/IP网络中的计算机自动分配TCP/IP参数的协议 DHCP协议采用的是UDP作为传输协议&#xff0c;是给网络内的客户机自动分配IP地址&…

Redis入门到通关之Redis实现Session共享

文章目录 ☃️前期概要☃️基于Session实现登录方案☃️现有方案存在的问题☃️Redis代替Session的业务流程❄️❄️设计key的结构❄️❄️设计key的具体细节❄️❄️整体访问流程 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博…

羊大师分析,羊奶和牛奶哪个更适合夏天喝?

羊大师分析&#xff0c;羊奶和牛奶哪个更适合夏天喝&#xff1f; 羊奶和牛奶都是营养丰富的饮品&#xff0c;适合不同人群在不同季节饮用。在夏天&#xff0c;选择羊奶还是牛奶主要取决于个人的体质、口味偏好以及需求。 羊奶的营养价值较高&#xff0c;含有丰富的蛋白质、矿物…

ESP8266+STM32+阿里云保姆级教程(AT指令+MQTT)

前言&#xff1a;在开发过程中&#xff0c;几乎踩便了所有大坑小坑总结出的文章&#xff0c;我是把坑踩满了&#xff0c;帮助更过小白快速上手&#xff0c;如有错误之处&#xff0c;还麻烦各位大佬帮忙指正、 目录 一、ESP-01s介绍 1、ESP-01s管脚功能&#xff1a; 模组启动模…