Flask框架初探-如何在本机发布一个web服务并通过requests访问自己发布的服务-简易入门版
本文主要是面对小白入门一下如何非常简单的使用flask框架发布一个服务,设置基础的端口号允许访问的地址,还有用python代码访问自己发布发服务获取结果。
Flask框架初探
在接触到网络框架之前我其实一直对一个事情有疑惑,跨语言的API在需要传参的情况下究竟应该如何调用,之前做过的项目里,我用python做了一个代码使用一个算法得到一个结果之后我应该怎么给到做前端的同学或者同事,之前的解决方案是将自己的python文件打包成一个exe然后运行exe在指定路径文件夹下生成一个txt文件,然后其他人调用执行我的exe然后,再去读我生成的txt文件,但是运行exe文件每次都是从加载库开始运行,巨慢无比,而且还不能传参,但是对于划分责任来说倒是非常明确,在我接触到web应用框架之前,一说到要传参大家都是一脸无奈。接触到web应用框架之后我才发现这应该就是最好的解决方案了,当我运行了一个web应用,然后其他语言只需要向我发起一个请求就可以直接访问我的计算结果,不需要每次都重新加载库,需要用到什么API直接发起服务就可以了,这篇文章就介绍一下GPT4给我推荐的Flask框架。
进阶阅读:Flask框架进阶-Flask流式输出和受访配置–纯净详解版
文章目录
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)中的debug为Ture就可以开启调试模型
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.args.get中的第一个值为,获取请求中对应的字段的值的字段的名称,defult为获取不到的情况下的一个会给予一个默认值。
例如:query = request.args.get(‘query’, default=‘default_query’) 作用为获取get请求中query字段的值,然后如果没有接收到返回值的话默认赋值为’default_query’
这里的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) # 打印响应的文本内容
10.使用post请求接收参数
在使用get进行传参任务请求的时候发现,如果使用get请求需要将参数写在请求的URL当中有时会造成信息泄露增加不安全性,同时get请求获取参数的数据类型也是有限的,只能获取一些字符串或者数值类型的数据,而post请求可以传一些例如列表类型的数据,在Flask应用的默认状态中,一般只接收get请求,如果需要设置允许服务接收post请求则需要进行设置,通过设置@app.route中的methods方法来选择接收的请求的类型,如果想接收post请求,则需要将methods设置为['POST']。与get请求接收参数的方式不同,post请求接收参数使用的是request.form.get而get请求接收参数使用的是request.args.get
POST 请求是一种 HTTP 请求方法,主要用于向服务器提交数据,如表单数据或文件。与 GET 请求不同,POST 请求不会将数据暴露在 URL 中,提供更高的安全性,支持更大的数据量,并且一般不被缓存。POST 请求不是幂等的,相同的请求如果多次发送可能会产生不同的结果。这种请求方法通常用于用户注册、表单提交和文件上传等场景。
from flask import Flask, request
app = Flask(__name__)
# 这个路由现在只处理 POST 请求。
# 你可以通过 HTML 表单或使用类似 Postman 的工具来测试 POST 请求。
@app.route('/search', methods=['POST'])
def search():
# 从表单数据中获取参数
query = request.form.get('query', 'default_query')
sort = request.form.get('sort', 'date')
return f'Search for {query} sorted by {sort}'
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=9000)
使用requests库发送一个简单的post请求的代码为
import requests
# 指定你的 Flask 应用的 URL
url = 'http://127.0.0.1:9000/search'
# 准备发送的数据
data = {
'query': 'python',
'sort': 'latest'
}
# 使用 requests 库发送 POST 请求
response = requests.post(url, data=data)
# 打印服务器响应的内容
print(response.text)
运行结果如下:

11.开启跨域
在实际应用中,和同事联调的时候,如果同事从另外一个电脑访问你,一般都会要求你开启跨域,不然的话会访问不到,对Flask框架开启跨域也非常简单,只需要额外安装一个flask_cors库引入CORS,然后在app = Flask(__name__)的后面用CORS()套一下app,也就是下面代码中的CORS(app),就可以开启跨域了,无论是get还是post请求都是使用这个方法开启跨域。
跨域(Cross-Origin Resource Sharing,CORS)是一种浏览器安全机制,用来控制一个域上的网页如何与另一个域的服务器交互,是当一个网页尝试请求另一个与其不同源(协议、域名或端口任何一个不同)的服务器资源时发生的。
安装命令
pip install flask_cors
测试代码
from flask import Flask, request
from flask_cors import CORS # 引入 CORS
app = Flask(__name__)
CORS(app) # 启用 CORS
@app.route('/search', methods=['POST'])
def search():
# 从表单数据中获取参数
query = request.form.get('query', 'default_query')
sort = request.form.get('sort', 'date')
return f'Search for {query} sorted by {sort}'
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=9000)
结束
其实本来打算把,传参,post格式,还有流式输出也写上,然后流式输出写上但是可能内容就有点多了,标题还说的简易入门,到时候是看看补在这个文章下面还是分开写。然后我本来想基于官方文档写,但是官方文档主要是面向Linux多一些,不是很容易理解,同学们去看官方文档的时候不太舒服的话也很正常,需要什么功能搜什么功能就好了。
2024.4.18更新
补充上了路由和传参的部分post和流式输出我觉得不适合入门,考虑之后单独写吧。
2024.7.17更新
补充上了post请求的基础例程,和如何开启跨域。
GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐


所有评论(0)