python基于flask写后端接口、python接收请求、python作为服务端提供接口、python接收json数据或数组

文章目录

  • 一、Flask 构成
  • 二、基于flask写后端接口
    • 2.1、接口可以调用其他类成员示例
    • 2.2、接口的入参是多个的示例
    • 2.3、接口的入参是路径的示例
    • 2.4、接口的入参是数组的示例
    • 2.5、python接收json数据或数组
      • 2.5.1、接口的入参是list的示例,入参是json格式
      • 2.5.2、接收json数据
      • 2.5.3、接收list数据并以list json输出
    • 2.6、将本地文件转化为接口的形式让前端访问
  • 三、跨域设置
  • 四、接收数据的方式以及请求
    • 方式一:放文件路径上
    • 方式二:form data
  • 五、如果后端返回的数据前端接收不到
  • 六、调用说明
  • 七、返回中文编码问题

Flask 是一个基于 Python 的轻量级 Web 框架,用于构建 Web 应用程序和 RESTful API。它被设计为简单、易用、灵活,并且具有良好的扩展性。Flask 是一个微型框架,提供了一些基本功能,但也允许开发者根据需要选择并添加扩展。

一、Flask 构成

  1. 路由(Routing):Flask 使用路由来定义 URL 和对应的处理函数。通过装饰器 @app.route(),可以将一个 URL 映射到相应的处理函数上,从而实现请求的路由和处理。

  2. 视图函数(View Functions):视图函数是 Flask 中处理请求的核心组件,它接收请求并返回响应。视图函数通常被装饰器绑定到特定的 URL 路由上。

  3. 请求上下文(Request Context):Flask 在处理请求时会创建一个请求上下文,其中包含了请求的信息,例如请求的方法、URL 参数、表单数据等。视图函数可以通过 request 对象来访问请求上下文中的数据。

  4. 响应对象(Response Object):视图函数需要返回一个响应对象,用于向客户端返回数据。Flask 提供了 make_response() 函数和 Response 类来构造响应对象,也可以直接返回字符串、模板渲染结果等。

  5. 模板引擎(Template Engine):Flask 默认使用 Jinja2 模板引擎来渲染 HTML 页面。模板引擎允许开发者在模板中嵌入动态内容,从而将数据和视图分离,使页面更加灵活和易于维护。

  6. 上下文全局变量(Context Globals):Flask 提供了一些上下文全局变量,例如 current_appg,可以在视图函数中使用。current_app 表示当前应用的实例,g 是一个全局变量字典,可以在同一请求中共享数据。

  7. 扩展(Extensions):Flask 的功能可以通过扩展来增强,例如数据库支持、表单验证、用户认证等。Flask 社区提供了大量的扩展,使开发者能够更方便地添加功能。

  8. 蓝图(Blueprint):蓝图是一种将 Flask 应用分割为小模块的方式,可以将相关的路由和视图函数组织在一个蓝图中,使应用更加结构化和易于管理。

示例如下:

from flask import Flask, request, jsonify# 用当前脚本名称实例化Flask对象,方便flask从该脚本文件中获取需要的内容
app = Flask(__name__)#在Flask中,路由是通过@app.route装饰器(以@开头)来表示
@app.route("/")
def index():return "Hello World!"#methods参数用于指定允许的请求格式,#常规输入url的访问就是get方法
@app.route("/hello",methods=['GET','POST'])
def hello():return "Hello World!"#注意路由路径不要重名,映射的视图函数也不要重名
@app.route("/hi",methods=['POST'])
def hi():return "Hi World!"#指定参数#string 接受任何不包含斜杠的文本#int 接受正整数#float 接受正浮点数#path 接受包含斜杠的文本@app.route("/index/<int:id>",)
def index_args(id):if id == 1:return 'first'elif id == 2:return 'second'elif id == 3:return 'thrid'else:return 'hello world!'#request对象的使用
@app.route("/index/request",)
def index_request():if request.method == 'GET':return render_template('index.html')elif request.method == 'POST':name = request.form.get('name')password = request.form.get('password')return name+" "+password#请求钩子before_request/after_request
#想要在正常执行的代码的前、中、后时期,强行执行一段我们想要执行的功能代码,便要用到钩子函数---用特#定装饰器装饰的函数。
@app.before_request
def before_request_a():print('I am in before_request_a')@app.before_request
def before_request_b():print('I am in before_request_b')#before_first_request:与before_request的区别是,只在第一次请求之前调用;#after_request:每一次请求之后都会调用;
#teardown_request:每一次请求之后都会调用;#after_request、teardown_request 钩子函数表示每一次请求之后,可以执行某个特定功能的函数,这个函数接收response对象,所以执行完后必须归还response对象;
#执行的顺序是先绑定的后执行;@app.after_request
def after_request_a(response):print('I am in after_request_a')# 该装饰器接收response参数,运行完必须归还response,不然程序报错return response#redirect重定向,应该配合url_for函数来使用
@app.route('/redirect_index')
def index():# redirect重定位(服务器向外部发起一个请求跳转)到一个url界面;# url_for给指定的函数构造 URL;# return redirect('/hello') 不建议这样做,将界面限死了,应该如下写法return redirect(url_for('hello'))#返回json数据给前端
@app.route("/web_index")
def index():data = {'name':'张三'}return jsonify(data)# 启动http服务
if __name__ == '__main__':app.run()#默认端口5000#app.run(debug=True,port=8999) 自定义端口为8999      

二、基于flask写后端接口

2.1、接口可以调用其他类成员示例

from flask import Flaskapp = Flask(__name__)class Database:def __init__(self):self.data = []def add_item(self, item):self.data.append(item)def get_items(self):return self.datadb = Database()@app.route('/api/add_item/<item>', methods=['POST'])
def add_item(item):db.add_item(item)return 'Item added successfully.'@app.route('/api/get_items', methods=['GET'])
def get_items():items = db.get_items()return ', '.join(items)@app.route('/post/<int:post_id>')
def show_post(post_id):return 'post_id: %d' % post_id@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':print('request',request)return 'POST'if request.method == 'GET':return 'GET'if __name__ == '__main__':app.run(debug=True)#端口默认为5000#app.run(debug=True,port=8999) 自定义端口为8999

app.route装饰器用于将URL规则和视图函数绑定。app.run方法启动了开发服务器,并且debug=True参数启用了调试模式,方便开发过程中进行代码更新和调试。flask接口默认端口为5000,也可以自定义端口。

2.2、接口的入参是多个的示例

from flask import Flaskapp = Flask(__name__)@app.route('/api/user/<username>/profile/<int:age>', methods=['GET'])
def get_user_profile(username, age):# 使用username和age进行相关操作return 'Username: {}, Age: {}'.format(username, age)if __name__ == '__main__':app.run(debug=True)

2.3、接口的入参是路径的示例

from flask import Flask, requestapp = Flask(__name__)@app.route('/api/user', methods=['GET'])
def get_user():path = request.args.get('path')# 使用path进行相关操作return 'Path: {}'.format(path)if __name__ == '__main__':app.run(debug=True)

调用方法:

curl -X GET "http://localhost:5000/api/user?path=/your/path"

2.4、接口的入参是数组的示例

from flask import Flask, requestapp = Flask(__name__)@app.route('/api/user', methods=['GET'])
def get_user():ids = request.args.getlist('ids')# 使用ids数组进行相关操作return 'IDs: {}'.format(ids)if __name__ == '__main__':app.run(debug=True)

调用方法:

curl -X GET "http://localhost:5000/api/user?ids=1&ids=2&ids=3"

2.5、python接收json数据或数组

2.5.1、接口的入参是list的示例,入参是json格式

from flask import Flask, request, jsonifyapp = Flask(__name__)@app.route('/process_data', methods=['POST'])
def process_data():# 从请求中获取 JSON 数据request_data = request.json# 假设请求数据是一个包含数字的列表data_list = request_data.get('data', [])# 对列表中的数据进行加倍处理doubled_data = [x * 2 for x in data_list]# 返回处理后的数据   使用jsonify来讲定义好的数据转换成json格式,并且返回给前端response_data = {'doubled_data': doubled_data}return jsonify(response_data)if __name__ == '__main__':app.run(debug=True)

调用方法:

curl -H "Content-Type: application/json" -H "Data_Type:msg" -X POST -d '{"data":[1, 2, 3, 4, 5]}' http://localhost:5000/process_data

响应:

{"doubled_data": [2, 4, 6, 8, 10]
}

2.5.2、接收json数据

# post XML 输入格式 {"bl_code": "BLA123P013", "ua_code": "UAA123P008"}
@app.route('/mes/api/v1.0/postxml', methods=['POST', 'OPTIONS', 'GET'])
def comm_postxml():# bl_code 和 ua_code 允许用户自行输入,用户传入 bl_code和ua_code值searchlists = request.get_json()print(searchlists)bl_code = searchlists['bl_code']ua_code = searchlists['ua_code']print(bl_code, ua_code)

输出如下

{'bl_code': 'BLA123P014', 'ua_code': 'UAA123P014'}
BLA123P014 UAA123P014

或者换一种写法

# post XML 输入格式 {"bl_code": "BLA123P013", "ua_code": "UAA123P008"}
@app.route('/mes/api/v1.0/postxml', methods=['POST', 'OPTIONS', 'GET'])
def comm_postxml():# bl_code 和 ua_code 允许用户自行输入,用户传入 bl_code和ua_code值bl_code = request.json['bl_code']ua_code = request.json['ua_code']print(bl_code, ua_code)

2.5.3、接收list数据并以list json输出

@app.route('/mes/api/v1.0/get_dpcapacklists', methods=['POST', 'OPTIONS', 'GET'])
def get__dpcapacklists():print(request)print("print serarchlists")packageList = request.get_json()print(packageList)print(packageList[0])print(packageList[0]["moduleList"])print(len(packageList[0]["moduleList"]))print(packageList[0]["moduleList"][0])print("=====================================")print(packageList[0]["moduleList"][0]['moduleCode'])print("=====================================")print(packageList[0]["moduleList"][0]["cellList"])print("=====================================")print(packageList[0]["moduleList"][0]["cellList"][0])return jsonify({'list': packageList})

或者只返回部分字段作为list

@app.route('/mes/api/v1.0/get_dpcapacknums', methods=['POST', 'OPTIONS', 'GET'])
def get_dpcapacknums():print("======================getccccccccccccccccccccccccccccccccccccccccapsapacklist post")print(request)print("print serarchlists")packageList = request.get_json()print(len(packageList))packlist = []i = 0for i in range(len(packageList)):print(packageList[i]['global_pack_code'])packlist.append(packageList[i]['global_pack_code'])return jsonify({'list': packlist})#返回pack号码

2.6、将本地文件转化为接口的形式让前端访问

from flask import Flask, request, send_fileapp = Flask(__name__)@app.route('/download/<filename>')
def download_file(filename):if filename == 'pdf':return  send_file('国土云举证图片示例.pdf')if filename == 'txt':return send_file('test.txt')if __name__ == "__main__":app.run(host='0.0.0.0', port=5000)

三、跨域设置

当你的后端服务启动并监听指定的端口后,如果前端无法调用后端服务,可能有以下几个原因:

  1. 网络连接问题:确保前端应用能够访问后端服务所在的服务器。检查服务器的网络配置、防火墙设置等,并确保前端应用能够正确访问服务器的IP地址和端口。

  2. 跨域资源共享(CORS)问题:如果前端应用和后端服务不在同一个域名下(例如,前端应用在http://localhost:3000,后端服务在http://localhost:5000),浏览器的同源策略可能导致请求被阻止。在后端服务中添加适当的CORS头信息,允许跨域请求。

在Flask中添加CORS头信息的示例代码如下:

安装 Flask-CORS 扩展:首先,需要安装 Flask-CORS 扩展。您可以使用 pip 安装:

pip install flask-cors
from flask import Flask
from flask_cors import CORSapp = Flask(__name__)
CORS(app)# 定义路由和处理逻辑...if __name__ == '__main__':app.run()

使用flask_cors库中的CORS对象,可以为Flask应用添加CORS支持,允许跨域请求。

扩展:
配置 CORS:您可以根据需要配置 CORS,例如指定允许的源(Origin)或请求头。

# 允许所有来源访问
CORS(app, resources={r"/*": {"origins": "*"}})# 允许特定来源访问
CORS(app, resources={r"/*": {"origins": "http://example.com"}})# 允许多个来源访问
CORS(app, resources={r"/*": {"origins": ["http://example.com", "http://example2.com"]}})
  1. 请求路径错误:确保前端应用使用正确的请求路径来调用后端服务。检查请求的URL和路由定义是否匹配。

  2. 请求方法不匹配:确保前端应用使用与后端服务路由定义相匹配的请求方法(GET、POST、PUT、DELETE等)。检查前端应用代码中的请求方法和后端服务中路由的定义是否一致。

  3. 服务未正确启动:确保后端服务已经正确启动,并且监听指定的端口。检查后端服务的日志输出,查看是否有错误或异常信息。

通过检查上述问题,你可以逐步定位并解决前端无法调用后端服务的原因。

四、接收数据的方式以及请求

方式一:放文件路径上

路径:/api/this_api?path=“****”
代码里:

path = request.args.get('path')

请求方式:

curl -X POST “http://ip:port/api/this_api?path=*****

方式二:form data

路径:/api/this_api
代码里:

path = request.form.get('path')

请求方式:

curl -X POST -d “path=*****” http://ip:port/api/this_api

五、如果后端返回的数据前端接收不到

因为没有返回信息头校验权限

return 内容, 200, {"Access-Control-Allow-Credentials": "true"}

六、调用说明

  • 启动docker
    docker run的时候带的选项要注意一下加上-p ip(外部访问的地址):5000(主机端口):5000(容器端口) 比如:
docker run -p 192.168.0.1:5000:5000 XXXX

注意以上docker命令不完整,完整的docker命令详细版请参考基于NVIDIA的dockerfile实操

  • 写服务时
if __name__ == "__main__":app.run(host='0.0.0.0', port=5000)
  • 调用时

示例:

curl -X POST "http://192.168.0.1:5000/api/this_api?path=*****"

七、返回中文编码问题

参考:https://blog.51cto.com/qzcsbj/5016619

如此返回即可:

res = {"ret": 0, "msg": "ok", "res":"我要返回中文"}
return json.dumps(res, ensure_ascii=False)




参考文章:https://blog.csdn.net/ThomasCai001/article/details/131193932

参考文档: 如何理解 flask 中的 Blueprint 的 name 参数 - 简书 (jianshu.com)

参考文档:Flask框架入门教程(非常详细)从零基础入门到精通,看完这一篇就够了-CSDN博客

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

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

相关文章

116页 | 2024年中国金融行业网络安全研究报告(免费下载)

以上是资料简介和目录&#xff0c;如需下载&#xff0c;请前往星球获取&#xff01;&#xff01;&#xff01;

Linux - 深入理解/proc虚拟文件系统:从基础到高级

文章目录 Linux /proc虚拟文件系统/proc/self使用 /proc/self 的优势/proc/self 的使用案例案例1&#xff1a;获取当前进程的状态信息案例2&#xff1a;获取当前进程的命令行参数案例3&#xff1a;获取当前进程的内存映射案例4&#xff1a;获取当前进程的文件描述符 /proc中进程…

29、matlab算数运算汇总2:加、减、乘、除、幂、四舍五入

1、乘法:times, .* 语法 C A.*B 通过将对应的元素相乘来将数组 A 和 B 相乘。 C times(A,B) 是执行 A.*B 的替代方法&#xff0c; 1)将两个向量相乘 代码及运算 A [1 0 3]; B [2 3 7]; C A.*BC 2 0 212&#xff09; 将两个数组相乘 代码及运算 A [1 0 3;…

Docker面试整理-Docker的网络是如何工作的?

Docker 的网络功能允许容器以多种方式连接到彼此、宿主机以及外部网络。Docker 使用不同的网络驱动来支持这些连接,每种驱动方式都适用于特定的用途。理解 Docker 的网络是如何工作的,可以帮助你更好地设计和管理容器化应用的通信。 Docker 网络驱动 bridge:默认网络驱动。当…

学校教学选择SOLIDWORKS教育版的理由

在现代工程和技术教育领域中&#xff0c;计算机辅助设计软件&#xff08;CAD&#xff09;已成为不可或缺的教学工具。SOLIDWORKS作为一款功能强大、易于上手的CAD软件&#xff0c;其教育版在学校教学中备受青睐。本文将从多个方面探讨学校教学选择SOLIDWORKS教育版的理由。 一…

纷享销客集成平台(iPaaS)的应用与实践

案例一 企业系统集成的产品级解决方案 概况 随着国家出台一系列鼓励LED照明产业发展与创新的规划和政策&#xff0c;以及国际市场全球演唱会、音乐会的活跃以及线上零售、商业地产等行业回暖&#xff0c;LED显示行业发展形势积极向好。深圳市艾比森光电股份有限公司&#xff…

苹果警告部分 iPhone 用户称他们遭到雇佣间谍软件攻击

苹果警告部分 iPhone 用户称他们遭到“雇佣间谍软件攻击 苹果正在提醒用户注意针对 iPhone 的新一轮已识别雇佣间谍软件攻击。可能的受害者已经收到来自苹果的电子邮件&#xff0c;其中描述了该攻击如何“远程破坏 iPhone”。据路透社报道&#xff0c;印度和其他 91 个国家的受…

为何PHP使用率 大幅度下降!需求量几乎为零!

用PHP的人越来越少的主要原因包括&#xff1a;市场竞争加剧、新技术的出现、性能和安全问题、以及开发者社区的变化。市场竞争加剧是其中一个突出的因素。随着Python、Node.js等现代编程语言的崛起&#xff0c;它们提供了更好的性能、更简洁的语法和更丰富的框架&#xff0c;逐…

2024我们该学习大模型吗?

一、引言 在快速变化的科技行业中&#xff0c;人工智能&#xff08;AI&#xff09;大模型已成为研究和应用的热点。随着AI技术的不断进步&#xff0c;特别是在自然语言处理、计算机视觉和机器学习平台等领域&#xff0c;许多专业人士开始将目光投向AI大模型的开发和应用。 二…

异常断电数据库恢复-从ORA-600 2131到ORA-08102: 未找到索引关键字, 对象号 39---惜分飞

数据库启动报ORA-600 2131&#xff0c;以前遇到过类似问题:ORA-600 2131故障处理 SQL> alter database mount; alter database mount * 第 1 行出现错误: ORA-00600: ??????, ??: [2131], [9], [8], [], [], [], [], [], [], [], [], [] Tue Jun 04 14:12:18 2024 …

P10 属性分组

P71 属性分组页面搭建 前端组件抽取&父子组件交互 前端页面中&#xff1a; 菜单 1、sys_admin.sql语句在gulimail_admin数据库执行。注意自己的数据库名称是否和文件中的一致。刷新页面后&#xff0c;发现页面新增。找到平台属性—属性分组。 2、在product文件夹&…

JeeSite 快速开发平台 Vue3 前端版介绍

JeeSite 快速开发平台 Vue3 前端版介绍&#xff1a; 它构建于 Vue3、Vite、Ant-Design-Vue、TypeScript 以及 Vue Vben Admin 等最前沿的技术栈之上&#xff0c;能助力初学者迅速上手并顺利融入团队开发进程。涵盖的模块包括组织机构、角色用户、菜单授权、数据权限、系统参数…

LLM的基础模型6:注意力机制

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

leetcode刷题-二叉树01

代码随想录二叉树part01|二叉树的理论基础 理论基础种类&#xff1a;存储方式&#xff1a;二叉树的遍历&#xff1a;二叉树定义方式&#xff1a; 理论基础 代码随想录文档讲解 种类&#xff1a; 满二叉树&#xff0c;节点数量&#xff1a; 2 n − 1 2^n-1 2n−1完全二叉树&a…

MongoDB~索引使用与优化

Study by&#xff1a; https://docs.mongoing.com/indexeshttps://www.cnblogs.com/Neeo/articles/14325130.html#%E5%85%B6%E4%BB%96%E7%B4%A2%E5%BC%95 作用 如果你把数据库类比为一本书&#xff0c;那书的具体内容是数据&#xff0c;书的目录就是索引&#xff0c;所以索引…

NIST 电子病历中的疫苗部分的认证

美国国家标准与技术研究院&#xff08;National Institute of Standards and Technology&#xff0c;NIST&#xff09;对电子病历的认证 分几个阶段&#xff0c;每个阶段又分门诊和住院&#xff0c;然后又分若干模块。下面是疫苗模块的数据提交的测试脚本。 170.302k_Immuniza…

数据提取:构建企业智能决策的基石

在数字化时代&#xff0c;数据已成为企业最宝贵的资产之一。而数据提取&#xff0c;作为数据分析和智能决策的第一步&#xff0c;正日益成为企业构建竞争优势的关键环节。本文将探讨数据提取的重要性、方法以及它如何为企业的智能决策奠定坚实基础。 一、数据提取的重要性 洞…

Rust 实现 kvmsample

GitHub - BillXiang/kvmsample at rust cd kvmsample make cp test*.bin kvmsample-rust cd kvmsample-rust cargo run两个vm中分别执行IO_OUT和IO_IN: KVM_EXIT_IO_OUT addr:16 data:84 KVM_EXIT_IO_IN addr 16 KVM_EXIT_IO_OUT addr:16 data:85 KVM_EXIT_IO_IN addr 16 KVM_…

多线程..

线程定义&#xff1a;线程是操作系统能够进行运算调度的最小单位&#xff0c;它被包含在进程之中&#xff0c;是进程中实际运作单位。简单来说&#xff0c;应用软件中相互独立&#xff0c;可以同时运作的功能。 多线程作用&#xff1a;有了多线程&#xff0c;我们就可以让程序…

【机器学习300问】108、什么是多项式回归模型?

一、多项式回归是什么 &#xff08;1&#xff09;举例说明 假设你经营着一家农场&#xff0c;想要根据土地面积来预测作物的产量。如果你只用线性模型&#xff08;即&#xff09;&#xff0c;你可能会发现它并不足以描述实际的产量情况&#xff0c;因为实际产量可能会随着土地…