【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)
浙公网安备 33010602011771号