【Flask 3.1.2】3 访问 API 并直接返回结果
一、无校验
直接提供API,接受用户传来的请求,根据请求执行自己的签名,直接返回用户结果。
服务端代码
from flask import Flask, request, jsonify
import hashlib
app = Flask(__name__)
@app.route("/bili", methods=["POST"])
def bili():
"""
请求的数据格式要求:{"ordered_string": "..."}
"""
ordered_string = request.json.get("ordered_string")
if not ordered_string:
return jsonify({'status': False, 'error': "参数错误"})
# 核心算法 生成sign签名
encrypt_string = ordered_string + "dasdsadsdasdsadsadsadsad"
obj = hashlib.md5(encrypt_string.encode('utf-8'))
sign = obj.hexdigest()
return jsonify({'status': True, 'data': sign})
if __name__ == '__main__':
app.run(host="127.0.0.1", port=5000)
(模拟)请求端代码
import requests
# 目标URL
url = "http://127.0.0.1:5000/bili"
# 要发送的请求体数据(字典形式)
data = {
"ordered_string": "dnsaonv039h09g095h1nnoc0wjv91ncmosad01-e95ghwe9nfc0mq"
}
# 发送POST请求
response = requests.post(url, json=data)
# 处理响应
print("状态码:", response.status_code) # 200表示成功
print("响应内容:", response.text) # 响应的文本内容
# 如果响应是JSON格式,可以直接解析
if response.status_code == 200:
try:
json_data = response.json()
print("JSON响应:", json_data)
except ValueError:
print("响应不是JSON格式")

二、有校验-基于文件授权
生成uuid
用于待会进行校验
import uuid
print(uuid.uuid4())
得到一个uuid:4aba0848-f42d-424b-8c4d-457c7a70b852
写入到db.txt
所有记录在db.txt的用户为合法用户

请求端
import requests
# 目标URL
url = "http://127.0.0.1:5000/bili?token=14b4a328-volj-9j4b-b89d-45782a70b137"
# 要发送的请求体数据(字典形式)
data = {
"ordered_string": "dnsaonv039h09g095h1nnoc0wjv91ncmosad01-e95ghwe9nfc0mq"
}
# 发送POST请求
response = requests.post(url, json=data)
# 处理响应
print("状态码:", response.status_code) # 200表示成功
print("响应内容:", response.text) # 响应的文本内容
# 如果响应是JSON格式,可以直接解析
if response.status_code == 200:
try:
json_data = response.json()
print("JSON响应:", json_data)
except ValueError:
print("响应不是JSON格式")

服务端
from flask import Flask, request, jsonify
import hashlib
app = Flask(__name__)
# 一个简单的校验
def get_user_dict():
info_dict = {}
with open("db.txt", mode='r', encoding='utf-8') as f:
for line in f:
line = line.strip()
token, name = line.split(',')
info_dict[token] = name
print(info_dict)
return info_dict
@app.route("/bili", methods=["POST"])
def bili():
"""
请求的url中需要携带token /bili?token=4aba0848-f42d-424b-8c4d-457c7a70b852
请求的数据格式要求:{"ordered_string": "..."}
"""
# 没有附带token
token = request.args.get("token")
if not token:
return jsonify({'status': False, 'error': "认证失败"})
# 不是合法token
user_dict = get_user_dict()
if token not in user_dict:
return jsonify({'status': False, 'error': "认证失败"})
ordered_string = request.json.get("ordered_string")
if not ordered_string:
return jsonify({'status': False, 'error': "参数错误"})
# 核心算法 生成sign签名
encrypt_string = ordered_string + "dasdsadsdasdsadsadsadsad"
obj = hashlib.md5(encrypt_string.encode('utf-8'))
sign = obj.hexdigest()
return jsonify({'status': True, 'data': sign})
if __name__ == '__main__':
app.run(host="127.0.0.1", port=5000)

三、有校验-基于数据库授权(PostgreSQL)
数据库
在 PostgreSQL 中新建一个表 user

手动插入2条数据,记得保存。

服务端
from flask import Flask, request, jsonify
import hashlib
import psycopg2
app = Flask(__name__)
@app.route("/bili", methods=["POST"])
def bili():
"""
请求的url中需要携带token /bili?token=4aba0848-f42d-424b-8c4d-457c7a70b852
请求的数据格式要求:{"ordered_string": "..."}
"""
# 1. token是否为空 连接PostgreSQL
token = request.args.get("token")
print(token)
if not token:
return jsonify({'status': False, 'error': "认证失败"})
# 2. token是否合法
# 连接Postgre
conn = psycopg2.connect(
database="postgres",
user="postgres",
password="123",
host="127.0.0.1",
port="5432"
)
cursor = conn.cursor()
cursor.execute("select * from user_token_name where token=%s", [token, ])
result = cursor.fetchone()
cursor.close()
conn.close()
if not result:
return jsonify({'status': False, 'error': "认证失败"})
ordered_string = request.json.get("ordered_string")
if not ordered_string:
return jsonify({'status': False, 'error': "参数错误"})
# 核心算法 生成sign签名
encrypt_string = ordered_string + "dasdsadsdasdsadsadsadsad"
obj = hashlib.md5(encrypt_string.encode('utf-8'))
sign = obj.hexdigest()
return jsonify({'status': True, 'data': sign})
if __name__ == '__main__':
app.run(host="127.0.0.1", port=5000)

请求端
代码和上文相同

服务端优化:集成数据库连接池
原本的代码每次都要新建和撤销连接,效率低。
需要安装DBUtils包
from flask import Flask, request, jsonify
import hashlib
import psycopg2
from dbutils.pooled_db import PooledDB
app = Flask(__name__)
POOL = PooledDB(
# 连接池配置
creator=psycopg2, # 用来连接数据库的模块
maxconnections=10, # 连接池最大允许的连接数 0和None表示不限制连接数
mincached=2, # 初始化时,连接池中最少创建的空闲连接,0表示不创建
maxcached=3, # 连接池中最多闲置的的连接,0和None不限制
blocking=True, # 连接池中如果没有可用连接,是否阻塞等待
setsession=[], # 开始会话前执行的命令列表 如:["set datestyle to ...", "..."]
ping=0,
# 数据库配置
host="127.0.0.1",
port="5432",
user="postgres",
password="123",
database="postgres"
)
@app.route("/bili", methods=["POST"])
def bili():
"""
请求的url中需要携带token /bili?token=4aba0848-f42d-424b-8c4d-457c7a70b852
请求的数据格式要求:{"ordered_string": "..."}
"""
# 1. token是否为空 连接PostgreSQL
token = request.args.get("token")
print(token)
if not token:
return jsonify({'status': False, 'error': "认证失败"})
# 2. token是否合法
# 连接Postgre
conn = POOL.connection() # 通过连接池获取连接
cursor = conn.cursor()
cursor.execute("select * from user_token_name where token=%s", [token, ])
result = cursor.fetchone()
cursor.close()
conn.close() # 将此连接交还连接池
if not result:
return jsonify({'status': False, 'error': "认证失败"})
ordered_string = request.json.get("ordered_string")
if not ordered_string:
return jsonify({'status': False, 'error': "参数错误"})
# 核心算法 生成sign签名
encrypt_string = ordered_string + "dasdsadsdasdsadsadsadsad"
obj = hashlib.md5(encrypt_string.encode('utf-8'))
sign = obj.hexdigest()
return jsonify({'status': True, 'data': sign})
if __name__ == '__main__':
app.run(host="127.0.0.1", port=5000)
参考资料
【Flask 3.1.2】3 访问 API 并直接返回结果的更多相关文章
- IdnentiyServer-使用客户端凭据访问API
情景如下:一个客户端要访问一个api,不需要用户登录,但是又不想直接暴露api给外部使用,这时可以使用identityserver添加访问权限. 客户端通过clientid和secrect访问iden ...
- Vue.js Cookbook: 添加实例属性; 👍 axios(4万➕✨)访问API; filters过滤器;
add instance properties //加上$,防止和已经定义的data,method, computed的名字重复,导致被覆写.//可以自定义添加其他符号. Vue.prototype. ...
- flask插件系列之flask_restful设计API
前言 flask框架默认的路由和视图函数映射规则是通过在视图函数上直接添加路由装饰器来实现的,这使得路由和视图函数的对应关系变得清晰,但对于统一的API开发就变得不怎么美妙了,尤其是当路由接口足够多的 ...
- Angualr6访问API
参照 草根专栏- ASP.NET Core + Ng6 实战: https://v.qq.com/x/page/a0769armuui.html 1.environment.ts 添加apiUrlBa ...
- vue中比较完美请求的栗子(使用 axios 访问 API)
vue中比较完美请求的栗子(使用 axios 访问 API) 官网地址:https://vuejs.bootcss.com/v2/cookbook/using-axios-to-consume-api ...
- Identity Server 4 原理和实战(完结)_单点登录实例(添加Flask客户端,Express.js的API)
idp授权资源的添加 如果下面哪个客户端想访问api2这个资源的话 就把它写上scope里面就可以了 nodeJS的客户端 python的库 MVC客户端分别访问API和API2 python客户端演 ...
- 访问API的方式为:localhost/api/customers, 创建自定义JSON格式化器
注意的是,访问API的方式为:localhost/api/customers,在实际中将要根据情况替换合适的端口,默认所有的WEB API都是通过/api根目录的方式访问的 创建自定义JSON格式化器 ...
- Raspbian 在虚拟机上运行,运行Flask,供宿主机访问
Raspbian 在虚拟机上运行,启动Flask,供宿主机访问 参考ref 1, 在virtualbox上跑起来Raspbian OS 参考ref 2, 在Raspbian上安装并运行Falsk, 注 ...
- 五、通过密码访问API
通过密码访问API 一.客户端 图: 客户端请求代码: static void Main(string[] args) { Console.WriteLine("确定三个项目都已经启动&qu ...
- c#后台代码请求访问api接口
前言:最近公司项目与外部api接口对接较多 ,写下自己的代码总结.介绍两种访问方式(HttpClient.HttpWebRequest) 一.HttpWebRequest 访问Api private ...
随机推荐
- LinkedList链表
LinkedList 他是继承的List 双向链表 每当我们new一个linklist对象的时候 LinkedList linkedList = new LinkedList(); 他会先创建一个Li ...
- 阿里云javascript分片上传失败的解决办法
前端项目:React + Antd mobile + 阿里云OSS Node.js SDK实现文件上传. 在电脑上运行良好,放到手机上大文件就上传失败. 打开Chrome,地址栏输入`chrome:/ ...
- 灵活、可用、高扩展,EasyMR 带来全新 Yarn 的队列管理功能及可视化配置
YARN(Yet Another Resource Negotiator)是 Hadoop 生态系统中的资源调度器,主要用于资源管理和作业调度.YARN 自身具备队列管理功能,通过对 YARN 资源队 ...
- 使用 Spread.net将 Excel 中的文本拆分为多段
引言: 在 .NET 应用程序中处理 Excel 数据时,常常会碰到需要把文本拆分成多段的情况.例如在数据清洗.数据分析等场景下,将长文本按照特定规则拆分为多段能让数据更便于处理和分析.Spread. ...
- phpstrom (xdebug)远程断点调试 homestead (纯图)
1.本地调试可以参考:https://www.cnblogs.com/LWMLWM/p/8251905.html 2.远程调试:主要是在虚拟机上如何进行 1)打开xshell ->file-&g ...
- lora无线方案
lora物联网解决方案常见的应用有2种: 一:两个串口设备的无线传输通讯,此种情况可以将两个上海卓岚的ZLAN9700(图中A设备和B设备)分别接到设备的串口,就可以将两个设备的串口数据通过LoRa网 ...
- openmesh 知道一条边的顶点id如何得到这个边的顶点id
简介 rt code 易半边为结构构成边 for(int i=0; i<mf.IN_v_pairs.size(); i++){ int a = mf.IN_v_pairs[i][0]; int ...
- POLIR-Mind-Cognition-Neural Models-NLP(Neuro-Linguistic Programming) 思维逻辑层级(logical Levels)-理解+解决问题-无敌洞察力+高维思路-{精神,身份,价值,能力,行为,环境}
Neuro-Linguistic Programming-百知思维模型-NLP理解层次 能给你无敌洞察力+高维思路 https://v.douyin.com/iS74bMKr/ 最重要的两种能力: 目 ...
- Oracle Exadata存储节点主动替换磁盘最佳实践
我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效 ...
- Ubuntu22.04在virtualbox上安装并配置远程
本文介绍使用virtualbox工具安装Ubuntu虚拟机,笔者选择使用22.04,理论上所有版本步骤都是一样. 同时安装virtualbox增强功能,Ubuntu与Windows使用粘贴.拖拽.自动 ...